声明:此贴为转贴!!!
Getting Started with SE Linux HOWTO: the new SE Linux (简体中文版)
(译者注:本文的最原始版本为2004年3月所写,此份HOWTO是作者在今年2月根据最新的SE Linux所作的修改后的版本。新的SE
Linux和以前的有比较大的变化,而且这项技术本身也正在飞速的发展,并未最后成熟。阅读本文是需要对Linux本身有一定深度的了解作为基础的。本文
并不是Linux的初级教程,但却是SE Linux技术的初级教程。)
原著:Faye Coker, March 2004. faye@lurking-grue.org
中文译者:邹立巍, 2006年7月
mini.jerry@gmail.com;
重要的提示!注意!
我正在根据最新的SE Linux来根本的升级这份文档。我用了很长时间来做这件事情,但是看来我似乎永远没有足够的时间作完他。我现在正在继续做,请相信我!
Faye Coker, Feb 04, 2006
(译者注:本人技术出身,英语实在比较差。翻译如有不当之处,敬请指正!)
这份文档已根据最新的SE Linux做了更改。旧的;Getting Started with SE Linux
HOWTO;的内容将保留在此份文档里,但是绝大多数的内容是根据最新的SE Linux的特点作了修改。新的SE
Linux是基于2.6.*内核的,但是仍然支持2.4.*的内核。这份文档的大部分内容是原来的,我在需要修改的地方做了调整。
这份文档是美国国家安全局的安全加强的Linux(NSA SE Linux)的概述性的说明。我们主要的环境是基于Debian
Linux的,而且大部分的软件包的操作命令实例都是基于Debian的。这份文档主要是针对那些想要基础了解SE
Linux的人,所以这里没有对SE Linux比较进介的介绍。您能够在附录的资源部分找到其他介绍SE Linux的资料。
这份文档已被Ivan Pesin翻译成了俄文。您能够在找到俄文的版本。谢谢Ivan做了这些。
目录
1. 介绍
1.1. 欢迎反馈!
1.2. 注意!
1.3. 最新的SE Linux的特色
1.4. Fedora用户的策略(policy)源代码目录介绍
2. 概览
2.1. 为什么要使用SE Linux?
2.2. 术语的使用
2.2.1. 身份(identity)
2.2.2. 域(domain)
2.2.3. 类型(type)
2.2.4. 角色(role)
2.2.5. 安全上下文(security context)
2.2.6. 转换(transition)
2.2.7. 策略(policy)
3.安装
3.1. 基于Debian的安装
3.1.1. 修改Debian包管理工具
3.2. 基于Fedora的安装
4.登录 4.1. 在登录时提供用户上下文 4.2. 用 newrole -r 命令改变上下文 4.3. 在sysadm_t域中执行命令 4.4. Permissive 和 Enforcing 模式 4.5. 不同角色运行命令的比较
5.建立用户帐户 5.1. 建立一个新的用户 5.2. 给用户分配角色和申请改变 5.3. 给用户配置缺省的安全上下文 5.4. 重新标记用户主目录
6.添加新的用户域 6.1. 编辑用户的域文档 6.2. 在此建立一个新的测试用户
7.日志文档信息的说明
8.资源
1. 介绍
这份文档是个SE Linux的简介,能够指导一部分人初步的学会SE Linux。他涵盖和解释了SE Linux
的各方面的术语,安装和添加用户并且涵盖了一小部分别的知识。一个更高级的帮助文档将会在不久发布(译者注:正在翻译中),
包含了怎样编辑策略等内容。 (which causes a little too much information overload with
users new to SE Linux and is not included here).
1.1. 欢迎反馈!
我们欢迎对这份文档的反馈信息,请发邮件给faye@lurking-grue.org (中文的就给我吧!;)mini.jerry@gmail.com)
1.2. 注意!
这份文档只是一份指导。我强烈的建议您在实际工作的机器上应用之前先找一台试验机器来做练习 。
1.3. 最新的SE Linux的特点
最新的SE Linux有一些新的特点,下面先介绍一下:
/selinux 文档系统 加入了一个/selinux 文档系统. 因此有些安装程式需要您编辑/etc/fstab 文档。 /selinux文档系统和 /proc 文档系统类似,都是虚拟的文档系统。您能够用ls -l /selinux 命令来显示。
total 0
-rw-rw-rw- 1 root root 0 Nov 25 11:27 access
-rw-rw-rw- 1 root root 0 Nov 25 11:27 context
-rw-rw-rw- 1 root root 0 Nov 25 11:27 create
-rw------- 1 root root 0 Nov 25 14:19 enforce
-rw------- 1 root root 0 Nov 25 11:27 load
-r--r--r-- 1 root root 0 Nov 25 11:27 policyvers
-rw-rw-rw- 1 root root 0 Nov 25 11:27 relabel
-rw-rw-rw- 1 root root 0 Nov 25 11:27 user
运行cat 命令查看;文档将会显示一个值,代表SE Linux当前的状态,1 代表 enforcing状态, 0代表permissive 状态。
使用了文档系统的扩展属性 新的 SE Linux使用了文档系统的扩展属性(Extended
attributes)来存放安全上下文(security contexts)。您必须让您的内核支持这种扩展属性属性。 扩展属性是个 名称?数据
元组 (name-data tuple)-- 举个例子说, security.selinux 就是个属性的名称,安全上下文(security
context)就是要存的数据。 当SE Linux正在运行时,您能够用 ls --context filename
命令来查看一个文档的安全上下文(我们将在后面进一步解释这个命令),无论SE Linux是否打开,您都能够用getfattr
命令查看文档系统的扩展属性。但是您要先装支持 attr 的软件包并且通过
getfattr命令的manpage学会使用他。这个命令的运行方法是:
faye@kaos:~$ getfattr -m . -d /etc/passwd
getfattr: Removing leading ’/’ from absolute path names
# file: etc/passwd
security.selinux=";system_ubject_r:etc_t\000";
您所查看的文档的 security.selinux 属性中储存了此文档的安全上下文, 所以上面例子中的上下文就是
system_ubject_r:etc_t 。任何运行了SE Linux的ext2/3文档系统上都有 security.selinux
这个属性(这个新特性的关键). 假如您引导了一个没有 SE Linux 的内核, 您将仍然看到这个扩展属性. 当您用make relabel
操作配置了文档的安全上下文期间,扩展属性就被setfiles 配置了。
从init加载SE Linux策略 打开了SE Linux的系统在引导时,init进程既要挂载 /selinux 文档系统,并在那之后载入SE Linux的策略。
安全ID(SIDs) 和 父进程安全ID(PSIDs) 不再使用 SIDs (安全ID) 在旧的 SE Linux 是用户进程的内核接口.
PSIDs (父进程安全ID SIDs)
是内核映射(配置)磁盘上的文档的上下文的根据(译者注:这里的概念可能不是很清楚,总的来说就是SID和PSID在旧的SE
Linux中起着标记安全上下文的作用)。 请看NSA的 Configuring the SELinux Policy 获得更多的帮助。
在新的SE Linux中, 扩展属性记录了安全上下文,所以SIDs和PSIDs 也就不必要了。
-Z 参数 -Z 能够替代 --context 命令参数,比如ls -Z 和 ps -Z.
用 chcon 命令替代了chsid命令 chsid 命令在旧的SE Linux中用来配置文档的安全上下文。新的SE Linux
中用chcon 命令来配置。 chcon 在旧的SE Linux 中已能够使用,但是在新的SE
Linux中的配置用户或类型方面得到了进一步改善。能够查看manpage 获得更多的提示。
1.4. Fedora 用户的策略(Policy)源代码目录介绍
在Debian中, 策略的源代码目录是/etc/selinux. 在Fedora
中是/etc/security/selinux/src/policy。 在这份文档中我市参照 Debian的源代码目录做的操作,
假如您是Fedora用户, 请用 /etc/security/selinux/src/policy替换。
2. 总揽
接下来是有关在什么情况下您该使用SE Linux和他的基本使用的简短介绍。 2.2 部分规定了后面章节将常使用的的术语。, 所以请熟悉他们。
2.1 为什么使用SE Linux?
SE Linux 能够为您的系统提供较棒的安全防护。 使用者能被分配预先定义好的角色,以便他们不能存取文档或访问他们不拥有的程式。
这可不是简单的 chmod 777 同等物操作。 这在角色, 或他所在的安全上下文已限制接触的文档和其他的资源的使用者定义中是不同于一般的
Unix 许可权限的,除了在一种比较受约束的流行之外。 带一个用户的.rhosts 文档在一个一般的 Unix 系统上申请。
假如他们使他成为任何人可写入 , 那么任何能登录的人都能够作危险的操作。 在 SE Linux
之下,您能控制其他用户是否有能力改变他们的.rhosts文档, 连同阻止其他的人写入 , 就算拥有者已使他成为任何人可写入。
一个通常的疑问是 SE Linux 的权限配置怎样和标准的 Unix 的权限配置共存。 当您做特定的操作的时候, Unix 权限首先被检查。
假如他们允许您的操作 , 那么然后, SE Linux 将会检查并且允许或拒绝使用者的使用。 但是假如 Unix
许可不让您做某事,在那里的运行的操作被禁止和 SE Linux 检查没关系。
另外的一个例子是,假如有一个配置了SUID的可执行文档,如/usr/bin/passwd 他能够运行命令chmod 666 /etc/shadow,SE Linux 会阻止任何人非法的这样配置文档。
2.2 术语
接下来的术语将在本文当中经常出现, 也是来自SE Linux的基本概念. It is somewhat tricky to define
one word without including the other terms so I realise my definitions
include things that need defining(译者注:这句实在不敢乱译,sorry。但是不耽误学习;-))
2.2.1 (身份)identity
在 SE Linux 中,身份的概念不同于传统的Unix uid (user id). 他们能够共存于一个系统, 但却是十分不同的概念。
在SE Linux中的身份是安全上下文的一部分,他会影响哪个域能够进入,也就是本质上的能够被执行。一个SE Linux
的身份(identity)会跟标准的Unix登录名有很相似的文本表示 (大部分情况下他们是这样),
无论怎样,了解他们是两个完全不同的概念是很重要的。 运行su 命令不会改变SE
Linux中的身份(identity)。(译者注:我在红帽系统中做的实验却不是这样,但是这无所谓,可能红帽系统的策略配置不同,我现在还没来得及研
究具体是什么问题,只是猜测。)
举例: 一个无特权用户 faye 运行 id 命令 (在启动SE Linux的情况下) 能够看到用户的安全上下文:
context=faye:user_r:user_t
安全上下文中的身份部分就是 "faye".现在, 假如 faye su转换成 root 再运行id, 他将发现安全上下文仍然是:
context=faye:user_r:user_t
身份保持相同, 跟没转换到root时相同。, 不管怎样,假如faye 身份被允许进入sysadm_r 角色并转换成了sysadm_r (这里能够使用newrole -r 命令),再运行id 命令,他将看到:
context=faye:sysadm_r:sysadm_t
身份字段保持相同但是角色和域(第二和第三字段)的字段已变了。这样保持身份的方式是用户职责所必需的。身份将影响系统决定哪个角色和域能够被什么身份所使用,这将对系统安全期决定性的作用。
2.2.2 域
任何进程都在域中运行。域直接决定了进程的访问。 域基本上是个进程允许做的操作的列表, 或说他决定了一个进程能够对哪些类型进行操作。
域就似乎一个标准UNIX的uid的概念。 假设一个属于root用户的可执行程式被配置了setuid。
在这个系统上的任何用户,只要能够执行这个程式,他就有可能获得root的权限。这是个很大的安全漏洞。 再有SE Linux的系统上,
假如一个正在执行的进程想要转换进入特权域执行时,假如这个进程的角色被配置成不允许进入特权和的话, 这个进程就不能执行。
常见的例子是sysadm_t是系统管理域, user_t 是无特权用户域。 Init运行在init_t 域, named 运行在 named_t 域。
2.2.3 类型
类型分配给一个对象并决定谁能够访问这个对象。 他的定义和域基本相同, 不同就是域是对进程的应用而类型是分配给目录,文档,和套接字的。
2.2.4 角色
角色决定了那些域能够使用。 有关哪些和能够被哪些角色使用能够预先定义在策略的配置文档里。假如一个策略数据库中定义了一个角色不能够使用一个域, 他将被拒绝。
例子: 假如允许一个属于 user_t 域 (无特权用户域) 的用户执行passwd 命令, 那么必需在相关的策略配置文档中进行如下配置:
role user_r types user_passwd_t
这样配置了一个属于user_r角色的用户允许进入user_passwd_t域。也就是说他能够执行 passwd 命令。
2.2.5 安全上下文
安全上下文包括了任何事情的属性的描述,包括文档, 目录, 进程, TCP sockets 何以上任何的东西。安全上下文包括了身份,角色和域或类型。在SE Linux系统上您能够用id 命令来查看您当前用户的安全上下文。
一件很重要的事情是我们需要明白的是域和类型是有区分的, 假如不明白这一点的话,将使您产生困惑。
域是为进程配置的。 当您查看一个进程的安全上下文的时候 (举个例子,您能够查看后面"转换"中的解释), 最后一个字段的配置,例如user_passwd_t 就是这个进程的域(假如您运行了passwd 命令)。
一个像文档,目录,套接字等这样的对象会有一个类型。 当您运行了 ls --context 命令时, 最后一个字段就是类型的配置, 比如 user_home_t 这个类型就是个有user_r 角色的用户在他的主目录下建立的文档的类型。
总的来说,域是分配给进程的,而类型是分配给除进程外其他对象的。那么在这里会有一个小小的混淆,就是/proc文档系统。我们知道/proc文档系统是
虚拟的文档系统。并且里面的以数字命名的目录就是代表了各个进程,数字就是他们的pid。那么这里假如我们用 ls ?context
显示/proc目录下的1这个目录,他会显示:
dr-xr-xr-x root root system_u:system_r:init_t 1
那么这个安全上下文中显示的类型为init_t。在这里的含义就是pid为1的这个进程的域也就是init_t 。(译者注:这样的区分不知道能不能说清楚?)
另一个需要说明的是 chsid 命令(改变安全 id) 和 chcon 命令(改变安全上下文) 不能在 /proc 文档系统上使用,就是说 /proc 文档系统不支持这种标记的改变。
文档的安全上下文是会根据创建这个文档的进程的域而改变的。默认情况下,一个文档或目录的安全上下文是从他们父目录那里继承来的,当然我们能够通过策略的改变来改变这种配置。
例子: faye用户在他的主目录下建立了一个叫做test 的文档。 运行 ls --context test 能够看到 :
-rw-r--r-- faye faye fayebject_r:user_home_t test
他又在 /tmp 下建立了一个叫做tmptest的文档,再次运行ls --context /tmp/tmptest 这次显示的是:
-rw-r--r-- faye faye fayebject_r:user_tmp_t /tmp/tmptest
第一个例子,安全上下文中的类型是 "user_home_t" 这是个user_r 角色的无特权用户默认的主目录配置。 在第二次运行了ls
--context 命令后, 您能够发现类型变成了 user_tmp_t ,这是由于执行建立文档命令的进程的域是user_t,
并且在/tmp下的文档类型要继承 tmp_t 类型。
2.2.6 转换
是否发生转换,主要要根据安全上下文来判断。有两种主要的转换。 第一种, 当您执行了一个被限定了类型的程式时会发生进程域的转换。第二种, 在特别的目录下创建文档时会发生文档类型的转换。
例子: 对于第二种转换 (文档类型的转换), 参照“安全上下文”部分中的例子。当运行了 ls --context
命令之后您会看到文档被标记成了什么样的类型(也就是上面例子中的 user_home_t
和user_tmp_t)。我们也能够看到当在/tmp下建立一个文档时,新的文档的类型为user_tmp_t。
对于进程域的转换, 请参考以下的例子。 以无特权用户的身份运行ssh, 或说我们就是运行了一个 user_t 域的进程
(您能够用id命令查看您的安全上下文)。运行 ps ax --context 查看谁在运行 ssh。 假设是用户 faye, 他将看到:
faye:user_r:user_ssh_t
这是显示的一部分。由于可执行程式的类型是 ssh_exec_t 并且我们用户的角色 user_r 允许访问user_ssh_t 域,所以ssh进程就运行在了 user_ssh_t域中。
2.2.7 策略
策略就是能够配置的规则,决定了例如一个角色的用户能够访问什么; 哪个角色能够进入哪个域 and 哪个域能够访问哪个类型等这样的问题。 您能够根据您想要建立的系统的特点来决定配置什么样的策略。
3. 安装
接下来的一章我们讲解释怎样获得软件包连同安装, 和怎样获得新的SE Linux的软件包连同安装。 因为我运行的是Debian,所以我演示的安装过程式基于他的。 我们假定您知道该怎样在您所用的发布版上安装软件, 编译内核,并且给内核打补丁。
假如您是从旧的SE Linux上升级的, 并且运行了 SE Linux kernel, 请进入permissive 模式 (用 avc_toggle 命令) 继续运行指令。
3.1基于Debian的安装
对于Debian 的研发版(不稳定版):
将下面的文字写到您的 /etc/apt/sources.list 文档:
deb ./
这个包是由 Russell Coker维护的.
在写这篇文档的时候 (2003年11月末) 还没有能够Debian上使用的稳定版的新的SE Linux 安装包。 研发版的
.deb文档能够从上面的网站获得。请确保获得了最新版本的包。 因为包的名字一直都在变,所以我没有列出, 但是他们列出了需要的任何包的名字。
下面我们列出了对于新的 SE Linux,哪些报需要在Debian上安装。在安装之前您无需引导SE Linux kernel, 所以您能够安装他们了:
• libselinux1 包含了新 SE Linux的共享库。
• selinux-policy-default 包含了范例策略文档,这个策略文档应用到了很多一般应用程式例如postfix, sendmail, X 等等。
• checkpolicy 包含了安全策略的编译器。
• policycoreutils 包含了核心工具如 setfiles, load_policy, newrole 等等。
• selinux-utils 包含了例如查询策略的操作工具。
• selinux-doc 包括了一些帮助文档 。
Debian系统所需的附加软件包列表:
• kernel-patch-2.4-lsm 一个支持LSM 和SE Linux的内核补丁。
• coreutils 包含了改进版的命令例如cp, mv, ls 。
• procps 包含了改进版的 ps and top命令。
• sysvinit 是个在引导时加载策略的补丁。
• dpkg 我们需要一个改进版的dpkg,安装之后能够确保对文档的正确标记。
• libpam-modules 因为一些安全原因。
• logrotate 一个改进版的 logrotate 能够保留一个新建文档的 SE Linux 安全上下文。
• cron 一个改进版的cron,确保计划任务执行的脚本运行在正确的域内。
3.2基于Fedora的安装
新SE Linux的RPM包能够在这里找到ftp://people.redhat.com/dwalsh/SELinux
这些RPM包的维护者是Dan Walsh.
我在我的Fedora测试机上安装SE Linux时, 我做了这些工作:
* 编辑yum.conf 文档包含如下内容:
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=fedora-release
tolerant=1
exactarch=1
[development]
name=Fedora Core $releasever - Development Tree
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/development/i386
baseurl=http://mirror.dulug.duke.edu/pub/fedora/linux/core/development/i386
[SELinux]
name=SELinux repository
baseurl=ftp://people.redhat.com/dwalsh/SELinux/Fedora
* 运行的命令进行安装
yum install policy checkpolicy policycoreutils policy-sources pam passwd vixie-cron
* 在任何包安装完之后
cd /etc/security/selinux/src/policy
make load
make relabel
*重起机器.
4. 登录
接下来的一部分描述了系统登录, 而且解释了更多的关于用户安全上下文一些内容。 本章的最后部分讨论permissive模式和enforcing模式。
4.1在登录时提供用户上下文
在这一个阶段,您应该要重新启动系统并等待那个登录的提示。当您安装了 selinux 的缺省策略包后 (Fedora上是策略的源代码包), 政策文档的安装使您能够以一个缺省用户角色登录系统。(当我们还没有没有添加一个属于我们自己的用户的时候)
以root身份正常登录您的系统。 您的安全上下文默认情况下为 root:user_r:user_t。 id 命令显示的类型和您的安全上下文显示应该是相同的,如下所示我们需要看安全上下文部分,所以不必关心其他字段):
uid=0(root) gid=0(root) groups=0(root) context=root:user_r:user_t
所以安全上下文是
root:user_r:user_t
现在我们假设您先前已把您自己的帐户配置成另外的一个角色。您能够参考 第五章: 建立用户帐户.。对于角色转变有两个方法。 第一是 ,
您登录的时候。假设使用者 faye 被认可进入 sysadm_t 域。 使用者 faye 在控制台登录。 在那 "Your default
context is faye:user_r:user_t. Do you want to choose a different one?
[n]" 这是提示, 她选择, y 并按了回车。 她将会见到如下信息:
[1] faye:user_r:user_t
[2] faye:sysadm_r:sysadm_t
Enter number of choice:
在这一个例子中, 您能见到那使用者身份 " faye" 先前已被允许访问sysadm_r 角色和 sysadm_t 域。
这里将会被显示的选项是那些您的使用者身份已被允许访问的对象。 请注意,这在旧的 SE Linux 已实现了, 而且将会在新的 SE
Linux(在写这文档的时候是不能够的) 中被配置为可配置选项, 默认的配置为关闭(OFF)。
假如用户faye 选择了选项二 ( 变成 sysadm_r) 然后运行id命令, 她将会见到安全上下文的内容为:
context=faye:sysadm_r:sysadm_t
意味着他现在是 sysadm_r 角色。
接下来是第二个改变用户安全上下文的方法。
4.2用 newrole -r 命令改变上下文
变更您的安全上下文的第二个方法将使用 newrole-r 的指令。语法是
newrole -r role
这里的role 替换您想要转换成什么角色。假设是sysadm_r。那么既能够运行:
newrole -r sysadm_r
您将会被需要为您的使用者身份提供密码, 您能够运行id指令检查。 假如您没有授权进入一个新的角色, 您将会见到这样的显示(假设使用者fred 尝试运行的指令)
fred:sysadm_r:sysadm_t is not a valid context
这一个信息意味着fred用户不能进入 sysadm_r:sysadm_t 角色:域,因为他没有被授权能够这么做。
在成功地变更角色之后, 运行id指令检查您的安全上下文。
4.3在sysadm_t域中执行命令
您的用户现在已在 sysadm_r 角色,运行的程式是在 sysadm_t 域。此时我们需要把我们的安装做的稍微完善一些, 因此让我们去虚拟的控制台并用root用户登录。 您将不被需要是否想要改变上下文。
我必须在这里说明一些事情。 我们实际上到现在为止没有在这份HOWTO 中说明怎样让root用户允许访问 sysadm_r
角色,所以您的思路可能还停在那里,root用户只允许访问user_r:user_t,这样我们怎么进行系统管理?
好吧,我们正在运行的模式是permissive,这是一种并不真正强制的执行安全策略的配置的模式。您依旧能在上面使用 newrole-r
指令换成 sysadm_r 角色。运行newrole 指令是转换的方法。
假如您试着做您不被允许的事情,您将看到一屏接一屏的错误显示信息,这并不好玩。
所以,转换成 sysadm_r 角色并且运行 id 来检查您实际的上下文是不是 sysadm_r:sysadm_t。
现在我们能在 sysadm_r 角色中得到一些乐趣。 当我们在第 3 节中安装了任何东西的时候,
当时系统上任何的文档都被标记了一个类型,但是电脑却没有在运行 SE Linux 。 因此假如一个文档在将程式分类发生之后建立的话,
并且在系统没有重新启动SE Linux的内核之前,那么那一个文档将不属于任何一种类型。想象一些文档可能在关机期间被创建。
这些文档都没有标记类型。 于是, 考虑到这一个情况。 假如您删除一个文档,那么那个文档的 inode
号可能被用来标记一个新的文档,而且这个新的文档可能是删除的那个文档的类型。 这是个严重的问题。
关于/etc/nologin 文档。 当shutdown指令被执行的时候,这一个文档产生。
假如这一个文档在引导的时候存在,只有root将会被允许登录。 假如您的启动脚本不能删除这个文档, 而且/etc/nologin 有错误的标记,
启动脚本就不能touch it,于是就会产生一些小问题。 假如您的root身份配置成在登录之后有一个 sysadm_r 的缺省角色,
那么您就能登录并且删除这一个文档,问题解决。
但是假如您已配置您的root身份在登录之后不能得到 sysadm_r 角色怎么办?
在这样的情况的下,您的root身份的上下文可能是root:user_r:user_t。但是 user_t域不允许您删除任何在
/etc目录下的文档。于是问题出现了,您能用root身份登录, 但是做不了sysadm_r 角色的特权允许做的任何事。
再次想象, 这样一种情况,您有您自己的用户身份,再一次让我们使用 " faye" 身份。 身份 faye 配置成一登录就会变成
sysadm_r角色。因此身份 faye 能执行任何的 sysadm_r 角色的事情,但是root身份 (以user_r 角色在 user_t
域中运行) 不能。 faye 用户可能有很高的权限,但是faye 身份却不行, 因为由于事实他将由于 /etc/nologin
文档的存在而不能够登录,此文档不让非root用户登录。
这就是为什么正确地将文档分类是至关重要的。 让我们回到进程被标记之后文档已建立,但是还没引导SE Linux内核的情况。 为了修复这个问题, 我们必须运行
make -C /etc/selinux relabel
这一个命令将会确定在您的系统上的任何的文档正确地被标记。 执行的速度和您的机器上有多少文档有关,这可能需要一会儿。 一个粗糙的估计,
他将会像一个‘find /’指令相同的久。 这是为什么您想要使用 newrole 指令换成 sysadm_r 然后运行指令上述make
command 命令??假如您在一个不能访问其他域的域中 (例如user_t), 您将会收到数以万计的"permission denied"
提示。
4.4 Permissive模式 和 Enforcing 模式
Permissive模式是指,您的 SE Linux 机器在本质上并没进入SE Linux 只显示相关信息的状态,
没有其他什么了。所以您仍然能够用root用户做相同的操作就像您在一部非 SE Linux 机器上相同。
Enforcing模式强制使您的任何安全策略生效。 就是说在这种模式下,您配置的任何SE
Linux的策略已生效。所以,您能够用Permissive模式来检查您的策略配置是否合乎需要。(通过检查 dmesg 信息)
这里需要强调的是:在启动到enforcing模式之前请确定您做了合适的策略配置。所以您能够在Permissive模式中运行以下来检查。
Permissive模式标记了文档, 但是不实际上运行任何事, 除非任何事情都被确认。
一些人编译了一个没有CONFIG_SECURITY_SELINUX_DEVELOP 支持的内核,那意味着您不能运行Permissive模式。
在permissive模式和enforcing模式间转变, 您需要运行echo "1" > /etc/selinux/enforce
以打开enforcing模式。将1替换成0则意味着运行在permissive模式。 旧的 SE Linux 用了在新的 SE Linux
中已不用的 avc_toggle 指令。 用cat /etc/selinux/enforce命令能够知道您正在哪种模式下运行。
您能够查看 "第七章:日志文档信息的说明",找到有关转变模式的信息提示的例子。
假如您编译的内核使用了development模式 (意味着您的机器运行在了permissive模式,并且还没有配置成enforcing模式),
您能够写一个启动脚本来转换成enforcing模式, 或在启动bootloader的时候将内核参数配置为enforcing=1 。(编辑您的
lilo.conf 文档,添加 append="enforcing=1").
4.5 不同角色运行命令的比较
我们现在会在不同的安全上下文的环境下运行一些命令。 转换到enforcing 模式。在 user_r 角色的环境下, 运行ps ax
--context 命令并观察输出信息。 别忘了 ps ax -Z 命令能够做同样的事情。 在角色为 user_r 的时候,
您能够看到那些被允许访问/proc目录的而且运行在user_t域中的进程。 假如哪个进程不能访问/proc目录, 那么哪个进程不会显示在 ps
ax 命令的输出中。
现在转换到sysadm_t 域中,运行 ps ax --context 命令。这次,
您将会见到在系统里的任何的进程,不管他们是在哪个域下运行。 当在 sysadm_t 域的时候,
您能够访问到user_t域不能够访问到的其他域的进程。 这就是问什么在 user_t
域中您不能够系统上任何的进程。想像一个恶意用户能够见到任何的系统程式。她能看到一个有安全漏洞的 daemon
在运行,于是她就能够针对这个漏洞进行攻击。 假如 user_t 域不能见到 daemon进程, 那么这样的危险会被减少。
另外一个要考虑的问题就是命令行上的密码问题。 默认的linux配置,是能够让任何人读到这样的信息的。 当 SE Linux 阻止您看见ps 输出的一个程式的信息时,他将减少这样的危险。 (当然,一个密码在命令行上显示,是个差劲的主意)。
转换回permissive 模式。 您将又会在user_t 域下用ps ax 命令看到任何的系统进程。
5. 建立用户帐户
现在来作点有意思的事情! 我们将会建立一个 SE Linux 用户并分配给他一个角色,然后为用户设定默认的安全上下文。 在旧的SE
Linux环境下, 封装程式的建立用 vipw (svipw)来配置,比如, useradd (suseradd), passwd
(spasswd), chfn (schfn) 等, 在新的 SE Linux环境下, 这些程式有其他的名称。
5.1 建立一个新的用户
我们现在建立一个新用户。我们叫他setest。
转换到 sysadm_r:sysadm_t 角色:用户。 现在用 useradd 命令添加用户setest:
root@kaos:~# id
uid=0(root) gid=0(root) groups=0(root) context=faye:sysadm_r:sysadm_t sid=398
运行id命令检查确认您的 uid 是 0 并且您的身份是在sysadm_r:sysadm_t 角色:域中。 假如您的uid是您其他似有用户的, 请先用 su 命令转换乘 root 身份, 然后运行newrole -r 命令。
root@kaos:~# useradd -c "SE Linux test user" -m -d /home/setest -g users -s /bin/bash -u 1005 setest
root@kaos:~# finger setest
Login: setest Name: SE Linux test user
Directory: /home/setest Shell: /bin/bash
Never logged in.
No mail.
No Plan.
root@kaos:~# passwd setest
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
setest 用户现在已添加完了。
5.2 给用户分配角色和申请改变
现在我们想给setest用户配置一个角色。 我们希望他能够访问user_r 角色。 需要配置的文档是/etc/selinux/users ,您现在能够用您最喜欢的编辑器打开他,并先浏览一遍。
在文档的结尾添加如下内容:
user setest roles { user_r };
这行的意思是允许 setest 用户进入user_r 角色。 假如您还希望 setest 用户还能够访问sysadm_r 角色, 您能够添加:
user setest roles { user_r sysadm_r };
我们现在要让我们的配置生效,所以我们能够在sysadm_r:sysadm_t 角色:域的情况下运行以下命令:
make -C /etc/selinux load
这将花费一段时间,这段时间里会创建策略的数据文档并用gzip 压缩。假如命令成功执行并退出, 您将看到以下提示:
Success
touch tmp/load
make: Leaving directory `/usr/share/selinux/policy/current’
在默认的角色user_r下的用户是不允许向 /etc/selinux/users 文档添加内容的。假如您想要他们能够使用 user_r
之外的一个用户角色或让他们能够改变他们自己的密码,就要他们加入这一个文档,或在 SE Linux 的记录信息的适当部分添加他们的用户名。
现在我们来配置一个缺省的安全上下文。
5.3 给用户配置缺省的安全上下文
在向 /etc/selinux/users文档添加完新用户之后, 缺省的安全上下文必须要再登陆的时候被指定。配置文档是/etc/security/default_context 。您将看到如下信息:
system_r:local_login_t user_r:user_t
当一个用户从本地登陆的时候 (或说从控制台登陆), /bin/login 程式会在local_login_t 域中运行并分别地分配一个用户角色是 user_r 和域为 user_t 。
假如显示的是:
system_r:local_login_t sysadm_r:sysadm_t user_r:user_t
那么用户登录时允许进入sysadm_t 域, 那么他就将以 sysadm_t 域的身份登录进来。 假如不允许, 就会使用user_t域。
请看这一行:
system_r:sshd_t user_r:user_t
这意味着任何铜壶 ssh登录的用户将使用 user_r:user_t 角色:域。
5.4 重新标记用户主目录
假如您已用 useradd 添加了一个角色为 user_r的新用户, 那么那么您需要仔细的改变他已有的标记。 假如用户角色不是user_r, 那么您就不能重新标记,于是您必须运行以下命令:
find /home/setest -print0 | xargs -0 chcon -h system_ubject_r:user_home_t ;\
chcon -h system_ubject_r:user_home_dir_t /home/setest
这一个命令使任何在/home/setest目录下的文档都运行了 chcon命令(变化文档安全上下文) 改变了文档的安全上下文。
用户主目录被标记成类型为 user_home_dir_t ,而且在户主目录下的文档都被标记成类型为 user_home_t 。
有时,一个程式可能被允许访问一个用户主目录, 但是不能访问何再此目录下的文档, 两种不同的类型由此而来。
6. 添加新的用户域
现在让我们建立一个我们自己的用户域, 并把他叫做second_t 。 我们也将会建立一个新的角色叫做second_r 。
要建立second_r 角色首先在前面的部分(刚刚分配了 user_r 角色并且并不真正建立这样的用户) 中一步一步跟着作,但是不要运行第
5.2 节中的make命令。在您已编辑 /etc/selinux/user之后,回到这里并且继续下一部分,关于编辑使用者领域文档的部分。
关于为什么我不想要您运行make指令的原因,是因为早先的部分刚刚分配了缺省的一个 user_r 的角色。 但是我们将会建立一个新的角色,而且同样地我们需要一个新的域和他搭配。以下部分进行概略说明。
6.1编辑用户的域文档
用户域的配置文档是 /etc/selinux/domains/user.te 。请先看一遍。 添加以下几行:
full_user_role(second)
allow system_r second_r
allow sysadm_r second_r
在文档的什么位置添加是无所谓的,在上面添加注释:
# if adding new user roles make sure you edit the in_user_role macro in
# macros/user_macros.te to match
再来编辑 /etc/selinux/macros/user_macros.te 文档进行匹配。 打开此文档并找到 in_user_role (差不多在文档的结尾)这行。添加 "role second_r types $1;" 现在这部分文档应该像这样:
undefine(`in_user_role’)
define(`in_user_role’, `
role user_r types $1;
role second_r types $1;
’)
回到我们编辑的第一个文档 (full_user_role(second)),
这样我们就建立了second_t域和second_home_dir_t类型连同 second_home_t
类型(用户主目录的类型和主目录里文档的类型)。一个 second_tmp_t类型 ,当在/tmp目录下建立文档时。 类型
second_tmpfs_t是在tmpfs中共享内存文档系统中建立文档的上下文。 最后,second_tty_device_t和
second_devpts_t类型分别被用来标记终端设备(tty)和虚拟终端设备。当然也建立了相应的策略应用于这些标记。
SE Linux内部并不支持任何类型的标定, 连同类型/域的继承,等。当然策略语言的编写也不支持这些特征。 所以我们用M4宏编译器来配置简单的域和类型。
我们现在来建立一个用户在这个新域中使用 (second_t)并访问 second_r 角色。
6.2再次建立一个新的测试用户
使用 useradd, 建立一个新的用户。(让我们假设用户叫做 " spike" 把spike加入 /etc/selinux/users 只给予他对 second_r 角色的访问权和没有其他权限。 然后运行
make -C /etc/selinux load
应用新的策略。
接下来是配置缺省域和新的角色。 我们能够编辑 /etc/security/default_type 文档并添加以下行:
second_r:second_t
我们现在必须手动设定/home/spike 和他的上下文。useradd ,命令不会做这些事情,他只支持重新标记用户的 user_r 角色。 运行下面的命令:
find /home/spike -print0 | xargs -0 chcon -h system_ubject_r:second_home_t ;\
chcon -h system_ubject_r:second_home_dir_t /home/spike
现在试着用spike用户身份登录。
7. 日志信息的说明
接下来介绍提示的说明信息。我将解释每部分信息的意义。 对于比较容易的部分,我会直接在输出的内容上标记出来。
有些时候,日志信息不会以您喜欢的形式清楚的表达出来, 所以我们首先要清除 ReiserFS 和Ext2/Ext3 文档系统(SE Linux支持的文档系统) 的root inode 是2。
XFS 文档系统和 JFS 文档系统现在正在测试中。
例 1
avc: denied { getattr } for pid=6011 exe=/usr/bin/vim path=/etc/shadow dev=03:03 ino=123456 \
scontext=faye:user_r:user_t tcontext=system_ubject_r:shadow_t tclass=file
这一个例子显示的是,在enforcing模式时一个无特权用户(faye) 尝试编辑 /etc/shadow文档的显示信息。
"avc: denied" 意味着这样的操作被拒绝。 "{ getattr }" 意味着有人对文档使用 stat()函数。 在这个操作中,必须首先查看文档的属性 (或说至少要查看文档属性), 假如不能查看,于是停止操作。
braces {}里的内容包含了操作的动作,或说是SE Linux正在做的有关操作。 SE Linux 能够做出包括allow和deny两种检查结果, 在这个例子中检查的结果是被拒绝, 并通知您您想要的操作被拒绝。
"for pid=" 您操作的进程的pid。 "exe=/usr/bin/vim" 是您执行的命令 (在这个例子里,执行的是vim)。
"path=/etc/shadow" 实行要操作的目标文档路径。 "dev=03:03" 是跟此操作有关的文档系统所在的块设备的设备号。
第一个 "03"(主设备号) 意思是使用了 hda ,第二个 "03" 是 3(辅助设备号或从设备号), 所以这个"dev=03:03"
就意味着 /dev/hda3 (假如您在 devfs
上运行那么应该是/dev/ide/host0/bus0/target0/lun0/part3). 当SE Linux 核查权限的时候
他并不知道您要操作的对象的完整路径所以他不能记录任何事情。他只知道文档系统的相关路径, 和文档系统所在块设备的设备号。 比如说我们要访问的
/etc/shadow. SE Linux 并不知道这个文档在根目录下。他仅仅知道 /etc/shadow 所在的文档系统。
"ino=123456" 目标的 inode 号 (这个例子中的目标是 /etc/shadow)
"scontext=faye:user_r:user_t"
操作动作来源进程的上下文"tcontext=system_ubject_r:shadow_t" 操作对象的安全上下文
(/etc/shadow)。 "tclass=file" 意味着目标对象是个文档。
Example 2
avc: granted { avc_toggle } for pid=6073 exe=/sbin/avc_toggle \
scontext=faye:sysadm_r:sysadm_t tcontext=system_u:system_r:kernel_t tclass=system
"avc: granted"意思是您的操作被允许正常运行。 "{ avc_toggle }" 表示您的程式调用了 avc_toggle()系统调用。 "tclass=system" 表示目标程式属于system class。
例 3
avc: denied { append } for pid=6153 exe=/bin/bash path=/.bash_history dev=03:03 ino=498 \
scontext=faye:user_r:user_t tcontext=fayebject_r:root_t tclass=file
这条提示是说属于user_r:user_t 角色:域的faye身份的用户想要在属于 root的类型为root_t .bash_history 文档里添加内容被拒绝。
例 4
avc: denied { write } for pid=605 exe=/bin/touch dev=09:03 ino=2 \
scontext=root:user_r:user_t tcontext=system_ubject_r:root_t tclass=dir
这个例子显示的是路径很难找到。然而我们能够知道的是因为inode号是2,所以是根目录。
8. 资源
在下面是和SE Linux 的相关的链接材料。 请参照NSA 的白皮书。
NSA 官方网站
NSA的官方SE Linux 网站:
官方SE Linux FAQ在: /info/faq.cfm
NSA 出版的文档, 技术上的报告在 /info/docs.cfm
邮件列表
NSA 为任何有关 SE Linux 的讨论建立了一个邮件列表/list.html ,相同的网址上也说明了该怎样获得目录文档。
SE Linux的Sourceforge项目
SE Linux的Sourceforge 在: http:/sourceforge.net/projects/selinux.
Fedora Core 2 SE Linux FAQ
Karsten Wade 已为在Fedora Core 2上使用SE Linux的用户写了一份 FAQ ,能够在下面地址上找到:
阅读(1062) | 评论(0) | 转发(0) |