Ubuntu 系统安全加固:AppArmor、SELinux、审计系统 auditd 实战指南

当你的 Ubuntu 服务器从开发环境走向生产环境,安全加固就不再是一个可选项,而是必须完成的功课。攻击者可能利用未打补丁的服务、配置不当的权限、或者操作系统本身的漏洞入侵系统。今天,我们将深入 Ubuntu 的三道安全防线:AppArmor(强制访问控制)、SELinux(安全增强型 Linux)备选方案、以及 auditd(审计系统),手把手教你从零开始加固系统。


一、安全基础概念回顾

在开始之前,需要理解两个核心概念:

概念 说明
DAC(自主访问控制) Linux 传统权限模型。文件所有者决定谁能访问。我们之前学的 chmod/chown 就属于 DAC。
MAC(强制访问控制) 系统管理员定义的全局策略,超越用户权限。即使文件所有者给了 777 权限,MAC 策略仍然可以阻止程序访问。

AppArmor 和 SELinux 都是 MAC 的实现。Ubuntu 默认使用 AppArmor,而 CentOS/RHEL 使用 SELinux。


二、AppArmor:Ubuntu 的默认安全屏障

2.1 什么是 AppArmor

AppArmor(Application Armor)是一种基于路径的强制访问控制系统。它通过为每个程序定义”配置文件”(profile),限制程序能访问哪些文件、网络、以及拥有哪些能力(capability)。

简单说:AppArmor 给每个程序画了一个”安全围栏”,程序只能在围栏内活动。

2.2 检查 AppArmor 状态

Ubuntu 默认安装并启用了 AppArmor。先来看看它的状态:

# 查看 AppArmor 服务状态
sudo aa-status

输出示例:

apparmor module is loaded.
38 profiles are loaded.
38 profiles are in enforce mode.
   /snap/snapd/xxxx/usr/lib/snapd/snap-confine
   /usr/bin/evince
   /usr/bin/evince-previewer
   /usr/bin/evince-thumbnailer
   /usr/bin/evince-thumbnailer-libreoffice
   /usr/bin/ibus-engine
   /usr/bin/lxc-start
   /usr/bin/man
   /usr/bin/rsync
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/NetworkManager/nm-dhcp-helper
   /usr/lib/connman/scripts/dhclient-script
   ...

关键状态说明:
enforce(强制模式):违反策略的操作会被阻止并记录日志
complain(投诉模式):违反策略的操作不会被阻止,但会记录日志(用于调试和策略开发)
unconfined(未限制):没有加载任何 AppArmor 策略

2.3 查看已加载的 AppArmor 配置文件

所有配置文件存储在 /etc/apparmor.d/ 目录下:

# 列出所有配置文件
ls /etc/apparmor.d/

# 查看某个特定配置的内容(以 rsync 为例)
sudo cat /etc/apparmor.d/usr.bin.rsync

输出示例(rsync 配置文件片段):

# Last Modified: Wed Feb 14 15:21:46 2024
#include <tunables/global>

