如何检查AppArmor配置文件是否生效?
美国、香港服务器
如何检查AppArmor配置文件是否生效?
12-18 来源:
检查 AppArmor 配置文件是否生效,核心是验证 配置文件是否加载、进程是否处于指定管控模式、规则是否实际拦截违规操作,可通过以下多层级方法逐一验证,覆盖从基础状态到实际拦截效果的全维度检查:
一、 基础检查:确认 AppArmor 服务与配置加载状态
首先确认 AppArmor 服务正常运行,且目标配置文件已被系统加载。
1. 检查 AppArmor 服务状态
bash
运行
sudo systemctl status apparmor
正常结果:显示 active (exited)(AppArmor 是内核模块级服务,无常驻进程,此状态为正常);
异常结果:显示 inactive (dead),需执行 sudo systemctl start apparmor && sudo systemctl enable apparmor 启动并开机自启。
2. 查看已加载的配置文件列表
bash
运行
# 方法1:简洁查看已加载的配置(推荐)
sudo aa-status
# 方法2:查看内核加载的配置文件
sudo cat /sys/kernel/security/apparmor/profiles
关键验证点:输出中需包含目标进程的配置文件(如 Nginx 对应 usr.sbin.nginx,MySQL 对应 usr.sbin.mysqld);
示例正常输出(Nginx 配置生效):
plaintext
apparmor module is loaded.
12 profiles are loaded.
1 profiles are in enforce mode.
/usr/sbin/nginx
11 profiles are in complain mode.
...
3. 检查单个配置文件的加载状态
针对特定进程(如 Nginx),直接验证其配置文件是否加载:
bash
运行
# 替换为目标配置文件名称(如 usr.sbin.nginx)
sudo aa-status | grep -i "usr.sbin.nginx"
生效结果:输出包含 usr.sbin.nginx,且标注模式(enforce/complain);
未生效结果:无输出,说明配置文件未加载。
二、 精准检查:确认进程的管控模式(Enforce/Complain)
AppArmor 配置生效的核心是「进程绑定到指定模式」,需验证目标进程是否处于预期的管控模式(强制 / 投诉)。
1. 查看单个进程的模式
bash
运行
# 格式:sudo aa-enforce/aa-complain --print 进程名
# 示例:检查 Nginx 模式
sudo aa-enforce --print /usr/sbin/nginx
# 或简化命令
sudo aa-status | grep -E "enforce|complain" | grep nginx
强制模式生效:输出 Setting /usr/sbin/nginx to enforce mode.(若已为 enforce,会提示「already in enforce mode」);
投诉模式生效:输出 Setting /usr/sbin/nginx to complain mode.;
未生效:提示 Could not find profile for /usr/sbin/nginx,说明配置文件未加载或命名错误。
2. 通过进程 PID 验证模式
找到目标进程的 PID,直接查看内核层面的管控状态:
bash
运行
# 1. 查找进程PID(以Nginx为例)
NGINX_PID=$(pgrep -f nginx | head -1)
# 2. 查看该PID的AppArmor状态
sudo cat /proc/${NGINX_PID}/attr/current
生效结果:输出配置文件名称(如 usr.sbin.nginx (enforce) 或 usr.sbin.nginx (complain));
未生效结果:输出 unconfined(表示进程未被 AppArmor 管控)。
三、 实操验证:测试规则是否实际拦截违规操作
这是最核心的验证步骤 —— 通过模拟「违规操作」,检查 AppArmor 是否按配置拦截,确保规则不是「空加载」。
以 Nginx 配置为例(假设规则禁止写入 /var/www/html):
模拟违规操作:
Nginx 进程默认以 www-data 用户运行,尝试让其写入网站根目录(配置中仅允许读取):
bash
运行
# 切换到www-data用户,尝试写入文件
sudo -u www-data echo "malicious content" > /var/www/html/test.txt
检查拦截日志:
AppArmor 会将「拒绝操作」记录到系统日志(/var/log/syslog 或 /var/log/auth.log):
bash
运行
sudo grep -i "apparmor=DENIED" /var/log/syslog | grep -i nginx
结果判断:
生效:日志中出现类似以下记录,说明规则拦截成功:
plaintext
Jun 10 10:00:00 ubuntu kernel: [12345.678901] audit: type=1400 audit(1718000000.123:45): apparmor="DENIED" operation="open" profile="/usr/sbin/nginx" name="/var/www/html/test.txt" pid=1234 comm="nginx" requested_mask="w" denied_mask="w" fsuid=33 ouid=0
未生效:无上述日志,且 test.txt 被成功创建,说明规则未生效(需检查配置文件语法 / 加载状态)。
四、 排查配置未生效的常见原因
若检查发现配置未生效,优先排查以下问题:
配置文件语法错误:加载配置时检查语法,避免格式错误:
bash
运行
sudo apparmor_parser -v -r /etc/apparmor.d/usr.sbin.nginx
语法正确:无报错,正常加载;
语法错误:输出 syntax error,需修正配置文件(如缺少逗号、路径错误)。
配置文件命名 / 路径错误:AppArmor 配置文件需与进程可执行文件路径对应(如 /usr/sbin/nginx 对应配置文件 usr.sbin.nginx),命名格式为「路径替换 / 为 .」。
进程未重启:修改配置后,需重启目标进程(如 Nginx),让新规则生效:
bash
运行
sudo systemctl restart nginx
配置文件未重新加载:修改配置后,需执行以下命令重新加载:
bash
运行
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
总结:检查流程速览
检查维度 核心命令 生效判断标准
服务状态 systemctl status apparmor 状态为 active (exited)
配置加载 `aa-status grep 进程名 ` 输出包含目标配置文件
进程模式 cat /proc/PID/attr/current 显示 进程名 (enforce/complain)
实际拦截效果 grep "apparmor=DENIED" /var/log/syslog 违规操作被记录为 DENIED
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快