mysql datadir安全基线要求归属mysql:mysql且权限750,确保仅属主属组可访问;需递归修正归属、设目录权限、清理mysql组冗余成员,并在selinux/apparmor下配置对应安全上下文。

MySQL 数据目录(datadir)的安全基线是:仅属主(mysql 用户)和属组(mysql 组)可访问,其他人无任何权限。这不是“限制用户组”,而是通过精准的 Unix 权限模型 + 服务运行身份绑定来实现最小权限原则。
核心逻辑很简单:MySQL 服务进程以 `mysql` 用户身份运行,且默认也属于 `mysql` 组;只要目录归属正确、权限收紧,组内成员(即 `mysql` 组的其他用户)天然具备读写执行权——但现实中,`mysql` 组通常只包含 `mysql` 这一个系统用户,不会添加其他账号。因此,“仅对服务组可读”本质是确保该组不被滥用,而非开放给多个用户。
关键操作四步到位
1. 确保 datadir 及其所有子项归属 mysql:mysql
不能只改顶层目录,必须递归重置:sudo chown -R mysql:mysql /var/lib/mysql
若路径不同,请先用 mysql -e "SELECT @@datadir;" 或查配置文件确认真实路径。
2. 设置目录权限为 750(不是 755 或 775)sudo chmod 750 /var/lib/mysql
含义:属主(mysql)可读写执行(rwx),属组(mysql)可读执行(r-x),其他人(others)无权限(---)。
⚠️ 严禁使用 777、775 或 755——MySQL 8.0+ 启动时会主动拒绝 world-writable 目录,并报错退出。
3. 检查并清理 mysql 组成员
运行 getent group mysql 查看当前组成员。理想状态应只返回类似:mysql:x:27:mysqld 或 mysql:x:27:(空成员列表)
若发现非必要用户(如 admin、deploy 等)在 mysql 组中,立即移除:sudo gpasswd -d username mysql
4. SELinux 或 AppArmor 环境下补全安全上下文
- CentOS/RHEL:sudo semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?"sudo restorecon -Rv /var/lib/mysql
- Ubuntu(AppArmor):
确认 /etc/apparmor.d/usr.sbin.mysqld 中含行:/var/lib/mysql/** rwk,
然后执行 sudo systemctl reload apparmor











