20.4. 配置示例
20.4.1. MariaDB 更改数据库位置 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
使用 Red Hat Enterprise Linux 时,MariaDB 用于存储其数据库的默认位置是
/var/lib/mysql/。这是默认情况下 SELinux 预期为它的位置,因此这个区域已为您进行适当标记,使用 mysqld_db_t 类型。
数据库的存储位置可以根据个人环境要求或首选项来更改,但务必要让 SELinux 知道这个新位置;它应相应地进行标记。这个示例解释了如何更改 MariaDB 数据库的位置,以及如何标记新位置,以便 SELinux 仍然可以根据其内容向新区域提供保护机制。
请注意,这只是一个示例,并演示 SELinux 如何影响 MariaDB。MariaDB 的综合文档不在本文的讨论范围之内。详情请查看官方 MariaDB 文档。本例假定安装了 mariadb-server 和 setroubleshoot-server 软件包,
auditd 服务正在运行,并且 /var/lib/mysql/ 的默认位置中有一个有效的数据库。
- 查看
mysql的默认数据库位置的 SELinux 上下文:ls -lZ /var/lib/mysql
~]# ls -lZ /var/lib/mysql drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这将显示mysqld_db_t,这是数据库文件位置的默认上下文元素。此上下文必须手动应用到本示例中将使用的新数据库位置,才能正常工作。 - 输入以下命令,输入
mysqldroot 密码来显示可用的数据库:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 停止
mariadb.service服务:systemctl stop mariadb.service
~]# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 为数据库的新位置创建一个新目录。在本例中,使用了
/mysql/:mkdir -p /mysql
~]# mkdir -p /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 将数据库文件复制到新位置:
cp -R /var/lib/mysql/* /mysql/
~]# cp -R /var/lib/mysql/* /mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 更改此位置的所有权,以允许 mysql 用户和组访问。这会设置 SELinux 仍然会观察到的传统 Unix 权限:
chown -R mysql:mysql /mysql
~]# chown -R mysql:mysql /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 输入以下命令查看新目录的初始上下文:
ls -lZ /mysql
~]# ls -lZ /mysql drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这个新创建的目录的上下文usr_t目前不适用于 SELinux 作为 MariaDB 数据库文件的位置。上下文更改后,MariaDB 将能够在此领域正常工作。 - 使用文本编辑器打开主 MariaDB 配置文件
/etc/my.cnf,并修改datadir选项,使其引用新位置。在本例中,应输入的值为/mysql:[mysqld] datadir=/mysql
[mysqld] datadir=/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 保存此文件并退出。 - 启动
mariadb.service。该服务应该无法启动,拒绝信息将记录到/var/log/messages文件中:systemctl start mariadb.service
~]# systemctl start mariadb.service Job for mariadb.service failed. See 'systemctl status mariadb.service' and 'journalctl -xn' for details.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 但是,如果审计守护进程与setroubleshoot服务一同运行,则拒绝将记录到/var/log/audit/audit.log文件中:SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此拒绝的原因是/mysql/没有针对 MariaDB 数据文件正确标记。SELinux 正在阻止 MariaDB 访问标记为usr_t的内容。执行以下步骤解决这个问题: - 输入以下命令为
/mysql/添加上下文映射。请注意,默认情况下不安装semanage工具。如果您的系统中没有它,请安装 policycoreutils-python 软件包。semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 这个映射被写入
/etc/selinux/targeted/contexts/files/file_contexts.local文件:grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local
~]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local /mysql(/.*)? system_u:object_r:mysqld_db_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 现在,使用
restorecon实用程序将此上下文映射到正在运行的系统:restorecon -R -v /mysql
~]# restorecon -R -v /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 现在,
/mysql/位置已使用 MariaDB 的正确上下文进行标记,mysqld启动:systemctl start mariadb.service
~]# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 确认
/mysql/的上下文已更改:ls -lZ /mysql
~]$ ls -lZ /mysql drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 该位置已更改并标记,
mysqld已成功启动。此时,应测试所有正在运行的服务,以确认正常运行。