SELinux
Contents
Security-Enhanced Linux (SELinux) 是一个 Linux 内核模块,为系统上的许多资源配置强制访问控制(MAC)系统提供了框架。它在一些 Linux 发行版上默认启用,包括 RHEL、CentOS、Fedora 和其他类似的 Linux 发行版。SELinux 防止程序访问文件、目录或端口,除非配置了访问这些资源。
验证是否启用 SELinux
要验证 SELinux 是否已启用,请执行 getenforce
命令。例如:
getenforce
暂时将 mysqld 设置为宽容模式
当您在解决您认为 SELinux 可能引起的问题时,将 mysqld_t
暂时设置为宽容模式可能会有帮助。这可以通过执行 semanage
命令来完成。例如:
sudo semanage permissive -a mysqld_t
如果这解决了问题,则意味着当前的 SELinux 策略是罪魁祸首。您需要调整 MariaDB 的 SELinux 策略或标签。
配置 MariaDB 服务器 SELinux 策略
MariaDB Server 应该与您的默认分发策略一起工作(通常是 selinux-policy
或 selinux-policy-targeted
系统包的一部分)。如果您使用 mysqld_safe
,则需要一个附加的策略文件 mariadb.pp
,它与 MariaDB Server 一起安装。如果您安装了 /usr/sbin/semodule
,则会自动加载它,但您可以随时手动加载它,方法如下:
/usr/sbin/semodule -i /usr/share/mysql/policy/selinux/mariadb.pp
请注意,此策略文件扩展而不是替换系统策略。
设置文件上下文
SELinux 使用文件上下文作为确定谁应该能够访问该文件的一种方式。
文件上下文由 semanage fcontext
和 restorecon
命令管理。
在许多系统上,semanage
实用程序是通过 policycoreutils-python
包安装的,而 restorecon
实用程序是通过 policycoreutils
包安装的。您可以使用以下命令安装它们:
sudo yum install policycoreutils policycoreutils-python
可以通过使用带有 --context
或 --scontext
选项的 ls
命令来检查文件或目录的当前上下文。
为数据目录设置文件上下文
如果您使用自定义目录作为 datadir
,则可能需要设置该目录的文件上下文。MariaDB 数据文件的 SELinux 文件上下文为 mysqld_db_t
。您可以通过执行以下命令确定此文件上下文是否存在于您的系统中以及与哪些文件或目录相关联:
sudo semanage fcontext --list | grep mysqld_db_t
如果您想为自定义目录设置文件上下文以用作 datadir
,则可以通过执行 semanage fcontext
和 restorecon
命令来完成。例如:
sudo semanage fcontext -a -t mysqld_db_t "/mariadb/data(/.*)?" sudo restorecon -Rv /mariadb/data
如果您想检查当前的文件上下文,可以通过使用 ls
命令并加上 --context
或 --scontext
选项来执行。例如:
ls --directory --scontext /mariadb/data
为日志文件设置文件上下文
如果您使用自定义目录作为 日志文件,则可能需要设置该目录的文件上下文。MariaDB 日志文件 的 SELinux 文件上下文为 mysqld_log_t
。您可以通过执行以下命令确定此文件上下文是否存在于您的系统中以及与哪些文件或目录相关联:
sudo semanage fcontext --list | grep mysqld_log_t
如果您想为自定义目录设置文件上下文以用作 日志文件,则可以通过执行 semanage fcontext
和 restorecon
命令来完成。例如:
sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?" sudo restorecon -Rv /var/log/mysql
如果您想检查当前的文件上下文,可以通过使用 ls
命令并加上 --context
或 --scontext
选项来执行。例如:
ls --directory --scontext /var/log/mysql
为选项文件设置文件上下文
如果您使用自定义目录来 配置选项文件,则可能需要设置该目录的文件上下文。MariaDB 选项文件 的 SELinux 文件上下文为 mysqld_etc_t
。您可以通过执行以下命令确定此文件上下文是否存在于您的系统中以及与哪些文件或目录相关联:
sudo semanage fcontext --list | grep mysqld_etc_t
如果您想为自定义目录设置文件上下文以用于 选项文件,则可以通过执行 semanage fcontext
和 restorecon
命令来完成。例如:
sudo semanage fcontext -a -t mysqld_etc_t "/etc/mariadb(/.*)?" sudo restorecon -Rv /etc/mariadb
如果您想检查当前的文件上下文,可以通过使用 ls
命令并加上 --context
或 --scontext
选项来执行。例如:
ls --directory --scontext /etc/mariadb
允许访问 Tmpfs 文件上下文
如果您想在 tmpfs
文件系统上挂载您的 tmpdir
,或者想在 /run/shm
上使用 tmpfs
文件系统,则可能需要允许 mysqld_t
访问几个与 tmpfs 相关的文件上下文。例如:
cd /usr/share/mysql/policy/selinux/ tee ./mysqld_tmpfs.te <<EOF module mysqld_tmpfs 1.0; require { type tmpfs_t; type mysqld_t; class dir { write search read remove_name open getattr add_name }; class file { write getattr read lock create unlink open }; } allow mysqld_t tmpfs_t:dir { write search read remove_name open getattr add_name }; allow mysqld_t tmpfs_t:file { write getattr read lock create unlink open } EOF sudo checkmodule -M -m mysqld_tmpfs.te -o mysqld_tmpfs.mod sudo semodule_package -m mysqld_tmpfs.mod -o mysqld_tmpfs.pp sudo semodule -i mysqld_tmpfs.pp
解决 SELinux 问题
在以下情况下,您可能需要解决与 SELinux 相关的问题:
- MariaDB 使用非默认端口。
- MariaDB 正在读取或写入某些文件(datadir、日志文件、选项文件等)位于非默认路径。
- MariaDB 使用需要访问默认安装不使用的资源的插件。
文件系统权限错误
如果某些 MariaDB 目录的文件系统权限看起来很好,但是 MariaDB 错误日志 仍然有类似以下错误:
130321 11:50:51 mysqld_safe Starting mysqld daemon with databases from /datadir ... 2013-03-21 11:50:52 2119 [Warning] Can't create test file /datadir/ 2013-03-21 11:50:52 2119 [Warning] Can't create test file /datadir/ ... 2013-03-21 11:50:52 2119 [ERROR] /usr/sbin/mysqld: Can't create/write to file '/datadir/boxy.pid' (Errcode: 13 - Permission denied) 2013-03-21 11:50:52 2119 [ERROR] Can't start server: can't create PID file: Permission denied 130321 11:50:52 mysqld_safe mysqld from pid file /datadir/boxy.pid ended
那么请检查 SELinux 的 /var/log/audit/audit.log
,查看是否有类似以下日志条目:
type=AVC msg=audit(1363866652.030:24): avc: denied { write } for pid=2119 comm="mysqld" name="datadir" dev=dm-0 ino=394 scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir
如果看到任何类似于此的条目,则您很可能需要调整某些文件或目录的文件上下文。有关如何执行此操作的更多信息,请参见设置文件上下文。
SELinux 和 MariaDB 在不同的端口上
TCP 和 UDP 端口也启用了绑定权限。如果您使用不同的端口或某些 Galera 端口,请配置 SELinux 以能够使用这些端口:
sudo semanage port -a -t mysqld_port_t -p tcp 3307
使用 audit2allow 生成 SELinux 策略
在某些情况下,MariaDB 系统可能需要非标准策略。可以使用 SELinux 审计日志从中创建这些策略,使用 audit2allow
实用程序。还需要使用 semanage
和 semodule
实用程序。
在许多系统上,audit2allow
和 semanage
实用程序是通过 policycoreutils-python
包安装的,而 semodule
实用程序是通过 policycoreutils
包安装的。您可以使用以下命令安装它们:
sudo yum install policycoreutils policycoreutils-python
可以使用以下过程从审计日志生成策略:
- 从策略中删除 dontaudits:
sudo semodule -DB
- 将
mysqld_t
临时设置为宽容模式。例如:
sudo semanage permissive -a mysqld_t
- 执行导致 SELinux 错误的任何操作。
- 使用生成的审计日志创建策略:
sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local sudo semodule -i mariadb_local.pp
- 将
mysqld_t
从宽容模式中删除。例如:
sudo semanage permissive -d mysqld_t
- 为策略恢复 dontaudits:
sudo setmodule -B
如果 MariaDB 启动但 SELinux 阻止其正常运行,则可以使用相同的过程。例如,SELinux 可能会阻止PAM 插件验证用户。解决方案相同-启用审计,切换到宽容模式,执行 SELinux 不允许您执行的任何操作,并从审计日志中创建策略。
当您发现任何需要的 SELinux 权限时,请将所需的权限报告给您的操作系统错误跟踪,以便所有用户都可以从您的工作中受益(例如 Red Hat Bugzilla https://bugzilla.redhat.com/)。