Ubuntu SELinux用户权限管理
小樊
39
2025-11-24 19:08:39
Ubuntu 上的 SELinux 用户权限管理
一 核心概念与工作机制
- SELinux 在 Ubuntu 上提供 强制访问控制 MAC,与传统的 DAC(rwx/ACL) 并行工作;访问是否放行取决于 安全上下文 与 策略规则 的同时满足。安全上下文格式为:USER:ROLE:TYPE[LEVEL[:CATEGORY]],常用命令如 ls -Z / ps -Z / id -Z 可查看。SELinux 的 用户(USER) 与 Linux 系统用户不同,它用于 MAC 标记与授权;角色(ROLE) 用于约束用户可进入的 域(TYPE),而真正的访问许可主要由 类型强制 TE 规则授予,RBAC 起到“限制谁能进入哪些域”的作用。常见映射示例:root 登录常见为 root:sysadm_r:sysadm_t,普通用户常见为 user_u:user_r:user_t;登录会话的 SELinux 用户身份在切换用户时保持不变,便于审计与约束。
二 启用与基础配置
- 在 Debian/Ubuntu 上,SELinux 通常未预装,需先安装并启用:
- 安装组件:
sudo apt-get install selinux-basics selinux-policy-default
- 启用 SELinux(安装器会提示执行):
sudo selinux-activate
- 配置模式:编辑 /etc/selinux/config,设置 SELINUX=enforcing(或 permissive 用于排错;disabled 需重启且不建议)
- 如安装器未自动配置引导,可在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 中添加 security=selinux,执行
sudo update-grub 后重启
- 运行时切换:
sudo setenforce 1(Enforcing)或 sudo setenforce 0(Permissive);getenforce 查看当前模式,sestatus 查看详细状态
- 提示:从 Disabled 切换到 Enforcing/Permissive 通常需要重启;生产环境建议先在 Permissive 下观察日志再切到 Enforcing。
三 用户映射与角色权限控制
- 管理 Linux 用户到 SELinux 用户的映射(决定该登录会话的 SELinux 用户身份):
- 查看映射:
sudo semanage login -l
- 新增映射(将系统用户 dev_user 映射为 user_u,默认 MLS/MCS 范围 s0):
sudo semanage login -a -s user_u dev_user
- 修改/删除:
sudo semanage login -m -s staff_u dev_user;sudo semanage login -d dev_user
- 管理 SELinux 用户及其允许的角色(决定该 SELinux 用户可承担的角色集合):
- 查看:
sudo semanage user -l
- 新增 SELinux 用户(示例:名称为 tcxa_u,前缀 user 表示登录用户类,允许角色 system_r,MLS/MCS 范围 s0):
sudo semanage user -a -L s0 -r "s0" -P user -R system_r tcxa_u
- 删除:
sudo semanage user -d tcxa_u
- 角色与域的关系及切换:
- 常见角色:user_r、staff_r、sysadm_r、system_r、unconfined_r;常见登录类 SELinux 用户:root、staff_u、sysadm_u、system_u、unconfined_u、user_u
- 角色切换:用户只有在被允许的角色集合中,才能通过
newrole/runcon 等方式切换角色;可用 seinfo -r <role> -x 查看某角色可进入的域集合,以评估权限边界。
四 常见运维任务与排错
- 文件/进程上下文查看与修复:
- 查看:
ls -Z /path、ps -Z -C <proc>、id -Z
- 修复目录默认上下文:
sudo restorecon -Rv /opt/webapps
- 临时修改(谨慎):
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
- 动态策略与端口管理:
- 布尔值(服务特性开关,加 -P 持久化):
getsebool -a | grep httpd;sudo setsebool -P httpd_can_network_connect on
- 端口类型:
sudo semanage port -l | grep http_port_t;sudo semanage port -a -t http_port_t -p tcp 8080
- 日志分析与最小权限策略生成:
- 查看拒绝日志:
sudo ausearch -m AVC -ts recent
- 生成并加载本地策略模块:
grep "avc: denied" /var/log/audit/audit.log | audit2allow -M mypolicy && sudo semodule -i mypolicy.pp
- 故障排查要点:
- 同时检查 DAC(rwx/ACL) 与 SELinux(上下文/策略);优先用 Permissive 模式验证是否为 SELinux 导致
- 谨慎使用
chcon,优先通过 semanage fcontext + restorecon 持久修复上下文
- 修改策略/映射前备份 /etc/selinux 与关键配置,变更后逐步回归 Enforcing。