1. 首页 > MySQL教程 > 正文

MySQL教程FG206-MySQL SELinux适配

Part01-基础概念与理论知识

1.1 SELinux概述

SELinux(Security-Enhanced Linux)是一种强制访问控制(MAC)安全机制,内置于Linux内核中。它通过对系统资源和进程实施细粒度的访问控制,提高系统的安全性。风哥教程参考MySQL官方文档Security部分的SELinux相关内容。更多视频教程www.fgedu.net.cn

# 检查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

1.2 SELinux模式与策略

SELinux有三种运行模式:enforcing(强制模式)、permissive(宽容模式)和disabled(禁用模式)。它使用安全策略来定义主体(进程)对客体(文件、网络端口等)的访问权限。学习交流加群风哥微信: itpux-com

SELinux模式说明:1. enforcing:强制模式,严格执行SELinux策略;2. permissive:宽容模式,记录违规行为但不阻止;3. disabled:禁用模式,完全关闭SELinux。

1.3 MySQL与SELinux的交互

MySQL在SELinux环境中运行时,需要正确配置SELinux策略,以确保MySQL进程能够访问必要的文件和资源。SELinux通过安全上下文(Security Context)来控制对资源的访问。学习交流加群风哥QQ113257174

# 查看MySQL进程的安全上下文
# 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。

生产环境建议:1. 保持SELinux处于enforcing模式;2. 使用官方提供的SELinux策略模块;3. 避免修改默认的安全上下文;4. 定期检查SELinux日志,及时处理违规行为。

2.2 安全上下文管理

安全上下文是SELinux控制访问的核心,它由用户、角色、类型和级别组成。MySQL相关的文件和进程需要有正确的安全上下文,才能被MySQL进程访问。更多学习教程公众号风哥教程itpux_com

# 查看默认的MySQL安全上下文类型
# 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

# 查看SELinux日志中的MySQL相关错误
# 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的状态,了解当前的运行模式和策略。

# 检查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模块、设置正确的安全上下文等。

# 安装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访问特定的资源或执行特定的操作。

# 创建自定义SELinux规则文件
# 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访问这些目录。

# 步骤1:创建自定义数据目录
# 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的限制,需要进行相应的配置。

# 步骤1:查看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工具等方法进行排查。

# 步骤1:查看SELinux日志中的MySQL相关错误
# 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适配的关键点:

风哥提示:SELinux是Linux系统的重要安全机制,在生产环境中应该保持启用状态。正确配置MySQL与SELinux的交互,可以在提高系统安全性的同时,确保MySQL的正常运行。

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相关的问题。

生产环境最佳实践:1. 保持SELinux处于enforcing模式;2. 使用官方提供的MySQL SELinux模块;3. 为自定义目录设置正确的安全上下文;4. 为非标准端口添加SELinux端口类型;5. 定期检查SELinux日志;6. 建立SELinux故障应急响应机制。
GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息