/usr/bin/rsync {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/openssl>

  capability dac_override,
  capability chown,
  capability fowner,
  capability setgid,
  capability setuid,

  /etc/rsync*.conf r,
  /etc/rsyncd.* r,
  /usr/bin/rsync mr,
  /usr/share/rsync/** r,
  /var/log/rsync/** rw,
  /var/run/rsyncd.pid rw,
}

2.4 管理 AppArmor 配置文件

# 将某个配置切换到 complain 模式(用于调试)
sudo aa-complain /usr/bin/rsync

# 切换回 enforce 模式
sudo aa-enforce /usr/bin/rsync

# 禁用某个配置(不推荐在生产环境用)
sudo aa-disable /usr/bin/rsync

# 手动加载/重新加载配置
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.rsync

# 重新加载所有配置
sudo systemctl reload apparmor

2.5 实战:为 Nginx 编写 AppArmor 配置文件

假设我们运行了一个 Nginx 服务器,内容目录在 /var/www/html/,我们希望限制 Nginx 只能访问这个目录,不能访问其他敏感文件。

步骤 1:生成配置文件框架

# 安装 apparmor-utils 工具包
sudo apt install -y apparmor-utils

# 使用 aa-genprof 生成配置文件(交互式)
sudo aa-genprof nginx

步骤 2:检查当前 Nginx 的 AppArmor 配置

如果 Nginx 是通过 apt 安装的,Ubuntu 可能已经带了默认配置:

ls /etc/apparmor.d/ | grep nginx

步骤 3:手动创建自定义配置

sudo tee /etc/apparmor.d/usr.sbin.nginx << 'EOF'
#include <tunables/global>

/usr/sbin/nginx {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/openssl>
  #include <abstractions/apache2-common>  # 复用一些通用配置

  capability dac_override,
  capability dac_read_search,
  capability net_bind_service,
  capability setgid,
  capability setuid,

  /usr/sbin/nginx mr,
  /etc/nginx/** r,
  /var/log/nginx/** rw,
  /var/www/html/** r,
  /var/lib/nginx/** rw,
  /run/nginx.pid rw,
  /run/nginx/** rw,
  /tmp/nginx/** rw,
}
EOF

步骤 4:加载并启用配置

# 加载配置
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

# 设置为 enforce 模式
sudo aa-enforce /usr/sbin/nginx

# 重启 Nginx
sudo systemctl restart nginx

# 验证状态
sudo aa-status | grep nginx

2.6 查看 AppArmor 日志

违反 AppArmor 策略的行为会被记录到系统日志:

# 查看 AppArmor 相关日志
sudo journalctl -u apparmor --no-pager -n 50

# 或者在 syslog 中搜索
sudo grep -i "apparmor" /var/log/syslog | tail -20

# 更精确地查看拒绝事件
sudo ausearch -m AVC -ts recent 2>/dev/null || sudo grep "DENIED" /var/log/syslog | grep apparmor

常见问题排查:如果某个服务启动失败,先检查 AppArmor 日志,看是否被策略阻止了。


三、SELinux:Ubuntu 上的备选方案

虽然 Ubuntu 默认使用 AppArmor,但你也完全可以在 Ubuntu 上安装和使用 SELinux(Security-Enhanced Linux)。

3.1 SELinux 与 AppArmor 对比

对比维度 AppArmor SELinux
策略模型 基于路径 基于标签(inode)
复杂度 相对简单 复杂,学习曲线陡峭
Ubuntu 默认 ✅ 是 ❌ 否
配置粒度 文件路径级别 文件标签 + 进程标签 + 用户标签
策略编写 容易上手 需要理解 TE(类型强制)
适用场景 大多数服务器场景 高安全等级环境(政府、军事)

3.2 在 Ubuntu 上安装 SELinux

# 安装 SELinux 用户空间工具
sudo apt install -y selinux-basics selinux-policy-default auditd

# 初始化 SELinux 文件标签
sudo selinux-activate

# 重启系统(SELinux 需要重启才能启用)
sudo reboot

重启后检查 SELinux 状态:

# 查看 SELinux 状态
sudo sestatus

# 输出示例
# SELinux status:                 enabled
# SELinuxfs mount:                /sys/fs/selinux
# SELinux root directory:         /etc/selinux
# Loaded policy name:             default
# Current mode:                   permissive
# Mode from config file:          permissive
# Policy MLS status:              enabled
# Policy deny_unknown status:     allowed
# Memory protection checking:     actual (secure)
# Max kernel policy version:      33

注意:SELinux 安装后默认处于 permissive(宽容模式),建议先在此模式下运行一段时间,确认没有问题后再切换到 enforcing(强制模式)。

3.3 SELinux 基本操作

# 切换 SELinux 模式(临时,重启失效)
sudo setenforce 0   # permissive
sudo setenforce 1   # enforcing

# 查看当前模式
getenforce

# 查看文件的安全上下文
ls -Z /var/www/html/index.html

# 查看进程的安全上下文
ps -Z | grep nginx

# 修改文件安全上下文
sudo chcon -t httpd_sys_content_t /var/www/html/index.html

# 恢复默认安全上下文
sudo restorecon -v /var/www/html/index.html

3.4 何时选择 SELinux 而非 AppArmor

  • 你的组织要求必须通过 SELinux 合规认证
  • 你需要管理的是跨应用的多层安全策略,而非单个应用的访问控制
  • 你过去有 RHEL/CentOS 经验,更熟悉 SELinux
  • 对大多数 Ubuntu 用户来说,AppArmor 已经足够,且集成度更高

四、auditd:Linux 审计系统

auditd 是 Linux 的用户空间审计系统,负责记录系统安全事件——谁在什么时候做了什么操作。它是安全合规(如 PCI DSS、ISO 27001)的必备组件。

4.1 安装与启动 auditd

# Ubuntu 默认可能已安装
sudo apt install -y auditd audispd-plugins

# 启动并设置开机自启
sudo systemctl enable --now auditd

# 检查状态
sudo systemctl status auditd

4.2 auditd 配置文件结构

主配置文件:/etc/audit/auditd.conf
规则文件:/etc/audit/rules.d/audit.rules

# 查看当前审计规则
sudo auditctl -l

# 查看审计守护进程状态
sudo auditctl -s

4.3 核心审计规则实战

审计规则用来监控特定的系统调用、文件访问、用户行为。

4.3.1 监控文件访问

# 创建规则文件
sudo tee /etc/audit/rules.d/security.rules << 'EOF'
# 监控 /etc/passwd 的写操作(用户创建、密码修改)
-w /etc/passwd -p wa -k identity

# 监控 /etc/shadow 的访问
-w /etc/shadow -p wa -k identity

# 监控 /etc/ssh/sshd_config 的修改
-w /etc/ssh/sshd_config -p wa -k sshd_config

# 监控 /etc/sudoers 的修改
-w /etc/sudoers -p wa -k sudoers

# 监控重要系统二进制文件
-w /usr/bin/passwd -p x -k passwd_exec
-w /usr/bin/su -p x -k su_exec
-w /usr/bin/sudo -p x -k sudo_exec

# 监控关键目录
-w /var/www/html/ -p wa -k web_content
-w /etc/nginx/ -p wa -k nginx_config

# 监控系统调用 - 记录所有用户ID(UID)变化
-a always,exit -S setuid -S setgid -S setreuid -S setregid -k identity

# 记录所有失败的登录尝试
-a always,exit -S open -F dir=/var/log/ -F success=0 -k log_fail
EOF

规则字段说明
-w:监控文件路径
-p:权限掩码(r=读, w=写, x=执行, a=属性修改)
-k:日志关键词(用于后续搜索)
-a:添加规则到列表(always,exit 表示系统调用退出时触发)
-S:监控的系统调用
-F:过滤条件

4.3.2 加载规则

# 手动加载规则(立即生效)
sudo auditctl -R /etc/audit/rules.d/security.rules

# 或重新加载 auditd 服务(持久化)
sudo systemctl restart auditd

4.4 搜索审计日志

审计日志默认存储在 /var/log/audit/audit.log

# 使用 ausearch 搜索(推荐)
# 搜索关键词为 identity 的事件
sudo ausearch -k identity -ts today

# 搜索特定用户的事件
sudo ausearch -ua root -ts today

# 搜索特定文件的操作
sudo ausearch -f /etc/passwd -ts today

# 搜索失败的登录尝试
sudo ausearch -m USER_LOGIN --success no -ts today

# 使用 aureport 生成报告
# 生成今日事件摘要报告
sudo aureport -ts today

# 用户登录报告
sudo aureport -l -ts today

# 文件访问报告
sudo aureport -f -ts today

# 系统调用异常报告
sudo aureport -s -ts today

4.5 日志轮转配置

审计日志可能增长很快,需要配置日志轮转:

# 查看 auditd 日志配置
sudo grep -E "^(max_log_file|num_logs|max_log_file_action|space_left_action)" /etc/audit/auditd.conf

典型配置:

# /etc/audit/auditd.conf 相关参数
max_log_file = 50          # 每个日志文件 50MB
num_logs = 10              # 保留 10 个日志文件
max_log_file_action = ROTATE  # 达到上限后轮转
space_left_action = SYSLOG    # 磁盘空间不足时写入 syslog
action_mail_acct = root       # 告警通知邮箱

4.6 实战场景:追踪可疑行为

假设你怀疑有人未经授权修改了 /etc/ssh/sshd_config

# 1. 搜索相关审计事件
sudo ausearch -k sshd_config -ts 7 days ago

# 2. 查看具体时间线
sudo aureport -f -i -ts 7 days ago | grep sshd_config

# 3. 找出执行修改的用户
sudo ausearch -k sshd_config -ts 7 days ago | grep -o 'uid=[0-9]*' | sort -u

# 4. 如果知道进程 ID,查看所有相关事件
sudo ausearch -p 12345 -ts today

五、安全加固清单(综合实践)

将今天学到的三件武器组合起来,形成一个完整的安全加固流程:

5.1 一键加固脚本

#!/bin/bash
# ubuntu-security-hardening.sh — 系统安全加固脚本

set -euo pipefail

echo "===== 开始系统安全加固 ====="

# 1. 更新系统
echo "[1/6] 更新系统软件包..."
apt update && apt upgrade -y

# 2. 确保 AppArmor 已启用
echo "[2/6] 检查 AppArmor 状态..."
if sudo aa-status --enabled 2>/dev/null; then
    echo "  ✅ AppArmor 已启用"
    # 将所有配置文件设置为 enforce 模式
    sudo aa-enforce /etc/apparmor.d/*
else
    echo "  ⚠️  AppArmor 未启用,正在安装..."
    apt install -y apparmor apparmor-profiles apparmor-utils
    sudo systemctl enable --now apparmor
fi

# 3. 安装并配置 auditd
echo "[3/6] 配置审计系统..."
apt install -y auditd audispd-plugins

# 设置核心审计规则
cat > /etc/audit/rules.d/hardening.rules << 'RULEFILE'
# 身份管理
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
# SSH 配置
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 权限提权
-w /usr/bin/sudo -p x -k sudo_exec
-w /etc/sudoers -p wa -k sudoers
# 系统调用审计
-a always,exit -S setuid -S setgid -k identity
RULEFILE

augenrules --load
systemctl restart auditd

# 4. 配置自动安全更新
echo "[4/6] 配置自动安全更新..."
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

# 5. 加固 SSH 配置
echo "[5/6] 加固 SSH 配置..."
sed -i 's/^#PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^#MaxAuthTries.*/MaxAuthTries 3/' /etc/ssh/sshd_config
systemctl restart sshd

# 6. 启用防火墙
echo "[6/6] 配置 UFW 防火墙..."
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw --force enable

echo ""
echo "===== 加固完成!请检查以下内容 ====="
echo "  - AppArmor: $(sudo aa-status 2>/dev/null | grep -c 'enforce mode') 个配置文件处于 enforce 模式"
echo "  - Auditd: $(sudo auditctl -s 2>/dev/null | grep 'enabled' | awk '{print $2}')"
echo "  - UFW: $(sudo ufw status | grep -c 'active') 已启用"
echo "  - SSH: 密钥认证已强制,密码登录已禁用"
echo "  - 安全更新: 自动安装已配置"

5.2 验证加固效果

# 检查 AppArmor
sudo aa-status | head -5

# 检查审计规则
sudo auditctl -l | wc -l

# 测试审计日志是否正常工作
sudo touch /etc/test_audit.txt
sudo ausearch -k identity -ts recent | tail -3
sudo rm /etc/test_audit.txt

六、常见问题与排错

问题 1:服务启动失败,怀疑 AppArmor 阻止

# 1. 查看 AppArmor 日志
sudo journalctl -u apparmor --no-pager -n 30

# 2. 临时切换到 complain 模式
sudo aa-complain /usr/sbin/nginx
sudo systemctl restart nginx

# 3. 如果服务正常启动,说明是 AppArmor 策略过于严格
# 调整配置文件后重新启用
sudo aa-enforce /usr/sbin/nginx

问题 2:auditd 日志增长过快

# 检查日志大小
ls -lh /var/log/audit/audit.log

# 调大日志轮转参数
sudo sed -i 's/^max_log_file = .*/max_log_file = 100/' /etc/audit/auditd.conf
sudo sed -i 's/^num_logs = .*/num_logs = 5/' /etc/audit/auditd.conf
sudo systemctl restart auditd

问题 3:AppArmor 与 Docker 的兼容性

Docker 在 Ubuntu 上默认与 AppArmor 配合良好,因为 Docker 自动加载了 docker-default 配置文件:

# 检查 Docker 的 AppArmor 配置
sudo aa-status | grep docker

# 如果需要自定义 Docker 容器的 AppArmor 配置
docker run --security-opt apparmor=my-custom-profile -it ubuntu bash

总结

今天我们系统地学习了 Ubuntu 安全加固的三大核心组件:

组件 作用 日常维护频率
AppArmor 程序行为限制,防止越权访问 安装新服务时检查策略
SELinux 备选 MAC 方案,更高安全等级 仅在需要时启用
auditd 安全事件审计,追溯可疑行为 定期检查审计报告

安全加固的核心原则:最小权限、纵深防御、持续审计。没有一劳永逸的安全方案,只有不断维护和改进的安全习惯。


📌 下期预告:第 23 天 — 性能调优与内核参数

我们将深入 Linux 内核参数调优,学习如何通过 sysctl 调整网络栈、内存管理、IO 调度器,以及如何设置 ulimit 限制、优化 CPU 频率调节策略,让 Ubuntu 发挥出最佳性能。敬请期待!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容