首页/系统/信创系统运维速查/SELinux 自定义目录标签:semanage fcontext
安全加固65 条

SELinux 自定义目录标签:semanage fcontext

把非标准路径(如 /data/web)设为 Web 可访问目录的正确姿势:semanage fcontext 登记规则 + restorecon 应用,重启与 relabel 后依然有效。

信创系统运维速查系统更新于 2026-10-13

semanage fcontext 是什么

SELinux 靠安全上下文(标签)判断进程能不能访问文件,路径的标签由策略里的文件上下文规则决定。把应用目录放到非标准路径(如 /data/web)后,目录继承的是默认标签,Web 服务会因类型不符被拒绝。正确做法不是手工 chcon,而是用 semanage fcontext 登记一条路径规则,再用 restorecon 应用;这样文件重建、全盘 relabel 或迁移后标签依然正确。

基本信息

适用平台启用 SELinux 的 RHEL/CentOS/openEuler/银河麒麟服务器版
软件包policycoreutils-python-utils(提供 semanage)
登记规则semanage fcontext -a -t 类型 "路径正则"
应用标签restorecon -Rv 路径
查看semanage fcontext -l | grep 路径,或 ls -Z

典型使用场景

  • Web 站点根目录改到数据盘,需要让 httpd 有权读取
  • 应用数据目录、日志目录迁到独立分区,标签未随迁移改变
  • 自定义共享目录要允许 Samba 访问,需要设 samba_share_t
  • 容器或虚拟化平台给虚拟机镜像目录打上专用类型
  • 迁移后批量校验:用 restorecon -Rn 空跑看哪些文件标签将被改动

登记与应用(推荐做法)

登记与应用(推荐做法)
semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"   # 登记目录及下级
semanage fcontext -l | grep /data/web                             # 确认规则已入库
restorecon -Rv /data/web                                          # 应用标签(递归详细)
ls -Z /data/web | head                                            # 抽查标签是否已变
restorecon -Rn /data/web | head                                    # 空跑预演,不实际改动
semanage fcontext -m -t httpd_sys_rw_content_t "/data/web/upload(/.*)?"  # 修改已有规则

常用上下文类型

类型用途典型路径
httpd_sys_content_tWeb 可读静态内容/var/www/html
httpd_sys_rw_content_tWeb 需读写(上传目录)上传与缓存目录
samba_share_tSamba 共享目录/srv/samba
var_log_t日志目录/var/log
usr_t系统程序目录/usr 与 /etc 部分路径
default_t未归类的默认标签新分区根目录,常需登记
正则里的 (/.*)? 表示「目录本身及其全部下级」;漏掉它只覆盖目录本身,目录里的文件仍沿用旧标签,表现为目录能列出但文件读不了。
chcon 只在当次有效,restorecon、全盘 relabel 或系统升级后会被改回策略默认值,只能当临时验证手段。
已登记过的路径要改类型用 -m(modify),-a(add)会因规则重复而报错;删除用 -d 后同样要 restorecon 才能把标签改回去。

易错点

  • 只登记规则不执行 restorecon,标签不会自动改变,两步缺一不可。
  • 正则漏写 (/.*)? 只覆盖目录本身,子文件仍被拒,验收时要在目录内 ls -Z 抽查。
  • 用 chcon 手工打标签当作正式方案,重挂载、relabel 或升级后标签回退,故障复现且更难定位。
  • semanage 命令找不到通常是没装 policycoreutils-python-utils,误判为系统不支持 SELinux 管理。
  • 给整个分区根目录打了过宽的类型(如 httpd_sys_content_t),会让该分区所有内容对 Web 进程开放,应针对具体子目录登记。

数据来源与参考

  • man 8 semanage-fcontext
  • SELinux 官方 Wiki
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