核心是创建专用系统用户并禁用交互、严格绑定目录属主与750权限、通过systemd限制运行身份与能力、配合selinux上下文及安全挂载选项,实现mysql进程最小权限隔离。

为数据库数据目录(如 /var/lib/mysql)配置严苛的属主隔离,核心是让 MySQL 进程只能以最小权限身份访问自身数据,同时彻底切断其他用户、组或进程的越权路径。这不是仅改个 chown 就完事,而是一套从用户创建、目录归属、权限收紧到运行时约束的闭环控制。
一、创建专用系统用户并禁用所有交互入口
不复用 root 或普通用户,也不用带 shell 的账户:
- 执行
sudo useradd -r -s /sbin/nologin -M -U mysql:-r 确保 UID 落在系统范围(1–999),-s /sbin/nologin 彻底关闭登录能力,-M 避免生成家目录,-U 自动建同名主组 - 检查
/etc/passwd中 mysql 行的 shell 字段必须是/sbin/nologin,不是空值或/bin/bash - 确认
/etc/shadow中 mysql 密码字段为*或!,无有效哈希 - 确保该用户未加入
wheel、sudo、docker等任何高权限组
二、精确绑定数据目录归属与权限基线
所有权必须严格对齐,且禁止“过度放行”:
- 递归设置属主属组:
sudo chown -R mysql:mysql /var/lib/mysql - 设目录权限为
750:sudo chmod 750 /var/lib/mysql(属主全权、属组可读+进入、其他人无任何权限) - 上级路径(如
/var/lib)也需收紧:sudo chmod 750 /var/lib,防止通过遍历进入 - 禁用 setuid/setgid 位:
sudo find /var/lib/mysql -type f -perm /6000 -exec chmod a-s {} \;
三、配合 systemd 强制运行身份与能力限制
即使用户和目录都对了,进程仍可能获得过高能力,必须在服务层再锁一道:
- 编辑 MySQL 的 systemd 单元文件(如
/usr/lib/systemd/system/mysqld.service或覆盖片段),确保含以下关键项: -
User=mysql和Group=mysql -
NoNewPrivileges=yes(禁止 fork 后提权) -
CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_NET_RAW CAP_IPC_LOCK CAP_SYS_MODULE(显式剔除危险能力) - 如需监听低端端口,只加必要项:
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
四、补充加固:SELinux 上下文与挂载选项
在启用 SELinux 的系统上,仅改属主不够,上下文不匹配照样被拒:
- 为数据目录打正确标签:
sudo semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?" - 应用变更:
sudo restorecon -Rv /var/lib/mysql - 若使用独立磁盘分区,挂载时添加
noexec,nosuid,nodev选项,从文件系统层阻断恶意执行
整套操作完成后,MySQL 进程将以无登录能力、无密码、无 sudo、无危险 capability、仅能访问自己目录的身份运行——既满足功能需求,又守住最小权限边界。不复杂但容易忽略。











