来自的一页Fedora 文档使用以下示例描述 SELinux 上下文问题:
“...管理员不想使用 /var/www/html/ 作为网站,而是想使用 /srv/myweb/。... [但是] SELinux 阻止 Apache HTTP 服务器 (httpd) 访问 [标记错误的文件和目录]”
任何遇到 SELinux 问题的人都知道,SELinux 对错误消息没有帮助。找到正确上下文的一种方法是使用matchpathcon
(从页面下方开始)
matchpathcon 命令检查文件路径的上下文并将其与该路径的默认标签进行比较。以下示例演示了如何在包含错误标签文件的目录中使用 matchpathcon:
$ /usr/sbin/matchpathcon
-V/var/www/html/*
/**编辑:根据要求,使用 httpd 的示例上下文,matchpathcon
报告公共 www 目录内容的用户、角色和类型如下:
[root@mrwizard ~]# /usr/sbin/matchpathcon /var/www/html/*
/var/www/html/info.php system_u:object_r:httpd_sys_content_t:s0
如果--这只是一个例子,并不是该命令的正确用法--如果你对 httpd 的二进制文件执行相同的命令,你会发现类型不是 httpd 内容类型,而是 httpd 执行类型,我猜,SysV(在 CentOS6 上)用于启动 httpd:
[root@mrwizard ~]# /usr/sbin/matchpathcon /usr/sbin/httpd /usr/sbin/httpd system_u:object_r:httpd_exec_t:s0
输出matchpathcon
是不对称的;它无法帮助管理员以服务作为输入来排除 SELinux 用户、角色和类型的故障,从而获得 SELinux 默认上下文作为输出。**/
如果 matchpathcon 检查了正确配置目录,在服务上使用的逆向程序是什么?换句话说,是否有反向检查/usr/sbin/httpd
?
我问这个问题是出于谨慎。当服务器正常工作而现在出现故障时,这个步骤似乎很有用。但是,如果您正在安装系统,并在安装初期决定将某些东西放在错误的位置,那么正确的 SELinux 上下文目录可能不存在。对吗?那么除了服务之外,您还会检查什么来发现正确的 SELinux 上下文?
答案1
我将使用该passwd
程序来解释其中的许多内容。
要在 DAC(标准 UNIX 访问控制模型)的背景下明确回答这个问题:
您如何从文件中找出我最终可能运行二进制文件的主题?
答案是,运行ls -l /bin/passwd
,检查 setuid 位是否已设置。如果已设置,您将以文件所有者的身份运行该程序,如果没有,您将以您自己的用户身份运行该程序。
要在 SELinux 的背景下明确回答这个问题:
您如何从文件中找出我最终可能运行二进制文件的主题?
嗯,事情没那么简单,因为它取决于WHO当您尝试运行二进制文件时,您就会知道!幸运的是,该sesearch
实用程序对于检查此情况下的策略可能是什么非常方便。我们可以要求它告诉我们在运行标记为的对象时可能发生的所有转换httpd_exec_t
。
由此得出
$ sesearch -T -c process -t httpd_exec_t
Found 14 semantic te rules:
type_transition system_cronjob_t httpd_exec_t : process httpd_t;
type_transition crond_t httpd_exec_t : process httpd_t;
type_transition certwatch_t httpd_exec_t : process httpd_t;
type_transition initrc_t httpd_exec_t : process httpd_t;
type_transition dirsrvadmin_t httpd_exec_t : process httpd_t;
type_transition kdumpctl_t httpd_exec_t : process httpd_t;
type_transition cluster_t httpd_exec_t : process httpd_t;
type_transition logrotate_t httpd_exec_t : process httpd_t;
type_transition condor_startd_t httpd_exec_t : process httpd_t;
type_transition cobblerd_t httpd_exec_t : process httpd_t;
type_transition openshift_initrc_t httpd_exec_t : process httpd_t;
type_transition piranha_pulse_t httpd_exec_t : process httpd_t;
type_transition init_t httpd_exec_t : process httpd_t;
type_transition svc_run_t httpd_exec_t : process httpd_t;
因此事实证明,就您而言,实际上有很多不同的主体可以做到这一点,它们最终都进入 httpd_t 域。
但现在情况总是如此:-
$ sesearch -T -c process -t ssh_exec_t
Found 8 semantic te rules:
type_transition virsh_t ssh_exec_t : process virsh_ssh_t;
type_transition sge_job_t ssh_exec_t : process sge_job_ssh_t;
type_transition ajaxterm_t ssh_exec_t : process ajaxterm_ssh_t;
type_transition nx_server_t ssh_exec_t : process nx_server_ssh_t;
type_transition sysadm_t ssh_exec_t : process ssh_t;
type_transition staff_t ssh_exec_t : process ssh_t;
type_transition condor_startd_t ssh_exec_t : process condor_startd_ssh_t;
type_transition user_t ssh_exec_t : process ssh_t;
此可执行文件针对不同的主体执行不同的转换。因为我们知道virsh_t
应该只在 SSH 中执行一组非常具体的事情,所以它会进入virsh_ssh_t
转换,这比转换到 的人受到的限制更多ssh_t
。
我在下面的转换主题上添加了一个相当长的答案,以便人们能够了解 SELinux 正在尝试解决什么问题以及它如何尝试解决这些问题。
在 DAC (Unix) 和 MAC/TE (SELinux) 中的用户之间移动
让我们定义一些术语以使其更有意义。
- 主体:操纵系统中项目的参与者。这通常是用户或进程。
- 对象:正在执行的操作。可以是很多东西(文件、目录、端口)
- 过渡:从一个主题转变为另一个主题的行为。
在我们回答如何在 SELinux 类型执行中实现这一点之前,请先考虑如何在 DAC(自主访问控制;标准 UNIX 安全模型)中实现这一点。
在 Unix 安全模型中如何工作
在 DAC 中,主题主要是 UID,但是 GID 和补充 GID 也定义了一个主题。对象是文件、目录、unix套接字,并且主要通过它们的路径引用(尽管也存在一些例外,例如IPC共享内存)。
通常情况下,当你运行一个程序时,没有过渡。用户jim
想要运行/bin/cat
。当他这样做时,该进程被实例化并继承 的主体jim
以及其主体的任何其他属性(GID、补充组等)。
但是,有些程序运行时会发生转换。当用户jim
运行passwd
命令时,jim
会转换为root
,这当然是更改影子文件所必需的。
这种自动转换行为是通过翻转文件系统权限中的 SUID 位来控制的,通过将磁盘上可执行文件的所有者设置为您想要转换到的目标主体来定义您转换到谁。
因此,为了清楚起见,passwd
示例中的权限模式jim
为root
4755 且所有者为root
。
因此,setuid 在标准 unix 访问控制模型中执行转换。
不幸的是,setuid 程序有着可怕的安全问题历史。这是由于 DAC 安全模型在转换评估方式方面的限制。
setuid 转换过程不对调用程序的主体(用户)进行检查。如果jim
和调用,它们都将与 一起betty
转换为。root
apache
mysql
nobody
passwd
不可能(没有程序本身的检查,我们都知道这是多么可靠)在jim
调用时passwd
转换到root
,但在betty
调用 passwd 时不转换到root
。你唯一能做的就是首先使用 POSIX ACL彻底拒绝betty
调用,但这并不细致。passwd
也不可能(除非应用程序执行此操作并且没有执行此操作的权限)让文件所有者成为您想要转换到的人员以外的其他人。因此betty
无法运行passwd
并成为用户bin
而不是root
。
SELinux 安全模型中的工作原理
这主题在 selinux 中,由用户或进程正在运行的标签类型来引用。例如,这可能是user_t
,unconfined_t
或者。httpd_t
对象是文件、目录、套接字等,就像在 DAC 中一样,也是按其类型引用,并且也有标签。,httpd_exec_t
是SELinux 使用的不同对象标签的示例。user_home_t
mysql_port_t
正常情况下,就像在 DAC 中一样,不会发生转换。如果user_t
执行/bin/cat
(或者按照 SELinux 的看法,如果user_t
执行一个对象),它将被实例化并从调用者那里bin_t
继承主题。user_t
但是,有些程序在调用时会发生转换。如果user_t
执行标记为 的对象passwd_exec_t
(不出所料/bin/passwd
),则转换为passwd_t
。
这是在类型转换规则中定义的,其策略如下所示:
type_transition user_t passwd_exec_t:process passwd_t;
在 SELinux 中,为了发生转换,需要进行以下评估。
- 想要转换的主体 (user_t) 是谁?
- 哪个对象被引用(passwd_exec_t)?
- 旧主体想成为什么新主体(passwd_t)?
因为我们在允许请求之前会考虑谁在执行请求,所以我们可以更明智地决定谁可以做什么。
httpd_t
永远无法成为passwd_t
并且随后永远无法访问影子文件。- 我们可以
guest_t
在 SELinux 中为 betty 指定一个主题,这样她就永远不会成为passwd_t
。
事实上,这还不是我们评估的全部内容。在允许过渡之前,我们还会提出更多问题。
- 主体所处的角色是否包括要转变的目标?
- 是否允许主体真正地执行该
passwd_exec_t
文件以达到转变的目的? - 是否允许任何人
passwd_t
通过执行标有的文件对象来转换passwd_exec_t
? - 我们是否应该自动执行此操作
user_t
或是否应该user_t
明确要求转换?
SELinux 过渡模型是方式比 DAC 模型更强大,评估更好,而且更加细致。
SELinux 的大部分功能都在于您拥有的强大转换模型。因为您可以非常具体地规定谁将成为谁的条件 - 然后您可以根据主体的功能使您正在转换的任何内容具有非常具体的权限。
因此,回答你最初的问题——答案取决于你想做什么以及你想让谁来做。