温馨提示×

centos下selinux权限如何分配

小樊
44
2025-12-07 12:36:17
栏目: 智能运维

CentOS 下 SELinux 权限分配实用指南

一 核心概念与前置检查

  • SELinux 通过主体(进程/用户)、对象(文件/端口/套接字)与策略的匹配关系实施强制访问控制,安全上下文格式为:user:role:type[:level],其中决定访问权限的关键是type(进程域/文件类型),level 仅在 MLS/MCS 策略下使用。常用查看命令:
    • 查看系统与模式:getenforcesestatus -v
    • 查看文件/进程上下文:ls -Zps -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_usudo 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 recentsudo 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 -Zls -Z /home/example_user
    • 排障时可临时切为 Permissivesudo setenforce 0,验证无误后 sudo setenforce 1

0