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