|
一个域中的进程要转移到另一个域中,需要通过执行一个具有新域“入口点”类型的应用程序。SELinux 策略里使用 “入口点” 权限控制哪个应用程序可以进入一个域。下面演示这依情况:
1. 比如一个用户希望改变自己的密码,那么它会执行 /usr/bin/passwd 这个程序,我们先来查看一下该程序的类型:[root@groad.net ~]# ls -Z /usr/bin/passwd
-rwsr-xr-x. root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd 由上可见,它的类型为 passwd_exec_t 。
passwd 这个工具是需要访问 /etc/shadow 这个文件的,该文件的类型被标以 shadow_t 类型:[root@groad.net ~]# ls -Z /etc/shadow
----------. root root system_u:object_r:shadow_t:s0 /etc/shadow
2. SELinux 策略规则已经声明过,一个运行在 passwd_t 域的进程允许读和写被标记为 shadow_t 类型的文件。shadow_t 类型仅仅用在需要修改密码的文件上,如 /etc/gshadow, /etc/shadow 以及它们的备份文件。
3. SELinux 策略规则还声明了 passwd_t 域具有 passwd_exec_t 类型的“入口点”权限。
4. 当一个用户运行 /usr/bin/passwd 这个程序时,用户的 shell 进程将转移到 passwd_t 域中。对于 SELinux 来说,默认的动作都是禁止的(如这里的修改密码),假如说 SELinux 策略数据库中没有这么一条允许的规则,那么改变密码将失败;然而在策略数据库中已存在一条规则并声明允许运行在 passwd_t 域中的应用程序可以访问标记以 shadow_t 类型的文件,因此 passwd 这个命令就允许访问 /etc/shadow ,然后用户的密码得意修改。
上面的例子并不完全说明整个问题,但它用来解释域的转移基本原理却是足够的。尽管有一条实际的规则允许运行在 passwd_t 域的程序可以访问标记以 shadow_t 文件类型的对象,但在转移到新域之前,也要求满足其他的 SELinux 策略规则。在这个例子里,TE (Type Enforcement,类型的强制实施)可做有如下保证:
passwd_t 域仅能被标记以 passwd_exec_t 类型的应用程序所进入;仅能执行授权的共享库(标记以 lib_t 类型);不能执行任何的其他应用程序。
只有授权过的域,如 passwd_t ,可以写标记以 shadow_t 类型的文件,即使是以超级用户权限运行的其它进程也不能写入该类型文件,因为它们并没有运行在 passwd_t 域中。
只有授权过的域可以迁移到 passwd_t 域。比如,sendmail 进程运行在 sendmail_t 域就没有合法的权限来执行 passwd 命令;因此,它也就永不会迁移到 passwd_t 域中。
运行在 passwd_t 域中的进程可以读写授权的类型,比如标记以 etc_t 或 shadow_t 类型的文件。这样就阻止了 passwd 这个程序被骗去读写恶意的文件。 |
|