首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

SELinux 中基于角色的访问控制(3)

SELinux 中基于角色的访问控制(3)

使用 Fedora Core 8Fedora 8 默认启用了 SELinux。它集成了全新的 SELinux 技术,使用可装载策略模块简化策略定制并使用 semanage 简化用户和 RBAC 管理(Semanage 用于配置 SELinux 策略的某些元素,而无需对策略源代码进行修改或重新编译)。
让我们首先执行一次默认安装。首先下载 Fedora-8-i386-DVD.iso(请查阅下面的  中的链接)。为了方便起见,您可以将其重命名为 f8.img。您将使用它作为 cdrom 映像以将 Fedora 8 安装到 qemu 下:
1
2
dd if=/dev/zero of=f8.img bs=1G seek=10 count=1
qemu -hda f8.img -cdrom f8.iso -boot d -m 1024 -vnc 3




然后,启动 VNCviewer:
1
vncviewer :3




在 VNC 窗口中,遵循几乎全部的默认安装设置,惟一的例外是:当询问要安装的包时,请取消选中 “Office and Productivity”,然后选中 “Software Development”。
安装完成后,在重新启动后继续遵循设置说明并选择要创建的非根用户帐户。最后,当映像就绪后,以该用户身份登录。
打开本文的浏览器窗口并下载 Fedora 8 的源 tarball(请查阅  中的链接)。把它保存到主目录中的 ~myuser/cash_register_f8.tgz。
在左上角的 “Applications” 菜单中,选择 System Tools > Terminal。然后键入 su - 并输入根用户密码以打开根用户 shell。现在您已经准备好安装安全的收银机结算系统。
(注:如果无法忍受系统过慢的显示速度,您可以通过输入 runlevel 3 来退出 X 窗口。您可以通过键入 /sbin/init 3 来完成这项操作。您始终可以通过使用 /sbin/init 5 重新输入 runlevel 5 来重新启动 X 窗口。在 runlevel 3,只需在终端以根用户身份登录)。
首先,强制退出后台守护进程,以便您可以手动运行 yum:
1
killall -9 yum-updatesd




接下来安装 SELinux 策略模块开发包:
1
yum install selinux-policy-devel.noarch




现在复制示例策略模块目录,把收银机策略文件复制到示例目录中,然后编译这些文件:
1
2
3
4
5
6
7
cd /usr/share/selinux/
cp -r devel cash_register
cd cash_register
rm example.*
tar zxf ~myuser/cash_register_f8.tgz
mv register.py /bin
make




策略被编译成 cash_register.pp 文件中的二进制策略模块。要装载它,请执行以下代码:
1
semodule -i cash_register.pp




接下来,创建用户 mary 和 bob:
1
2
3
4
adduser bob
adduser mary
passwd bob
passwd mary




现在用户已经存在,请设置 RBAC 以将这些用户登录到相应的角色中:
1
2
3
4
5
semanage user -a -R cashier_r -P cashier bob_u
semanage login -a -s bob_u bob

semanage user -a -R mgr_r -P mgr mary_u
semanage login -a -s mary_u mary




semanage user 命令将创建一个新 SELinux 用户。SELinux 用户不是 Linux 用户名,而是附加到进程和文件的 SELinux 上下文(由 id -Z 返回)的一部分。如果在终端中键入 id -Z,您可能会看到 system_u 或 unconfined_u。虽然 Linux 用户名和 SELinux 用户名可能相同,但是它们本身并没有联系。但是,登录进程将使用 Linux 用户名来为安全上下文选择 SELinux 用户。如上一节所述,SELinux 用户被限定到可以关联的角色中,同样,SELinux 角色被限定到关联的 SELinux 域(类型)中。
您将使用 semanage user 创建两个 SELinux 用户 mary_u 和 bob_u。同时,您将指定这两个用户可以关联的角色。用户 bob_u 只能使用 cashier_r 角色,而 mary_u 只能使用 mgr_r。您还必须为用户的主目录类型指定一个前缀。对于 Mary,请指定 mgr,并且将主目录扩展为 mgr_home_dir_t,并将 mgr_home_t 用于该目录中的文件。
semanage login 命令将把 Linux 用户名与 SELinux 用户绑定在一起。指定 mary 将以 mary_u 的身份登录,bob 将以 bob_u 的身份登录。
我们仍然需要为收银机值创建基本目录结构:
1
2
3
4
5
6
7
mkdir /data
mkdir /data/final
mkdir /data/cashier_r
mkdir /data/mgr_r
chmod 777 /data/cashier_r
chmod 777 /data/mgr_r
chmod 777 /data/final




最后,为新用户重新标记已创建和已安装的所有文件以及主目录:
1
fixfiles -f relabel /data /bin/register.py /home




注意这一次我们并未在策略中定义 SELinux 用户。而是用 semanage 命令创建了用户并把这些用户与相应的角色关联起来。
如果只希望允许 bob 以 cashier_r 的身份登录而 mary 以 mgr_r 的身份登录,那么不需要进行什么修改。但是,您可能需要让用户 charlie 能够以 mgr_r 或 cashier_r 的身份登录。这样做将要求进行更多更改。首先,创建用户:
1
2
3
4
adduser charlie
passwd charlie
semanage user -a -R mgr_r -R cashier_r -P mgr charlie_u
semanage login -a -s charlie_u charlie




现在告诉 PAM 应当询问 charlie 想要以哪个角色的身份登录。首先,打开 /etc/pam.d/login 并把下列行:
1
session required pam_selinux.so open




替换为:
1
session required pam_selinux.so open select_context




这样做将告诉 pam_selinux.so 模块用户应当能够在登录时选择默认上下文。接下来,告诉系统要为角色 charlie_r 使用的默认类型。在登录时,系统将允许 Charlie 指定角色而不使用默认值(mgr_r,因为我们把它列在 semanage user 命令中的第一位)。可供选择的选项是您在创建用户时用 -R 标志指定的所有角色。SElinux 随后将使用与被请求角色相关的默认类型,因此您必须为 cashier_r 指定一个默认类型:
1
2
echo "cashier_r:cashier_t" >> \
      /etc/selinux/targeted/contexts/default_type




现在当 Charlie 登录到控制台(或者按 Ctrl-Alt-F2 组合键登录到控制台,或者如前述输入 runlevel 3)时,系统将询问他要以哪个角色的身份登录。默认值将是 mgr_r,但是他也可以选择进入 cashier_r。如果他选择 cashier_r,他将能够以收银员的身份存储值,但是根据已经定义的策略,他不能够读取 Charlie 主目录中的任何文件。
注意,register.py 不对 Charlie 以经理和收银员的身份为自己的收银机存储的值进行保护。当然,这样的更改将十分容易实现。
返回列表