`

[翻译]SELinux之于MySQL

阅读更多
转自:http://blog.sina.com.cn/s/blog_56b7aaa1010195ji.html

译序(jejoker)
这是本人被折磨2天以后,才定位到SELinux的问题,然后痛苦挣扎时候搜到的E文,觉得很好,于是翻译之,用来共享,同时感谢“她”帮我做的一部分翻译。
原文参见这里:SELinux and MySQL 作者是 Jeremy Smyth on Mar 22, 2013
以下是译文
========================================================

我之前写了一篇《AppArmor and MySQL》的文章,讲了如何在启用AppArmor的情况下改变MySQL的默认文件路径。Ubuntu和SUSE配备了AppArmor,而其他一些发布版本,如Oracle Linux则没有,以及其他一些相关的版本如Red Hat、CentOS及Fedora都没有。相对的,他们使用另一个托管访问控制(译注:mandatory access control)系统SELinux。

SELinux(安全强化,如果你感兴趣)“是linux中支持安全访问控制策略机制的一种特性”--维基百科。更简单的说,它能阻止比如程序之类的访问他们不应该访问的文件和网络端口等。所谓“不应该访问”这里指的是“尚未被配置为可以访问”。比如说,MySQL允许访问它的数据目录/var/lib/mysql,并且可以读取/etc/my.cnf。它可以打开3306端口,但是SELinux阻止它向/home/Jeremy或者/sbin或者其他任何尚未配置成为MySQL位置的路径进行写操作。

简而言之,如果你想更改MySQL的默认端口为一个非标准端口,或者试图备份或者设置数据文件或日志文件到非常用路径,你就会在MySQL错误日志里面收到很多奇怪的禁止访问类型的错误。另外,你同样会在/var/log/audit/audit.log(如果auditd正在运行,否则在/var/log/messages或者/var/log/syslog里面,这取决于你的系统配置)里收到信息。

会得到什么错误呢?

我这边采用了MySQL5.6及Oracle Linux 6.3作为样例环境,同时启用了SELinux。当我把datadir这个变量设置为/datadir时(此目录复制了MySQL原数据目录的所有内容,并且设置了正确的权限),就无法启动服务了。看下面的错误。

MySQL错误日志中:

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/boxy.lower-test

2013-03-21 11:50:52 2119 [Warning] Can't create test file /datadir/boxy.lower-test

...

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

我很确信现在这个目录的权限是正确的,我们再来看看/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

...

如果我更改端口为非默认端口3307时,启动MySQL也会遇到类似的错误。

MySQL错误日志中:

2013-03-21 12:12:09 3436 [Note] Server hostname (bind-address): '*'; port: 3307

...

2013-03-21 12:12:09 3436 [ERROR] Can't start server: Bind on TCP/IP port:

    Permission denied

2013-03-21 12:12:09 3436 [ERROR] Do you already have another mysqld server

    running on port: 3307 ?

2013-03-21 12:12:09 3436 [ERROR] Aborting

audit日志中:

type=AVC msg=audit(1363867929.432:42): avc:  denied  { name_bind } for  pid=3436

    comm="mysqld" src=3307

    scontext=unconfined_u:system_r:mysqld_t:s0

    tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket

很明显这里有点问题。Access Vector Cache(如日志中显示的“avc: denied”)是SELinux用来为内核缓存权限的地方。所以很明显是SELinux阻止了操作。

仅仅关闭它就好!

下面就我会先从锤子开始,然后逐渐打造成手术刀。(译注:这个……我不知道理解的对不对,原文是I'm going to start with the hammer and work my way down to the scalpel. )

锤子如下:

[root@boxy ~]# setenforce 0

[root@boxy ~]# getenforce

Permissive


setenforce 0用来关闭SELinux enforcing,重启则失效。getenforce显示当前状态。如果想要在重启以后仍然生效,想要改写以下配置文件:

[root@boxy ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=enforcing

# SELINUXTYPE= can take one of these two values:

#     targeted - Targeted processes are protected,

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted 


将enforcing设置为permissive(或者disabled)就ok了。参数的差别如下:

    enforcing 阻止SELinux不允许的操作
    permissive 并不阻止操作,但是会记录日志(/var/log/audit/audit.log)
    disabled 完全关闭SELinux,甚至你都没法使用setenforce了,除非换成其他参数,并重启

例如,如果服务器的SELinux设置为permissive,那么我可以这么做:

[root@boxy ~]# setenforce 1

[root@boxy ~]# getenforce

Enforcing


但是如果设置为disabled,就会这样:

[root@boxy ~]# setenforce 0

setenforce: SELinux is disabled

[root@boxy ~]# setenforce 1

setenforce: SELinux is disabled



以上就是所谓的锤子。

那么,我们返回到产生错误的这个例子,我可以这么使用锤子。

[root@boxy ~]# setenforce 0

[root@boxy ~]# service mysql start --datadir=/datadir

Starting MySQL. SUCCESS!

[root@boxy ~]# service mysql stop

Shutting down MySQL.. SUCCESS!



如果这样子你就满意了,那么你可以编辑配置文件,然后在下次重启时禁用SELinux,并且谢谢阅览。下次见~

我还是有点迷惑。我该怎么配置它而不是禁用呢?

很明显,比起禁用,还有很多事情可以做。而且负责任的管理员(比如你?)想要知道比起禁用,如何更好的使用它。下面,我不会讨论太多细节。

无论如何,我们可以看看该怎样给比如端口、文件这些对象分配SELinux类型(译注:types),然后可以让mysql_t域的成员们(尤其是启动 service mysql start产生的mysqld_safe进程)可以访问这些对象。

以下是手术刀了。首先,我们配置一下SELinux来启用MySQL的3307端口

[root@boxy ~]# semanage port -a -t mysqld_port_t -p tcp 3307

(注:你需要首先安装policycoreutils-python包来使用semanage工具)



semanage工具可以变更很多SELinux设置。这里,我们为使3307端口使用TCP作为它的协议(-p tcp)而向端口映射增加了(-a)一种类型(-t mysqld_port_t)。当MySQL(通过mysqld_safe进程)试图访问这个端口时,SELinux从策略(译注:policy)里面识别这个端口匹配一种类型,并且允许进行这样的访问。

同样我们可以允许MySQL使用/datadir文件夹:

[root@boxy ~]# semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"

[root@boxy ~]# restorecon -Rv /datadir

restorecon reset /datadir context

   unconfined_u:object_r:default_t:s0->unconfined_u:object_r:mysqld_db_t:s0

restorecon reset /datadir/mysql.sock context

   system_u:object_r:mysqld_var_run_t:s0->system_u:object_r:mysqld_db_t:s0



在这个例子中,semanage在文件上下文映射(fcontext)中增加了mysqld_db_t的类型,指定了/datadir路径下的所有文件以及子文件(“/datadir(/.*)?”,正则表达式)。这样的文件映射包含在/etc/selinux/targeted/contexts/files/file_contexts.local文件中,为了能够给这个文件设置合适的类型,这个文件必须能够被读取。restorecon工具在系统重启的时候就完成了该操作。如果你想马上更改文件上下文并且不需要重启以后还生效,那么使用chcon工具就可以了。

如果你想使用其他端口或者文件夹,也可以使用同样的方式和语句。不同类型的文件对应一些类似的类型;我这里使用上面的mysqld_db_t来对应数据库文件夹,但是标准SELinux策略针对MySQL也包含:

    mysqld_etc_t 用来匹配配置文件如 /etc/my.cnf
    mysqld_log_t 用来匹配日志文件如 /var/log/mysql*
    PID文件、tmp文件、/etc/init.d里面的服务启动文件的类型,还有各种各样你想使用的可执行文件。

如你所见,你可以自如的使用你的手术刀来合理的分配权限。就我个人而言,我已经使用像mysql_log_t这样的类型匹配自定义的日志文件路径而得到了混合的效果,不过我会首先使用mysqld_db_t(就像用来匹配数据文件),然后使用自定义的策略文件来搞定。

结语

这篇文章已经够长了,所以我不会讨论更为深入的SELinux话题了,比如说编译你自己的策略文件以及为SELinux尚不知道的服务配置新的策略。现在,你已经知道如何为SELinux增加一种类型,来让MySQL可以访问并非默认的端口或者文件了。你也知道了好几种关闭SELinux的方法,不过,你现在应该不会那么做了吧?你已经手持完美的手术刀了,何必还去用什么锤子呢?
分享到:
评论

相关推荐

    SELinux手册 电子书 pdf 英文

    2. Embeded 系统安全:SELinux 也广泛应用于嵌入式系统安全领域,用于保护嵌入式系统免受攻击和入侵。 3. 移动设备安全:SELinux 也应用于移动设备安全领域,用于保护移动设备免受攻击和入侵。 SELinux 的主要工具...

    SELinux导致PHP连接MySQL异常Can't connect to MySQL server的解决方法

    这个错误通常表示PHP无法与MySQL服务器建立连接,但原因并非PHP代码、MySQL配置或网络问题,而是SELinux策略阻止了HTTPD(Apache)进程的网络连接。 首先,我们需要理解`getsebool -a`命令的作用。这个命令用来查询...

    selinux-example_SELinux_

    **SELinux:Linux安全增强系统详解** 在深入探讨SELinux之前,我们首先需要理解它的全称:Security-Enhanced Linux,即安全增强型Linux。它是一种强制访问控制(MAC)系统,由美国国家安全局(NSA)开发,旨在提高...

    SELinux详解-中文版.pdf

    《SELinux详解》是一本深度解析安全增强的Linux(SELinux)操作系统的书籍,旨在帮助读者理解、编写、修改和管理SELinux策略,提升Linux系统的安全性。书中详细介绍了SELinux的作用、生效机制以及策略模块的编写,...

    selinux中文手册和详细解说

    5. **网络服务**:描述如何配置SELinux以允许或限制网络服务的行为,例如Apache、MySQL等。 6. **故障排查**:提供在遇到SELinux拒绝访问错误时的解决步骤,包括查看审计日志(`/var/log/audit/audit.log`)和使用`...

    RedHat 7.9安装MySQL 8.0 MGR

    安装 MySQL 8.0 MGR 需要完成多个步骤,包括添加 hosts、关闭和禁用防火墙、删除 mariadb-libs、配置环境变量、创建组和用户、关闭 selinux、解压二进制安装包、创建数据目录、配置 my.cnf、初始化 mysql、查看初始...

    SELinux详解.pdf

    SELinux 策略语言是 SELinux 的核心组件之一,用于定义和实施安全策略。SELinux 策略语言提供了详细的语法和语义规则,帮助读者编写和实施安全策略。我们将详细介绍 SELinux 策略语言的语法和语义规则,帮助读者掌握...

    SELinux中文.pdf

    "SELinux中文指南" SELinux(Security-Enhanced Linux)是一种强大的 Linux 安全机制,旨在提供一个灵活、可配置的安全解决方案。本文档提供了 SELinux 的详细介绍,包括语法规则、安装、配置、用户管理等方面的...

    SELinux System - 2nd Edition + SELinux 详解 SEAndroid基础

    与传统的SELinux相比,SEAndroid更关注于移动环境的特有挑战,如应用隔离和权限管理。在SEAndroid中,每个应用程序都有自己的安全上下文,并且只能访问其被授权的资源。这降低了恶意应用影响其他应用或操作系统核心...

    SELinux文档

    规则语法的说明有助于读者理解如何编写适用于特定SELinux版本的策略。 学习SELinux文档的读者通常需要对Linux/Unix系统有深入的了解,包括系统标准、文件系统布局以及编程风格。了解这些知识对于理解SELinux策略...

    SElinux详解.pdf

    - **类型增强策略**:这是SELinux的核心机制之一,通过定义主体(通常是进程)和客体(通常是文件或其他资源)的类型,实现精确的访问控制。主体只能访问与其类型兼容的客体,从而防止未授权的访问。 - **角色和...

    [SELinux] SELinux 系统管理手册 (英文版)

    [Packt Publishing] SELinux 系统管理手册 (英文版) [Packt Publishing] SELinux System Administration (E-Book) ☆ 图书概要:☆ A comprehensive guide to walk you through SELinux access controls ...

    SELinux-by-Example-Using-Security-Enhanced-Linux

    SELinux by example is the first complete, hands-on guide to using SELinux in production environments. Authored by three leading SELinux researchers and developers, it illuminates every facet of ...

    超root安全selinux

    1. **应用程序配置**:许多应用程序需要配置以兼容SELinux,例如Apache、MySQL等,可能需要修改其默认上下文或策略。 2. ** SELinux-aware 应用**:某些应用(如Docker)设计时就考虑了SELinux,可以充分利用其安全...

    Lock SELinux forced mode.zip

    标题“Lock SELinux forced mode.zip”暗示了这个压缩包与Linux系统的安全增强层(Security-Enhanced Linux,简称SELinux)有关,特别是涉及到强制模式(forced mode)的配置。在这个场景下,SELinux是一个内核模块...

    SELinux Notebook 是一本关于 SELinux 的开源书籍,最初由 Richard Haines创建并捐赠给 SE

    SELinux Notebook 是一本关于 SELinux 的开源书籍,最初由 Richard Haines创建并捐赠给 SELinux 社区。该笔记本的目标是成为有关 SELinux 的最新、最全面的书籍,涵盖 Linux 内核组件、用户空间库和工具、策略工具链...

    SELinux For Android8.0 && SELinux 4.0

    `SELinux_Treble.pdf`则可能聚焦于Android Treble项目中的SELinux应用。Android Treble是Android 8.0引入的一项重大改变,旨在提高Android系统的更新速度和兼容性。在这个框架下,HAL(硬件抽象层)被分离出来,使得...

    selinux初始化流程

    SELinux(Security-Enhanced Linux)是Linux操作系统中一种强制访问控制策略的实现,它为系统提供了更高级别的安全防护。在Linux系统启动时,SELinux的初始化流程扮演着至关重要的角色,确保系统的安全策略得以正确...

Global site tag (gtag.js) - Google Analytics