Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->Linux技术 ->发行版专区 ->Gentoo ->构建一个 SELinux 就绪的 Gentoo 系统
  相关分类: 
CentOS
ubuntu
turbolinux
Suse
slackware
Redhat
Mepis
mandriva
Mandrake
knoppix
Gentoo
Fedora
Debian
红旗
  站内搜索: 
热门文章排行
热门文章排行 Gentoo版Linux操作系统的前世今生(04-11)
新手安装Xentoo(Xen+Gentoo)的极速体(04-22)
磨炼Gentoo的锋芒之十步骤实现基本安(04-11)
Bash 实例-探讨Gentoo ebuild系统 (04-22)
构建一个 SELinux 就绪的 Gentoo 系(04-22)
精采文章排行
精采文章排行 Gentoo 下LAMP 的安装和(05-05)
一步一步教你装linux:gentoo从装笔(05-05)
Gentoo Linux 1.4_rc4版本安装说明(05-05)
Gentoo 下LAMP 的安装和配置 (04-22)
新手安装Xentoo(Xen+Gentoo)的极速体(04-22)
  · 一步一步教你装linux:gentoo从装笔记· Gentoo Linux 1.4_rc4版本安装说明·Gentoo 下LAMP 的安装和配置 ·新手安装Xentoo(Xen+Gentoo)的极速体验 ·构建一个 SELinux 就绪的 Gentoo 系统 ·Bash 实例-探讨Gentoo ebuild系统 ·SPARC中怎么样安装Linux系统(Gentoo) ·《Gentoo Linux 发行版》(Gentoo Linux)[·Gentoo系统下LAMP的安装和配置简介

构建一个 SELinux 就绪的 Gentoo 系统

作者:Serge E. Hallyn    来源:IBM DW   点击:   日期:2007-04-22 [收藏] [投稿]

  IE是否经常中毒?推荐您

wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2
tar jxf Linux-2.6.14.tar.bz2

然后,切换到 Linux-2.6.14 目录,并对内核进行配置,如下所示:

cd linux-2.6.14
make defconfig
make menuconfig

确保至少启用以下选项:

清单 4. 内核 .config 文件节选

CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_SECURITY=y

CONFIG_SECURITY=y
CONFIG_SECURITY_CAPABILITIES=y
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1


现在使用下面的命令来编译内核:

make
cp arch/i386/boot/bzImage ..

当然,在转换到 SELinux 之前,我们首先需要对系统进行测试。这可以使用下面的命令来实现:

qemu -hda gentoo.img -kernel bzImage -append "ro root=/dev/hda1"

四处浏览一下,添加几个用户,在系统中玩耍一阵。完成之后,使用 poweroff 命令关闭系统。现在,我们已经准备好将这个系统转换成 SELinux 了。


转换成 SELinux

要将这个系统转换成支持并启用 SELinux 的系统,我们需要修改开始引导系统的程序 /sbin/init,并添加另外几个软件来构建 SELinux 策略及与 SELinux 进行交互。

SysVinit

开始我们可以使用一个干净的 SysVInit 拷贝。从 ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-2.86.tar.gz 下载 2.86 版本,或者在 freshmeat 上寻找 SysVinit 页面 上的最新版本。我们可以使用后文中 下载 一节所给出的链接以 zip 文件的形式来下载补丁 (sysvinit-init.c.diff);这个补丁可以使用清单 5 中的过程应用于文件 init.c。这个补丁会在系统引导时加载 SELinux 策略。它引入了一个标志 no_selinux,如果引导命令包括了 -p 选项,这个标志就被设置为 1。如果这个标志被设置了,那么就会给出一条警告消息,然后像正常方式一样引导。否则就调用函数 load_policy(),这个函数是在这个补丁中定义的。

清单 5. 对文件 init.c 应用补丁

wget ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-2.86.tar.gz
cd sysvinit-2.86
cd src
patch -p0 < $ORIG/sysvinit-init.c.diff
make init
(su)
mount -oloop,offset=32256 $ORIG/gentoo.img /mnt
mv /mnt/sbin/init /mnt/sbin/init.good
cp init /mnt/sbin/init
umount /mnt
exit


函数 load_policy() 会将 selinuxfs 文件系统的一个实例加载到 /selinux 目录中,并打开文件 /etc/policy.bin 准备读取内容。注意,/selinux 和 /etc/policy.bin 都是强制使用的名字,这样任何希望使用它的用户空间工具都可以遵守这种命名方式。在编译 SELinux 策略时,我们需要将二进制版本拷贝成 /etc/policy.bin。接下来,load_policy() mmap() 会对文件 /etc/policy.bin 进行映射操作,并调用 security_load_policy,这是在 load_policy 上面定义的。它会依次打开文件 /selinux/load(这是 selinuxfs 文件系统中的一个文件)来写入内容,并将 /etc/policy.bin 的所有内容都写入到 /selinux/load 中。这就是二进制策略在引导时怎么样加载到内核中的。

创建策略

SELinux 是一个灵活的访问控制系统,其访问决策都是由管理员定义的策略来决定的。这些策略依赖于系统中文件的布局和配置。支持 SELinux 的发行版提供了预定义的策略,可以灵活地排除与系统中没有安装的软件有关的策略。然而在本练习中,我们可以定义自己的策略。

由于新对象类和权限不是同时引入的,因此策略最终对内核版本会有一定的依赖。mdp.tar.gz (后面 下载 一节中的 zip 文件)中的程序会根据内核版本号自动构建一个空策略。由于这需要对内核进行分析,因此我们需要向其指出用来为 QEMU 映像编译内核所使用的源代码树。将 mdp.tar.gz 解压到 $ORIG/ 中,并进入结果目录 mdp/。

输入:

./build.sh -k ../linux-2.6.14.

这会编译程序 mdp,并使用内核目录作为一个参数来运行它。mdp 接着会查看内核所了解的对象类和权限,并创建一个包含数据的 SELinux 策略。所生成的策略有一个 SELinux 用户、一个 SELinux 角色以及一个 SELinux 类型。单个类型可以应用于所有的文件、内核对象和进程,它对自己具有完全的访问权限。后面我们会对这个策略进行定制,但是现在它可以用来进行初始化并使用 SELinux。

当 build.sh 运行 mdp 时,它会创建几个文件。我们需要 policy.conf 和 file_contexts。第一个是策略的文本表示,后一个是怎么样标记文件系统的一些指示。

现在我要将对 policy.conf 的全面学习推迟到后面,因此我们暂时跳过前面 500 到 600 行代码,直接跳到下面这行:

type base_t;

这是该策略中所定义的惟一一个类型。下面这行代码:

role base_r types { base_t };

定义了一个角色 base_r,它与 base_t 类型关联在一起。这意味着角色 code_r 中的一个进程可能会在域 base_t 下面运行。接下来是一些长长的 allow 语句,每个语句指定了一个对象类,这为 domain base_t 下面的进程提供了对为该类定义的所有权限来访问 base_t 类型的对象类的能力。

接下来,策略会定义一个用户 user_u,它与角色 base_r 建立了关联。作为 SELinux 用户 user_u 运行的进程可以在 base_r 角色下面运行。我们早已看到 base_r 是与 base_t 类型关联在一起的,因此这两个语句一起使 user_u:base_r:base_t 成为一个有效的上下文,这意味着允许进程在这个上下文中运行。

下面几行代码也非常有用。首先:

sid kernel user_u:base_r:base_t

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页 1 23 4 下一页

上一篇:Bash 实例-探讨Gentoo ebuild系统   下一篇:新手安装Xentoo(Xen+Gentoo)的极速体验
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

   相关文章:
· Gentoo 下LAMP 的安装和配置

   文章评论:(1条)
  
 请留名: 匿名评论   点击查看所有评论 论坛讨论
 

 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。