CentOS 下 SELinux 权限分配实用指南
一 核心概念与前置检查
- SELinux 通过主体(进程/用户)、对象(文件/端口/套接字)与策略的匹配关系实施强制访问控制,安全上下文格式为:user:role:type[:level],其中决定访问权限的关键是type(进程域/文件类型),level 仅在 MLS/MCS 策略下使用。常用查看命令:
- 查看系统与模式:getenforce、sestatus -v
- 查看文件/进程上下文:ls -Z、ps -eZ
- 查看 SELinux 用户映射:semanage login -l
- 查看端口类型:semanage port -l
- 运行模式:
- Enforcing:强制执行策略,拒绝违规操作
- Permissive:仅记录违规,不拒绝(用于排障)
- Disabled:彻底关闭(需重启;重新启用需重打标签)
- 策略类型:常见为 targeted(默认,仅限制关键服务)、mls/mcs(多级/多分类安全,细粒度隔离)。
二 运行模式与策略类型配置
- 临时切换模式(立即生效,重启后失效):
- 启用强制:sudo setenforce 1
- 宽容模式:sudo setenforce 0
- 永久生效(编辑配置文件并重启):
- 配置文件:/etc/selinux/config(/etc/sysconfig/selinux 通常为符号链接)
- 示例:将 SELINUX= 设置为 enforcing/permissive/disabled;SELINUXTYPE= 设置为 targeted/mls
- 注意:从 Disabled 切换到启用需重启,并执行 touch /.autorelabel 修复文件标签
- 策略类型选择:
- 一般服务器建议 targeted
- 需要数据敏感度隔离时采用 mls/mcs(见第四节)。
三 面向用户与角色的权限分配
- 将 Linux 登录用户映射到 SELinux 用户(决定其默认权限边界):
- 查看映射:semanage login -l
- 新增映射:sudo semanage login -a -s SELinux用户 用户名
- 修改映射:sudo semanage login -m -s SELinux用户 用户名
- 常用 SELinux 用户与能力差异:
- guest_u:无 GUI、无网络、不可 su/sudo、不可执行 /home 或 /tmp 中的文件
- xguest_u:可使用 GUI,仅能通过 Firefox 访问网络,不可执行 /home 或 /tmp
- user_u:可使用 GUI 和网络,不可 su/sudo
- staff_u:同 user_u,但可使用 sudo
- sysadm_u:可使用 GUI 和网络,且可使用 su/sudo
- unconfined_u:几乎不受限(常用于管理员或调试)
- 示例:限制普通用户切换账户
- 将用户 alice 映射为 user_u:sudo semanage login -a -s user_u alice
- 重新登录后验证:id -Z(应见 user_u:…)
- 尝试 su/sudo 将被 SELinux 拒绝(即使知道密码)
- 重要说明:
- 即使 Linux 用户处于 unconfined_u,当其运行被策略约束的应用时,仍会进入受限域并受策略限制(例如从 unconfined_t 转换到服务域),从而缩小攻击面。
四 面向服务与资源的权限分配
- 文件与目录上下文(类型正确才能被进程访问)
- 查看:ls -Z /var/www/html
- 添加本地策略规则:sudo semanage fcontext -a -t 类型 ‘路径(/.*)?’
- 使规则生效:sudo restorecon -Rv 路径
- 示例:将自定义目录发布为 Web 内容
- sudo semanage fcontext -a -t httpd_sys_content_t ‘/webapp(/.*)?’
- sudo restorecon -Rv /webapp
- 端口类型
- 查看:semanage port -l | grep http
- 示例:允许 Nginx 使用 8080/tcp
- sudo semanage port -a -t http_port_t -p tcp 8080
- 布尔值(开关型策略,快速启用/禁用能力)
- 查看:getsebool 名称
- 永久设置:sudo setsebool -P 名称 1/0
- 示例:允许 httpd 发起网络连接
- sudo setsebool -P httpd_can_network_connect 1
- 自定义策略模块(最小权限原则)
- 从拒绝日志生成模块:sudo grep “denied” /var/log/audit/audit.log | audit2allow -M mypolicy
- 加载模块:sudo semodule -i mypolicy.pp
- 回滚:sudo semodule -r mypolicy
- 排障流程
- 实时查看拒绝:sudo tail -f /var/log/audit/audit.log | grep denied
- 格式化分析:sudo ausearch -m AVC -ts recent 与 sudo audit2why -a。
五 高级 MLS MCS 级别分配示例
- 前提:策略为 mls,模式 enforcing,已安装 policycoreutils-python-utils
- 为 SELinux 用户定义级别范围(例:staff_u 默认 s1,范围 s1-s15)
- sudo semanage user -m -L s1 -r s1-s15 staff_u
- 为用户主目录生成上下文条目并重新标记
- sudo genhomedircon
- sudo restorecon -R -F -v /home/
- 为用户分配明确级别(例:将 example_user 设为 s1)
- sudo semanage login -m -r s1 example_user
- 将主目录标记到明确级别:sudo chcon -R -l s1 /home/example_user
- 验证与回切
- 检查:id -Z、ls -Z /home/example_user
- 排障时可临时切为 Permissive:sudo setenforce 0,验证无误后 sudo setenforce 1。