CentOS 中 SELinux Context 的选择与落地
一、先选对“类型”的原则
- 明确主体与客体:进程运行在“域”(如 httpd_t),文件/目录拥有“类型”(如 httpd_sys_content_t)。访问控制主要由“域→类型”的规则决定,而非传统的用户/组权限。用 ls -Z 查看对象上下文,用 ps -Z 查看进程上下文,字段为 user:role:type:level。
- 以“类型”为核心做选择:优先为目标选择系统已定义的类型(而非自建),这样可直接复用既有策略。例如 httpd 进程可读取 httpd_sys_content_t(只读),默认不可写;CGI 脚本需 httpd_sys_script_exec_t 且启用布尔 httpd_enable_cgi 才会被执行;需要脚本写入的文件用 httpd_sys_rw_content_t,仅追加用 httpd_sys_ra_content_t。
- 遵循最小权限:只授予业务必需的类型/权限,避免把目录统一改成过度宽松的类型(如直接给 httpd_sys_rw_content_t)。
- 区分数据与配置:静态内容、上传目录、可执行脚本、数据库文件等应分别采用不同且更严格的类型与权限组合。
二、常见服务的 Context 选择
| 服务/场景 |
推荐文件/目录类型 |
关键布尔或注意点 |
| Apache HTTP Server |
静态内容:httpd_sys_content_t;CGI 脚本:httpd_sys_script_exec_t;脚本可读写:httpd_sys_rw_content_t;仅追加:httpd_sys_ra_content_t |
启用 CGI:httpd_enable_cgi;默认 /var/www/html 为 httpd_sys_content_t;默认禁止写;用户家目录 user_home_t 默认不可被 httpd 读写 |
| Nginx |
静态内容:httpd_sys_content_t;代理/缓存等按实际模块与策略匹配 |
与 httpd 共享大量类型定义;以进程域与模块策略为准,避免放宽到可写类型 |
| MariaDB/MySQL |
数据目录:mysqld_db_t;日志:mysqld_log_t;运行目录:mysqld_var_run_t |
目录需按类型设置并保持一致性,避免与 web 类型混用 |
| PostgreSQL |
数据目录:postgresql_db_t;日志:postgresql_log_t |
与数据库进程域匹配,谨慎授予写权限 |
| Samba 共享 |
共享目录:samba_share_t |
与 httpd 类型隔离,避免误读/误写 |
| 自定义应用 |
先选最贴近的“系统已有类型”,必要时用布尔或细化策略;最后才考虑本地策略模块 |
不建议一开始就放宽到 unconfined_t 或关闭 SELinux |
说明:上表中 httpd 相关类型与布尔为 RHEL/CentOS 常见默认值;Nginx 常用 httpd_sys_content_t 提供静态内容;数据库类型名称以实际策略包为准,部署时以系统自带类型与工具提示为优先。
三、落地步骤与命令清单
- 状态与模式
- 查看:sestatus、getenforce
- 切换:setenforce 0|1(临时,0=Permissive,1=Enforcing)
- 永久:编辑 /etc/selinux/config 的 SELINUX= 项并重启
- 查看与诊断
- 对象/进程上下文:ls -Z、ps -Z
- AVC 拒绝分析:ausearch -m avc -ts recent、aureport;必要时用 audit2allow 生成本地策略模块(先确认是否因类型不当引起,避免过度授权)
- 永久设置默认上下文
- 安装管理工具:yum/dnf install -y policycoreutils-python-utils
- 添加 fcontext 规则(示例):
- semanage fcontext -a -t httpd_sys_content_t “/var/www/html(/.*)?”
- semanage fcontext -a -t httpd_sys_script_exec_t “/var/www/cgi-bin(/.*)?”
- 应用规则:restorecon -Rv /var/www
- 临时与回滚
- 临时修改:chcon -t type /path(重启或 restorecon 可能恢复)
- 回滚默认:restorecon -R /path
- 布尔开关
- 查看/设置:getsebool、setsebool -P(如 httpd_enable_cgi)
四、排错与优化要点
- 先判定是否类型问题:用 ls -Z 核对实际类型是否符合预期;若不符,优先用 semanage fcontext + restorecon 纠正,而非直接 chcon 或放宽策略。
- 拒绝日志要闭环:用 ausearch/aureport 定位 AVC,确认是“类型不匹配”还是“功能未启用”(布尔),再决定是改类型、开布尔,还是谨慎生成本地模块。
- 慎用 Permissive 与放宽类型:调试可短时 setenforce 0 或设布尔,但长期应回到 Enforcing 并用最小权限的类型/布尔组合。
- 避免“过度授权”:不要将业务目录统一改为 httpd_sys_rw_content_t 或 unconfined_t;上传目录可单独设更严格的类型与权限,必要时结合布尔与细化策略。
- 规则要可维护:合并同类路径规则、删除不再使用的 fcontext,减少噪声与维护成本。