Linux-系统安全
全面了解SELinux/AppArmor等安全模块
一、Linux 对安全模块的支持:LSM 框架
Linux 内核通过 Linux Security Module (LSM) 框架提供了对安全模块的通用支持。LSM 是一个轻量级、可扩展的访问控制框架,允许在内核中动态加载不同的安全策略模块(如 SELinux、AppArmor、Smack 等)。其核心设计目标是:
- 模块化:支持多种安全模型以可加载内核模块的形式实现。
- 通用性:通过统一的接口(Hook 函数)和安全域(Security Domain)机制,减少对内核的侵入性修改。
- 灵活性:允许策略动态调整,同时兼容传统的 DAC(自主访问控制)机制。
LSM 的关键机制
安全域(Security Domain):
- 在内核数据结构(如
task_struct
、inode
、file
等)中添加void*
类型的security
字段,用于存储安全策略相关的元数据。 - 例如,SELinux 在
struct file
中通过f_security
字段存储文件的安全上下文(如 SID)。
- 在内核数据结构(如
Hook 函数:
- 在关键代码路径(如文件操作、进程创建、网络访问等)插入 Hook,由安全模块实现具体的访问控制逻辑。
- 例如,
file_permission
Hook 用于在文件访问前检查策略。
模块注册与卸载:
- 安全模块通过
register_security()
函数注册自身,内核维护一个链表管理所有加载的模块。 - 决策机制:默认采用“限制型”策略(即内核允许访问时,安全模块可拒绝;内核拒绝时直接跳过安全模块)。
- 安全模块通过
二、安全模块概述
1. 典型安全模块
SELinux(Security-Enhanced Linux):
- 由 NSA 开发,基于 **Mandatory Access Control (MAC)**,通过策略规则强制执行访问控制。
- 支持细粒度的策略(如基于类型、角色、用户和多级安全)。
- 适用于高安全需求的环境(如政府、金融系统)。
AppArmor:
- 由 Canonical 开发,基于 Path-Based Control,通过配置文件定义进程的访问权限。
- 策略语法简单,易于配置,适合快速部署。
- 适用于开发、测试环境或对易用性要求高的场景。
其他模块:
- Smack:简单标记保护,策略基于字符串标签。
- TOMOYO:基于路径和命令的白名单机制。
2. 安全模块的核心功能
- 访问控制:限制进程对文件、网络、设备等资源的访问。
- 审计与日志:记录安全事件,便于事后分析。
- 策略管理:动态加载或修改安全策略。
- 特权限制:即使 root 用户或特权进程也需符合策略。
三、SELinux 的配置与使用
1. 启用与模式配置
SELinux 有三种运行模式:
- Enforcing:强制执行策略,拒绝违规访问。
- Permissive:仅记录违规行为,不拒绝访问(用于调试)。
- Disabled:完全禁用 SELinux。
配置步骤:
# 查看当前模式
sestatus
# 修改模式(需重启生效)
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
2. 策略管理
SELinux 策略存储在 /etc/selinux
目录下,默认使用 targeted
策略(针对关键服务)。常用命令:
- 查看策略:
semanage permissive -l # 查看允许模式的域 semanage boolean -l # 查看布尔值配置
- 修改策略:
# 临时启用某布尔值 setsebool -P httpd_can_network_connect 1 # 永久设置某个域为允许模式 semanage permissive -a httpd_t
3. 常见问题处理
- 权限拒绝错误:
- 日志路径:
/var/log/audit/audit.log
- 使用
audit2allow
生成策略补丁:audit2allow -a > mypolicy.te checkmodule -M -m -o mypolicy.mod mypolicy.te semodule -i mypolicy.mod
- 日志路径:
四、AppArmor 的配置与使用
1. 启用与模式配置
AppArmor 默认可能未启用,需安装并配置:
sudo apt install apparmor apparmor-utils
sudo systemctl enable apparmor --now
# 查看状态
aa-status
2. 策略语法
AppArmor 策略文件(如 /etc/apparmor.d/usr.bin.firefox
)定义进程的访问规则:
# 允许读取 /usr/bin/firefox
/usr/bin/firefox {
# 读取二进制文件
/usr/bin/firefox mr,
# 写入临时目录
/tmp/ rw,
# 网络访问
network inet tcp,
# 其他规则...
}
3. 策略加载与调试
- 加载策略:
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.firefox
- 切换模式:
# 允许模式(仅记录) sudo aa-complain /usr/bin/firefox # 严格模式(强制执行) sudo aa-enforce /usr/bin/firefox
五、SELinux 与 AppArmor 的优缺点对比
特性 | SELinux | AppArmor |
---|---|---|
策略复杂度 | 高(基于类型、角色、多级安全) | 低(基于路径和简单规则) |
适用场景 | 企业级高安全需求(如 Red Hat、CentOS) | 开发、测试环境或轻量级系统(如 Ubuntu) |
配置难度 | 复杂,需熟悉策略语法和工具(semanage ) |
简单,直接修改配置文件 |
特权限制 | 严格限制 root 权限 | 仅限制配置的进程 |
审计能力 | 强大,支持细粒度日志 | 基础审计,依赖系统日志 |
性能开销 | 较高(策略检查复杂) | 较低(规则简单) |
六、适用场景建议
SELinux
- 适用场景:
- 需要严格控制所有进程的访问权限(如金融、政府系统)。
- 需要防御内部攻击(如 root 用户误操作或恶意进程)。
- 使用 Red Hat、CentOS 等默认启用 SELinux 的发行版。
AppArmor
- 适用场景:
- 开发或测试环境快速部署安全策略。
- 需要限制特定服务(如 Web 服务器、数据库)的访问权限。
- 使用 Ubuntu 等默认支持 AppArmor 的发行版。
七、总结
Linux 通过 LSM 框架提供了灵活的安全模块支持,SELinux 和 AppArmor 是其中的典型代表。SELinux 适合对安全要求极高的场景,但需要复杂配置;AppArmor 则以易用性和快速部署为优势。选择时需根据系统需求、团队技能和运维复杂度综合权衡。
参考资料:
Linux-系统安全
https://blog.cikaros.top/doc/ba6629c2.html