Linux-系统安全

全面了解SELinux/AppArmor等安全模块

一、Linux 对安全模块的支持:LSM 框架

Linux 内核通过 Linux Security Module (LSM) 框架提供了对安全模块的通用支持。LSM 是一个轻量级、可扩展的访问控制框架,允许在内核中动态加载不同的安全策略模块(如 SELinux、AppArmor、Smack 等)。其核心设计目标是:

  1. 模块化:支持多种安全模型以可加载内核模块的形式实现。
  2. 通用性:通过统一的接口(Hook 函数)和安全域(Security Domain)机制,减少对内核的侵入性修改。
  3. 灵活性:允许策略动态调整,同时兼容传统的 DAC(自主访问控制)机制。

LSM 的关键机制

  1. 安全域(Security Domain)

    • 在内核数据结构(如 task_structinodefile 等)中添加 void* 类型的 security 字段,用于存储安全策略相关的元数据。
    • 例如,SELinux 在 struct file 中通过 f_security 字段存储文件的安全上下文(如 SID)。
  2. Hook 函数

    • 在关键代码路径(如文件操作、进程创建、网络访问等)插入 Hook,由安全模块实现具体的访问控制逻辑。
    • 例如,file_permission Hook 用于在文件访问前检查策略。
  3. 模块注册与卸载

    • 安全模块通过 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
作者
Cikaros
发布于
2025年3月15日
许可协议