SELinux目标策略下httpd访问权限相关技术问询
SELinux目标策略下httpd访问权限相关技术问询
刚接触targeted SELinux的时候确实容易在权限判定逻辑上绕晕,我结合你的例子一步步给你拆解:
1. 为什么httpd能访问/var/www/html?标签检查逻辑是怎样的?
在targeted策略里,类型(type)是权限控制的核心,用户、角色、敏感度在默认场景下很少成为限制因素(你的例子里进程和文件都是s0敏感度,进程用的system_r系统角色、文件是object_r客体角色,这些默认配置已经放行角色层面的访问)。
具体到你的场景:
- httpd进程的类型是
httpd_t - /var/www/html下文件的类型是
httpd_sys_content_t
SELinux的类型强制(TE)规则里,默认就定义了类似allow httpd_t httpd_sys_content_t : file { read getattr open }的权限——简单说就是允许httpd_t类型的进程读取httpd_sys_content_t类型的文件。
检查顺序大概是:
- 先看主体(进程)和客体(文件)的敏感度:如果进程的敏感度低于文件的,会被直接拒绝(你的例子都是
s0,没问题) - 然后是角色:targeted策略里,
system_r(进程的角色)默认被允许访问object_r(文件的客体角色),这部分不用额外配置 - 最后也是最关键的类型匹配:检查是否存在允许主体类型访问客体类型的TE规则,这是决定能否访问的核心依据。
2. 允许访问的规则长什么样?怎么查看?
允许httpd访问网页内容的规则是SELinux内置的TE规则,你可以用sesearch命令直接查询:
sesearch -A -s httpd_t -t httpd_sys_content_t
输出里会看到类似这样的条目:
allow httpd_t httpd_sys_content_t : file { getattr open read }; allow httpd_t httpd_sys_content_t : dir { getattr open read search };
这些就是允许httpd进程读取对应目录和文件的具体规则。
另外,你也可以用seinfo查看类型的属性,比如seinfo -t httpd_sys_content_t -x,能看到这个类型属于content_type、httpd_content_type等属性,这些属性会被TE规则批量引用,简化整体配置。
3. 如何确定进程对特定标签资源的访问方式?
有几个实用工具可以帮你快速排查:
- sesearch:刚才提到的工具,指定主体类型和客体类型,用
-A参数查看允许的权限。比如想知道httpd能不能写某个类型的文件,就用sesearch -A -s httpd_t -t [目标类型] | grep write - audit.log + audit2allow:如果进程访问被拒绝,
/var/log/audit/audit.log里会有对应的deny日志,用audit2allow -a可以分析日志,直接告诉你缺少哪些规则 - sepolicy:比如
sepolicy interface -a httpd可以查看httpd相关的预定义接口,这些接口封装了常用的权限规则,方便理解整体权限逻辑
4. 管理员能不能修改规则让其他文件上下文也能被访问?
当然可以,有几种常用的方式,按推荐程度排序:
- 修改文件上下文到已有允许的类型:比如你想让httpd访问
/home/user/web目录,直接用semanage fcontext -a -t httpd_sys_content_t "/home/user/web(/.*)?",然后restorecon -Rv /home/user/web,这样目录就变成了httpd允许读取的类型,不用修改核心规则 - 启用相关布尔值:SELinux有很多预定义的布尔值来快速开关特定权限,比如想让httpd读取用户家目录的内容,可以用
setsebool -P httpd_read_user_content on(-P参数表示永久生效,重启后不会失效) - 自定义TE规则模块:如果上面两种都满足不了,比如需要让httpd访问一个全新的自定义类型,你可以用audit2allow生成模块,或者手动编写
.te文件,编译后加载。比如先捕获拒绝日志,然后audit2allow -M myhttpdrule,再semodule -i myhttpdrule.pp就能加载自定义规则了
备注:内容来源于stack exchange,提问作者hhue13




