semanage fcontext用于声明目录默认安全上下文,需配合restorecon生效;-a添加、-m修改、-d删除规则,路径须用双引号并含正则如(/.*)?,否则子目录不继承。

直接用 semanage fcontext 设置目录的默认安全标签,核心是“声明规则 + 触发生效”,不能只改配置就完事。
查当前默认标签规则
先看系统已有的默认策略,确认目标路径是否已有定义:
-
semanage fcontext -l | grep '/var/www'—— 查找含特定路径的规则 -
semanage fcontext -l | awk '$1 ~ /^\/srv/ {print}'—— 快速筛选 /srv 下的规则 - 注意正则写法:如
/var/www(/.*)?表示匹配 /var/www 及其所有子路径
添加或修改目录的默认类型
使用 -a 添加新规则,或 -m 修改已有规则。关键要指定完整路径+正则+类型:
- 给
/srv/samba及其子目录设为public_content_t:semanage fcontext -a -t public_content_t "/srv/samba(/.*)?" - 若该路径已有规则,先删再加,或直接用
-m替换:semanage fcontext -m -t samba_share_t "/srv/samba(/.*)?" - 路径必须用双引号包裹,且末尾的
(/.*)?很重要——它确保子目录和文件也继承该类型
让新规则真正起作用
semanage 只改数据库,不改实际文件标签。必须配合 restorecon 才能生效:
- 立即应用新规则到目录及其内容:
restorecon -Rv /srv/samba - 验证结果:
ls -Zd /srv/samba和ls -Z /srv/samba/file.txt - 如果之前手动用
chcon改过标签,restorecon会覆盖它,回归 semanage 声明的默认值
删掉不需要的规则
误加或不再使用的规则,用 -d 删除,同样需 restorecon 同步:
semanage fcontext -d "/srv/samba(/.*)?"- 删完建议执行:
restorecon -Rv /srv/samba,让它恢复成上级路径的默认类型(如 var_t) - 删除后运行
semanage fcontext -l | grep samba确认已清除


















