Linux Context如何实现安全
小樊
31
2025-12-21 06:49:47
Linux Context安全实现指南
一 概念与总体思路
- 在 Linux 安全领域,“Context”通常指 SELinux 安全上下文,用于给主体(进程)与客体(文件、套接字、进程间通信等)打上标签,实施基于类型的强制访问控制(MAC)。一个上下文通常形如:user:role:type:level(日常最关注 type/域)。访问控制判定在 DAC(传统 rwx 与属主/属组)之后进行,因此即便文件权限为 777,只要类型不匹配,访问仍会被拒绝。配合 布尔值(Boolean) 可细粒度开关某些策略能力,用于在不重写策略的情况下调整行为。
二 启用与基线配置
- 确认与切换模式
- 查看状态:
getenforce、sestatus
- 临时切换:
setenforce 1(Enforcing)/ setenforce 0(Permissive)
- 永久生效:编辑 /etc/selinux/config(或链接的 /etc/sysconfig/selinux),设置
SELINUX=enforcing,重启后生效
- 策略与默认域
- 常见策略为 targeted,仅对关键网络服务等施加严格 MAC,其他保持宽松
- 基线检查清单
- 系统处于 Enforcing
- 关键服务运行在专有域(如 httpd_t、mysqld_t),避免 unconfined_t
- 自定义目录与数据路径具备正确的默认类型映射,避免误标为 user_home_t、tmp_t 等导致访问被拒
三 上下文配置与运维操作
- 查看与诊断
- 文件/目录:
ls -Z
- 进程:
ps -Z
- 用户:
id -Z
- 拒绝日志:
ausearch -m avc -ts recent 或 grep "avc:.*denied" /var/log/audit/audit.log
- 分析辅助:
audit2why、sealert(setroubleshoot)
- 设置与修复
- 临时修改:
chcon -t <type> <path>(易丢失,适合测试)
- 持久化默认类型:
semanage fcontext -a -t <type> '<path>(/.*)?'
restorecon -R <path>
- 典型示例(Web 内容)
semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'
restorecon -R /var/www/html
- 行为与策略微调
- 布尔值:
setsebool -P <bool> on|off(如 allow_ftpd_anon_write)
- 规则查询:
sesearch --allow -s <主体类型> -t <目标类型>
- 复制与移动语义
- 复制会继承目标目录的默认上下文
- 移动/重命名通常保留原上下文,易引发访问异常,需
restorecon 修复
四 典型场景与排错闭环
- 场景一:Web 服务读取文件被拒
- 现象:文件权限正确,但浏览器访问失败
- 诊断:
ps -Z 确认 httpd_t;ls -Z 发现文件为 admin_home_t 或 tmp_t
- 修复:将内容放入 /var/www/html 或为其设置
httpd_sys_content_t,执行 restorecon -R <path>
- 场景二:自定义目录提供 Web 内容
- 方案:为该目录与子路径设置默认类型(如
httpd_sys_content_t),并用 restorecon 应用
- 场景三:需要写入或上传
- 方案:为目标设置可写类型(如
httpd_sys_rw_content_t),并审慎开启相关布尔值
- 排错闭环
- 收集:
ausearch -m avc -ts recent
- 解释:
audit2why 输出是否应放行与原因
- 决策:优先“改位置/改类型/改流程”,确需放行时再生成最小策略模块(
audit2allow -M <name> 并 semodule -i <name>.pp),避免长期放宽
五 内核上下文与运行时安全要点
- 上下文类型
- 进程上下文:内核代表进程在内核态执行,可抢占,允许睡眠与调度
- 中断/软中断上下文:异步触发、与具体进程无关,必须快速执行,禁止睡眠与调度,常用自旋锁保护临界区
- 关键机制
- context_switch():由 schedule() 调用,完成地址空间切换(如
switch_mm())与寄存器/栈切换(如 switch_to())
- 抢占控制:
need_resched 标志与 preempt_count 计数器决定是否可抢占;无锁且 preempt_count==0 时可安全抢占
- 安全启示
- 在中断/原子上下文中避免调用可能睡眠或访问用户态的函数
- 理解用户态/内核态与进程/中断上下文差异,有助于定位“在原子上下文中睡眠”等内核缺陷与加固点