Linux SELinux Context 文件管理
一 核心概念与查看方式
- 在启用 SELinux 的系统上,每个进程与文件都会被标注一段安全标签,称为 SELinux 上下文。文件上下文通常包含:用户 user、角色 role、类型 type、级别 level,例如:unconfined_u:object_r:user_home_t:s0。该标签用于访问控制,且在 DAC(传统权限)检查之后再进行 SELinux 策略检查。新创建的文件/目录默认会继承父目录的类型(如 /etc 下的新文件通常为 etc_t)。查看文件与目录上下文使用 ls -Z;查看目录本身用 ls -dZ。示例:
ls -Z file1、ls -dZ /etc/。这些基础是进行上下文管理与排错的前提。
二 常见管理任务与命令
- 查看上下文
- 列出文件:
ls -Z <file>
- 列出目录本身:
ls -dZ <dir>
- 临时修改上下文(不持久)
- 修改类型:
chcon -t <type> <file_or_dir>
- 递归修改:
chcon -R -t <type> <dir>
- 说明:此类修改在重打标签或执行 restorecon 后可能丢失,适合临时验证。
- 持久化修改上下文(推荐)
- 添加/修改路径映射:
semanage fcontext -a -t <type> "<path>"
- 递归匹配常用写法:
semanage fcontext -a -t <type> "<path>(/.*)?"
- 应用映射:
restorecon -Rv <path>
- 核对规则:
semanage fcontext -l、semanage fcontext -C -l(查看本地与候选规则冲突)
- 恢复默认上下文
- 按策略恢复:
restorecon -Rv <path>
- 辅助工具
- 策略行为开关:getsebool/setsebool -P on|off(如
httpd_can_network_connect)
- 审计日志分析:
audit2allow 辅助生成策略模块(用于复杂拒访场景)
- 典型场景示例
- 将网站目录标记为 httpd_sys_content_t:
semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'
restorecon -Rv /var/www/html
- 将某配置文件临时改为 samba_share_t 做验证:
chcon -t samba_share_t /etc/file1
- 查看与核对规则:
semanage fcontext -l | grep httpd
semanage fcontext -C -l
三 优先级与持久化机制
- 匹配顺序与优先级
- 工具按以下顺序匹配路径的上下文定义:file_contexts.local(本地自定义) > file_contexts.homedirs > file_contexts(系统策略)。一旦命中匹配项即停止继续匹配。
- 系统策略中的条目按路径前缀(stem)长度从长到短排序,优先更具体的路径;而通过 semanage fcontext 添加的本地规则按添加顺序逆序评估,即最新添加的规则优先。
- 持久化位置与生效
- 使用 semanage fcontext -a 添加的规则保存在 file_contexts.local,其优先级高于系统策略,确保重打标签或重启后仍按自定义规则恢复标签。
- 使用 restorecon 时,会依据上述优先级与规则为文件/目录重新打上应得标签,是使持久化规则落地的关键步骤。
四 故障排查与最佳实践
- 快速排查思路
- 确认是否被 SELinux 拒绝:查看 /var/log/audit/audit.log(或使用
ausearch/sealert),必要时用 audit2allow 辅助分析。
- 校验当前标签:
ls -Z <path>;确认父目录标签与期望一致(继承关系是否正确)。
- 校验规则是否到位:
semanage fcontext -l | grep <path>;若有冲突,用 semanage fcontext -C -l 查看。
- 应用修复:优先使用
restorecon -Rv <path> 恢复默认标签;若需长期生效,补充/修正 semanage fcontext 规则。
- 最佳实践
- 优先采用 semanage fcontext + restorecon 的持久化方式,避免仅用 chcon 的临时修改。
- 为路径编写尽可能具体的正则,避免通配过宽影响其他目录;变更前用
semanage fcontext -C -l 检查冲突。
- 理解 DAC 先于 SELinux 的评估顺序:若传统权限(如 chmod/chown)已拒绝访问,SELinux 不会“放行”。必要时同时校正 DAC 与 SELinux 标签。