当你的 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 发挥出最佳性能。敬请期待!















暂无评论内容