Part01-基础概念与理论知识
1.1 SELinux概述
SELinux(Security-Enhanced Linux)是一种强制访问控制(MAC)安全机制,内置于Linux内核中。它通过对系统资源和进程实施细粒度的访问控制,提高系统的安全性。风哥教程参考MySQL官方文档Security部分的SELinux相关内容。更多视频教程www.fgedu.net.cn
# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 33
1.2 SELinux模式与策略
SELinux有三种运行模式:enforcing(强制模式)、permissive(宽容模式)和disabled(禁用模式)。它使用安全策略来定义主体(进程)对客体(文件、网络端口等)的访问权限。学习交流加群风哥微信: itpux-com
1.3 MySQL与SELinux的交互
MySQL在SELinux环境中运行时,需要正确配置SELinux策略,以确保MySQL进程能够访问必要的文件和资源。SELinux通过安全上下文(Security Context)来控制对资源的访问。学习交流加群风哥QQ113257174
# ps -Z $(pgrep mysqld)
LABEL PID TTY TIME CMD
system_u:system_r:mysqld_t:s0 1234 ? 00:00:00 mysqld
# 查看MySQL数据目录的安全上下文
# ls -Z /mysql/data/
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 .
drwxr-xr-x. root root system_u:object_r:default_t:s0 ..
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 auto.cnf
-rw——-+ mysql mysql system_u:object_r:mysqld_db_t:s0 ca-key.pem
-rw-r–r–+ mysql mysql system_u:object_r:mysqld_db_t:s0 ca.pem
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 client-cert.pem
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 client-key.pem
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 ib_buffer_pool
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 ibdata1
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 ib_logfile0
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 ib_logfile1
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 ibtmp1
drwxr-x—+ mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
drwxr-x—+ mysql mysql system_u:object_r:mysqld_db_t:s0 performance_schema
drwxr-x—+ mysql mysql system_u:object_r:mysqld_db_t:s0 sys
drwxr-x—+ mysql mysql system_u:object_r:mysqld_db_t:s0 fgedudb
Part02-生产环境规划与建议
2.1 SELinux配置规划
在生产环境中,需要合理规划SELinux配置,确保MySQL能够正常运行的同时,保持系统的安全性。风哥提示:生产环境中建议将SELinux设置为enforcing模式,并正确配置MySQL相关的SELinux策略,而不是简单地禁用SELinux。
2.2 安全上下文管理
安全上下文是SELinux控制访问的核心,它由用户、角色、类型和级别组成。MySQL相关的文件和进程需要有正确的安全上下文,才能被MySQL进程访问。更多学习教程公众号风哥教程itpux_com
# semanage fcontext -l | grep mysqld
/mysql(/.*)? all files system_u:object_r:mysqld_db_t:s0
/var/lib/mysql(/.*)? all files system_u:object_r:mysqld_db_t:s0
/var/lib/mysql-files(/.*)? all files system_u:object_r:mysqld_var_run_t:s0
/var/lib/mysql-keyring(/.*)? all files system_u:object_r:mysqld_keyring_t:s0
/var/lib/mysql/mysql.sock socket system_u:object_r:mysqld_var_run_t:s0
/var/run/mysqld(/.*)? all files system_u:object_r:mysqld_var_run_t:s0
/var/log/mysql(/.*)? all files system_u:object_r:mysqld_log_t:s0
2.3 常见SELinux问题
在MySQL运行过程中,常见的SELinux问题包括:MySQL无法访问自定义目录、无法绑定非标准端口、无法连接到网络等。这些问题通常是由于SELinux策略限制导致的。from MySQL:www.itpux.com
# grep mysqld /var/log/audit/audit.log
type=AVC msg=audit(1712000000.123:456): avc: denied { write } for pid=1234 comm=”mysqld” name=”data” dev=”sdb” ino=123456789 scontext=system_u:system_r:mysqld_t:s0 tcontext=system_u:object_r:default_t:s0 tclass=dir permissive=0
Part03-生产环境项目实施方案
3.1 SELinux状态检查
在配置MySQL与SELinux之前,需要先检查SELinux的状态,了解当前的运行模式和策略。
# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 33
# 检查SELinux模式
# getenforce
Enforcing
# 临时切换SELinux模式(用于测试)
# setenforce 0
# getenforce
Permissive
# 恢复SELinux模式
# setenforce 1
# getenforce
Enforcing
3.2 MySQL SELinux策略配置
MySQL的SELinux策略配置包括安装MySQL相关的SELinux模块、设置正确的安全上下文等。
# yum install -y mysql-selinux
# 查看MySQL SELinux模块
# semodule -l | grep mysql
mysql 1.0.0
# 查看MySQL相关的SELinux布尔值
# getsebool -a | grep mysql
mysql_connect_any –> off
mysql_execmem –> off
mysql_setrlimit –> off
mysql_tls_enabled –> on
mysql_zone_transition –> off
3.3 自定义SELinux规则
在某些情况下,需要创建自定义的SELinux规则,以允许MySQL访问特定的资源或执行特定的操作。
# vi mysql_custom.te
module mysql_custom 1.0;
require {
type mysqld_t;
type default_t;
class dir { read write add_name remove_name search };
class file { read write create unlink };
}
allow mysqld_t default_t:dir { read write add_name remove_name search };
allow mysqld_t default_t:file { read write create unlink };
# 编译SELinux模块
# checkmodule -M -m -o mysql_custom.mod mysql_custom.te
# 创建SELinux模块包
# semodule_package -o mysql_custom.pp -m mysql_custom.mod
# 安装SELinux模块
# semodule -i mysql_custom.pp
# 查看已安装的SELinux模块
# semodule -l | grep mysql
mysql 1.0.0
mysql_custom 1.0
Part04-生产案例与实战讲解
4.1 配置SELinux允许MySQL访问自定义目录
当MySQL需要访问自定义目录(如非默认的数据目录、备份目录等)时,需要配置SELinux以允许MySQL访问这些目录。
# mkdir -p /mysql/data
# chown -R mysql:mysql /mysql/data
# 步骤2:设置SELinux安全上下文
# semanage fcontext -a -t mysqld_db_t “/mysql/data(/.*)?”
# 步骤3:应用安全上下文
# restorecon -Rv /mysql/data
restorecon reset /mysql/data context system_u:object_r:default_t:s0->system_u:object_r:mysqld_db_t:s0
restorecon reset /mysql/data/auto.cnf context system_u:object_r:default_t:s0->system_u:object_r:mysqld_db_t:s0
restorecon reset /mysql/data/ibdata1 context system_u:object_r:default_t:s0->system_u:object_r:mysqld_db_t:s0
# 步骤4:验证安全上下文
# ls -Z /mysql/data/
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 .
drwxr-xr-x. root root system_u:object_r:default_t:s0 ..
-rw-r—–+ mysql mysql system_u:object_r:mysqld_db_t:s0 auto.cnf
-rw——-+ mysql mysql system_u:object_r:mysqld_db_t:s0 ca-key.pem
-rw-r–r–+ mysql mysql system_u:object_r:mysqld_db_t:s0 ca.pem
4.2 解决MySQL网络访问问题
当MySQL需要绑定非标准端口或访问网络资源时,可能会遇到SELinux的限制,需要进行相应的配置。
# semanage port -l | grep mysql
mysqld_port_t tcp 3306, 33060-33061
# 步骤2:添加自定义端口到MySQL端口类型
# semanage port -a -t mysqld_port_t -p tcp 3307
# 步骤3:验证端口配置
# semanage port -l | grep mysql
mysqld_port_t tcp 3306, 3307, 33060-33061
# 步骤4:允许MySQL连接到网络
# setsebool -P mysql_connect_any on
# 验证布尔值设置
# getsebool mysql_connect_any
mysql_connect_any –> on
4.3 SELinux故障排查
在MySQL运行过程中,如果遇到SELinux相关的问题,可以通过查看SELinux日志、使用audit2allow工具等方法进行排查。
# grep mysqld /var/log/audit/audit.log
type=AVC msg=audit(1712000000.123:456): avc: denied { write } for pid=1234 comm=”mysqld” name=”data” dev=”sdb” ino=123456789 scontext=system_u:system_r:mysqld_t:s0 tcontext=system_u:object_r:default_t:s0 tclass=dir permissive=0
# 步骤2:使用audit2allow工具分析错误
# grep mysqld /var/log/audit/audit.log | audit2allow -M mysql_custom
# 步骤3:安装生成的SELinux模块
# semodule -i mysql_custom.pp
# 步骤4:验证MySQL是否正常运行
# systemctl status mysqld
● mysqld.service – MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2026-04-01 11:00:00 CST; 5min ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 1234 ExecStart=/usr/sbin/mysqld –daemonize –pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 1230 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 1234 (mysqld)
Status: “Server is operational”
Tasks: 38
Memory: 300.0M
CGroup: /system.slice/mysqld.service
└─1234 /usr/sbin/mysqld –daemonize –pid-file=/var/run/mysqld/mysqld.pid
Part05-风哥经验总结与分享
通过多年的MySQL数据库管理经验,我总结了以下关于MySQL SELinux适配的关键点:
1. SELinux模式选择:生产环境中建议使用enforcing模式,测试环境可以使用permissive模式进行调试。
2. 安全上下文管理:为MySQL相关的文件和目录设置正确的安全上下文,避免使用chcon命令手动修改,应该使用semanage命令进行永久配置。
3. 端口管理:对于非标准MySQL端口,需要将其添加到mysqld_port_t类型中,以允许MySQL绑定这些端口。
4. 布尔值配置:根据需要配置MySQL相关的SELinux布尔值,如mysql_connect_any等。
5. 日志分析:定期查看SELinux日志,及时发现和解决MySQL相关的SELinux问题。
6. 故障排查:掌握使用audit2allow工具分析SELinux错误的方法,快速解决SELinux相关的问题。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
