如何使用AppArmor限制MySQL进程的权限?
美国、香港服务器
如何使用AppArmor限制MySQL进程的权限?
12-18 来源:
使用 AppArmor 限制 MySQL 进程权限,核心是通过定制化配置文件约束 MySQL 仅能访问必需的文件、网络和系统资源,即使 MySQL 被入侵,也能阻止攻击者利用其权限篡改系统文件、访问敏感目录。以下是适配 Ubuntu/Debian 系统的完整实操流程(MySQL 8.0 为例):
一、 前置准备
确认环境与状态
适用系统:Ubuntu 18.04+/Debian 10+(默认预装 AppArmor);
检查 AppArmor 状态(确保服务正常):
bash
运行
sudo systemctl status apparmor # 正常显示 active (exited)
sudo aa-status # 查看已加载的配置文件
检查 MySQL 路径(配置文件需与可执行文件路径对应):
bash
运行
which mysqld # 输出通常为 /usr/sbin/mysqld
安装依赖工具若缺少 AppArmor 管理工具,执行安装:
bash
运行
sudo apt update && sudo apt install -y apparmor apparmor-utils apparmor-profiles
二、 核心配置步骤(先投诉后强制,避免业务中断)
步骤 1:生成 MySQL 基础配置文件(投诉模式)
先在「投诉模式」下运行 MySQL,让 AppArmor 自动记录其正常业务所需的权限,生成基础规则模板(避免手动配置遗漏必要权限)。
bash
运行
# 1. 为 mysqld 启用投诉模式,自动生成配置文件
sudo aa-genprof mysqld
# 2. 终端会提示 "Start mysqld, then generate the profile",执行以下操作:
# 重启 MySQL 触发正常业务行为
sudo systemctl restart mysql
# 执行常规 MySQL 操作(模拟业务访问,让 AppArmor 记录权限)
mysql -u root -p # 登录数据库,执行简单查询(如 show databases;)
exit
# 3. 回到 aa-genprof 终端,按 Enter 扫描日志
# 按提示选择权限(默认选 "a"=allow 允许必要权限),全部确认后按 "f"=finish 结束生成
生成的配置文件路径:/etc/apparmor.d/usr.sbin.mysqld(对应 MySQL 主程序 /usr/sbin/mysqld)。
步骤 2:手动优化 MySQL 配置文件(关键)
自动生成的规则可能冗余或未限制敏感操作,需编辑配置文件,遵循「最小权限原则」,仅允许 MySQL 访问必需资源。
bash
运行
sudo nano /etc/apparmor.d/usr.sbin.mysqld
优化后的 MySQL 配置模板(适配主流部署场景,注释说明关键规则):
ini
# MySQL AppArmor 配置核心规则
/usr/sbin/mysqld {
# 继承系统基础规则(必需,包含库文件、基础命令访问)
#include
# 允许 DNS 解析(如连接外部主从节点)
# ========== 允许 MySQL 读取配置文件 ==========
/etc/mysql/** r,
/etc/mysql/mysql.conf.d/** r,
/etc/mysql/conf.d/** r,
/usr/share/mysql/** r,
# ========== 允许访问数据目录(核心) ==========
# 仅允许读写数据文件,禁止篡改(根据实际数据路径调整,默认 /var/lib/mysql)
/var/lib/mysql/** rwk,
/var/lib/mysql-files/ r,
/var/lib/mysql-files/** rwk,
/var/lib/mysql-keyring/** rwk,
# ========== 允许读写日志文件 ==========
/var/log/mysql/** rw,
/var/run/mysqld/mysqld.pid rw,
/var/run/mysqld/mysqld.sock rw,
# ========== 网络权限(按需限制) ==========
# 仅允许本地 TCP/UDP 连接(禁止外网随意访问,若主从同步可放开特定端口)
network inet tcp,
# 禁止 RAW 网络协议(防止伪造数据包)
deny network raw,
# ========== 禁止访问敏感系统目录(核心防护) ==========
deny /etc/shadow rw,
deny /root/** rw,
deny /home/** rw,
deny /tmp/** rwkl, # 禁止写入/tmp(防止生成恶意文件)
deny /bin/bash r, # 禁止执行 shell(防止提权)
# ========== 允许必要的系统调用 ==========
capability dac_override,
capability sys_resource,
capability setgid,
capability setuid,
# 允许读取系统库文件
/usr/lib/x86_64-linux-gnu/mysql/** r,
/lib/x86_64-linux-gnu/** r,
/usr/lib/x86_64-linux-gnu/** r,
}
配置语法说明:
规则 作用 示例
r 只读 /etc/mysql/** r
w 可写 /var/log/mysql/** rw
k 可锁定文件 /var/lib/mysql/** rwk
network inet tcp 允许 TCP 网络连接 -
deny 拒绝访问 deny /root/** rw
步骤 3:加载配置并切换到强制模式
bash
运行
# 1. 重新加载配置文件(检查语法错误)
sudo apparmor_parser -v -r /etc/apparmor.d/usr.sbin.mysqld
# 2. 将 MySQL 切换到强制模式(严格执行规则)
sudo aa-enforce /usr/sbin/mysqld
# 3. 重启 MySQL 使规则生效
sudo systemctl restart mysql
# 4. 验证模式(输出 "/usr/sbin/mysqld: enforce" 即为成功)
sudo aa-status | grep mysqld
三、 验证限制效果(核心步骤)
通过模拟「违规操作」,检查 AppArmor 是否拦截 MySQL 的越权行为:
1. 测试 1:尝试让 MySQL 写入敏感目录(如 /root)
bash
运行
# 切换到 mysql 用户(MySQL 进程默认运行用户)
sudo -u mysql touch /root/test.txt
# 查看 AppArmor 拦截日志
sudo grep -i "apparmor=DENIED" /var/log/syslog | grep mysqld
生效结果:日志中出现 apparmor="DENIED" 记录,且 /root/test.txt 未创建:
plaintext
Jul 10 15:00:00 ubuntu kernel: [12345.678] audit: type=1400 audit(1720600000.123:45): apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/root/test.txt" pid=6789 comm="mysqld" requested_mask="w" denied_mask="w" fsuid=112 ouid=0
2. 测试 2:验证正常业务不受影响
bash
运行
# 登录 MySQL 执行正常操作
mysql -u root -p -e "create database test_db; use test_db; create table test (id int);"
# 检查数据文件是否正常生成
ls /var/lib/mysql/test_db/ # 能看到 test.ibd 等文件,说明正常
四、 常用管理命令
临时切换到投诉模式(调试用)
bash
运行
sudo aa-complain /usr/sbin/mysqld
禁用 MySQL 的 AppArmor 规则(紧急排查)
bash
运行
sudo aa-disable /usr/sbin/mysqld
查看 MySQL 进程的 AppArmor 状态
bash
运行
# 查找 MySQL PID
MYSQL_PID=$(pgrep -f mysqld | head -1)
# 查看管控状态(显示 enforce/complain 即为生效)
sudo cat /proc/${MYSQL_PID}/attr/current
五、 注意事项
适配自定义路径:若 MySQL 数据目录、配置文件路径非默认(如 /data/mysql),需在配置文件中添加对应路径的权限(如 /data/mysql/** rwk)。
主从同步 / 备份适配:若 MySQL 需访问备份工具(如 mysqldump)或主从同步端口,需在配置中添加对应权限(如允许访问 /usr/bin/mysqldump)。
定期更新规则:MySQL 升级、业务变更后,需重新生成 / 优化规则(先投诉模式运行 1-2 天,再切强制模式)。
避免语法错误:修改配置后,先执行 apparmor_parser -v -r 配置文件 检查语法,再重启 MySQL。
六、 配置模板优化建议
生产环境可移除 capability dac_override(若业务允许),进一步降低权限;
禁止 MySQL 访问 /tmp 目录(防止攻击者利用临时文件提权);
限制网络连接:仅允许访问主从同步的 IP / 端口(如 network inet tcp dst 192.168.1.100:3306)。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快