selinux文件上下文标签的核心是type字段,决定进程能否访问文件;设错导致avc拒绝且无明显报错,仅记录于audit日志;查看用ls -z,临时修改用chcon,永久生效需semanage fcontext定义规则后restorecon应用。

SELinux 文件上下文标签不是“随便设一个就行”的配置,而是决定进程能否读写文件的核心依据。类型(type)字段最关键,比如 httpd_sys_content_t 表示 Web 服务可读的静态内容,而 etc_t 是系统配置文件的标准类型。设错就直接被拒绝访问,且不会报错权限不足,只在 audit 日志里留一条 AVC 拒绝记录。
查看当前上下文:确认起点再动手
用 ls -Z 查看文件或目录的实际标签:
-
单个文件:
ls -Z /var/www/html/index.html -
目录本身(不含内容):
ls -Zd /var/www/html -
递归查看子项:
ls -ZR /var/www/html | head -10
输出如 system_u:object_r:httpd_sys_content_t:s0,重点看第三段(type),它必须匹配进程所在域的访问规则。
临时修改标签:快速验证用 chcon
chcon 改的是当前 inode 的扩展属性,重启、restorecon 或重新创建都会丢失,适合调试:
- 改单个文件类型:
chcon -t httpd_sys_content_t /path/to/file - 递归改整个目录:
chcon -R -t httpd_sys_content_t /path/to/dir - 完整上下文重设(含 user/role):
chcon -u system_u -r object_r -t httpd_sys_content_t /path/to/file
注意:chcon 不检查策略是否允许该 type 存在,输错类型名也不会报错,但后续 restorecon 会覆盖它。
永久生效:semanage + restorecon 组合
真正持久的修改分两步:先定义规则,再应用到文件系统:
- 添加路径规则(支持正则):
semanage fcontext -a -t httpd_sys_content_t "/srv/myapp(/.*)?"
其中(/.*)?表示匹配该路径及其所有子路径 - 查看已定义规则:
semanage fcontext -l | grep myapp - 把规则落实到实际文件:
restorecon -Rv /srv/myapp-v显示变更,-R递归,这一步才是真正“写入扩展属性”
如果漏掉 restorecon,规则只是存进数据库,文件标签不会变。
修复常见错乱:一键回滚与诊断
文件上下文错乱时,先别急着 chcon:
- 恢复默认策略标签:
restorecon -Rv /path(最安全的第一步) - 查哪些文件偏离了策略:
restorecon -Rvn /path(加n表示 dry-run,只预览不执行) - 从 audit.log 抓真实拒绝原因:
ausearch -m avc -ts recent | audit2why - 批量修复全部系统文件(慎用):
touch /.autorelabel && reboot,下次启动自动全盘重标
不复杂但容易忽略











