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 drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
这将显示mysqld_db_t
,这是数据库文件位置的默认上下文元素。此上下文必须手动应用到本示例中将使用的新数据库位置,才能正常工作。 - 输入以下命令,输入
mysqld
root 密码来显示可用的数据库:~]# mysqlshow -u root -p Enter password: ******* +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | test | | wikidb | +--------------------+
- 停止
mariadb.service
服务:~]# systemctl stop mariadb.service
- 为数据库的新位置创建一个新目录。在本例中,使用了
/mysql/
:~]# mkdir -p /mysql
- 将数据库文件复制到新位置:
~]# cp -R /var/lib/mysql/* /mysql/
- 更改此位置的所有权,以允许 mysql 用户和组访问。这会设置 SELinux 仍然会观察到的传统 Unix 权限:
~]# chown -R mysql:mysql /mysql
- 输入以下命令查看新目录的初始上下文:
~]# ls -lZ /mysql drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql
这个新创建的目录的上下文usr_t
目前不适用于 SELinux 作为 MariaDB 数据库文件的位置。上下文更改后,MariaDB 将能够在此领域正常工作。 - 使用文本编辑器打开主 MariaDB 配置文件
/etc/my.cnf
,并修改datadir
选项,使其引用新位置。在本例中,应输入的值为/mysql
:[mysqld] datadir=/mysql
保存此文件并退出。 - 启动
mariadb.service
。该服务应该无法启动,拒绝信息将记录到/var/log/messages
文件中:~]# systemctl start mariadb.service Job for mariadb.service failed. See 'systemctl status mariadb.service' and 'journalctl -xn' for details.
但是,如果审计守护进程
与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
此拒绝的原因是/mysql/
没有针对 MariaDB 数据文件正确标记。SELinux 正在阻止 MariaDB 访问标记为usr_t
的内容。执行以下步骤解决这个问题: - 输入以下命令为
/mysql/
添加上下文映射。请注意,默认情况下不安装semanage
工具。如果您的系统中没有它,请安装 policycoreutils-python 软件包。~]# semanage fcontext -a -t mysqld_db_t "/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:s0
- 现在,使用
restorecon
实用程序将此上下文映射到正在运行的系统:~]# restorecon -R -v /mysql
- 现在,
/mysql/
位置已使用 MariaDB 的正确上下文进行标记,mysqld
启动:~]# systemctl start mariadb.service
- 确认
/mysql/
的上下文已更改:~]$ ls -lZ /mysql drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
- 该位置已更改并标记,
mysqld
已成功启动。此时,应测试所有正在运行的服务,以确认正常运行。