温馨提示×

Linux Context如何管理文件系统

小樊
32
2025-12-25 04:13:17
栏目: 智能运维

Linux 文件系统 SELinux 上下文管理

一 核心概念与查看方式

  • 在启用 SELinux 的系统上,每个进程与文件都被打上安全上下文(Security Context),格式为:user:role:type:level(如:system_u:object_r:etc_t:s0)。其中对访问决策最关键的是type(文件)或domain(进程)。访问时先进行传统的 DAC 检查,若未被拒绝再由 SELinux MAC 依据上下文与策略裁决。文件系统的标签通常以内核的 xattr(扩展属性)security.selinux 形式存储于 inode。查看方式:
    • 文件/目录:ls -Z /path
    • 进程:ps -eZ
    • 扩展属性:getfattr -m . -d /path(可见 security.selinux 的值)

二 标签的继承与默认规则

  • 默认情况下,新建文件/目录会继承其父目录的 SELinux 类型。例如:在 /etc 下创建的文件通常获得 etc_t 类型,因为 /etc 本身的类型为 etc_t。这类“应当是什么类型”的映射由系统的**文件上下文数据库(file_contexts)**定义,可用 matchpathcon 查询。示例:
    • 查看:matchpathcon /etc
    • 结果示例:/etc 的默认上下文为 system_u:object_r:etc_t:s0

三 日常管理常用命令

  • 临时修改标签(不持久,易被策略或 restorecon 覆盖)
    • chcon -t httpd_sys_content_t /var/www/index.html
    • chcon -R -t samba_share_t /srv/samba
  • 永久修改默认标签(写入 file_contexts,随后需 restorecon 使已存在文件生效)
    • 添加:semanage fcontext -a -t httpd_sys_content_t “/var/www(/.*)?”
    • 修改:semanage fcontext -m -t httpd_sys_content_t “/var/www(/.*)?”
    • 删除:semanage fcontext -d “/var/www(/.*)?”
    • 使已存在文件按新默认标签就位:restorecon -R /var/www
  • 按策略恢复标签(最安全、推荐)
    • restorecon -R /var/www
  • 批量修复与重标记
    • 按 RPM 包修复:fixfiles -R restore
    • 全系统重标记:touch /.autorelabel && reboot(仅在必要时使用)

四 挂载与跨平台场景的标签控制

  • 支持 xattr 的文件系统(如 ext4、xfs):挂载后从 security.selinux 扩展属性读取标签;若以 mount -o context=system_u:object_r:httpd_sys_content_t:s0 方式挂载,可为整个文件系统覆盖默认上下文。注意:
    • 该上下文仅存于挂载选项,不会写入磁盘;重启或重新挂载需再次指定。
    • 使用 context 选项时,不允许通过 chcon 等命令更改文件标签(会报 Operation not supported)。
  • 不支持 xattr 的文件系统(如 FAT、部分 NFS 客户端场景):内核按策略为该文件系统类型指定单一默认上下文(常见如 nfs_t),此时可用 -o context 提供可用标签或统一标记,以便服务访问。

五 故障排查与最佳实践

  • 快速定位问题
    • 查看拒绝日志:ausearch -m avc -ts recent 或使用 setroubleshoot(需安装并启用),可获取“应是什么类型”的建议与修复步骤。
  • 处理顺序建议
    • 先用 ls -Z/ps -eZ 确认当前标签;用 matchpathcon 确认“应有标签”;按需执行 semanage fcontext + restorecon 做持久修正;仅在临时测试或特殊介质上使用 chconmount -o context
  • 常见场景示例
    • Web 目录发布:将 /var/www 及其子路径的默认类型设为 httpd_sys_content_t(读)或 httpd_sys_content_rw_t(读写),然后 restorecon -R /var/www。
    • 共享目录(Samba/FTP):将共享路径设为 samba_share_tpublic_content_t(读)/public_content_rw_t(读写),再 restorecon 使其生效。

0