转自: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的方法,不过,你现在应该不会那么做了吧?你已经手持完美的手术刀了,何必还去用什么锤子呢?
分享到:
相关推荐
5G通信行业、网络优化、通信工程建设资料。
5G通信行业、网络优化、通信工程建设资料
5G通信、网络优化与通信建设
299-教育行业信息化与数据平台建设分享.pptx
手写数字和字母数据集binaryalphadigs.mat
5G通信行业、网络优化、通信工程建设资料
PEMFC电堆输出电压模型,可计算效率、输出功率、电流、消耗功率以及等效内阻
1、 设计思路 1、 创建型设计模式 创建型设计模式主要“关注对象的创建”。 1. 单例模式 单例模式:能不用就不用 ,他的目的就是为了让一个类只创建一个实例。 用法:把对象的创建权限关闭,提供一个人公开的静态方法,实现静态方法后将实例存放于静态的字段中,方法中返回。 单例模式会长期持有一个对象不会被释放,而普通实例不用就会被释放(当然必须是GC之后才会被释放)。 单例用途;数据临时存储的地方如静态字典,数据库连接池、线程池、IOC容器实例。 1.1懒汉式 设置构造函数为私有的,避免其他外部类可以对其实例化, 创建静态类来存储实例。 在静态方法中创建实例,避免多个线程同时调用方法,我们可以加线程锁, 在方法中使用双判断语句:最外层判断是为了提高运行速率,检查如果静态字段中已经存在实例了就可以直接return;第二层判断是避免创建多个对象实例。 1.2饿汉式1 静态构造函数:由CLR保证,静态构造函数只会在启动程序时候,由CLR自行创建。并且只会创建一次,相比较于懒汉式创建的更早,并且不需要担心会
5G通信行业、网络优化、通信工程建设资料
论文目录: 第二章 需求分析与系统总体设计 - 5 - 2.1java的特点 - 5 - 2.2技术可行性 - 5 - 2.3可靠性和安全性特点 - 6 - 2.4系统总体设计 - 6 - 2.5JSP技术介绍 - 7 - 2.5.1 什么是JSP - 7 - 2.5.2 JSP技术特点 - 7 - 2.5.3 JSP开发WEB的几种方式 - 8 - 第三章 数据库的设计与实现 - 9 - 3.1数据库的需求分析 - 9 - 3.2数据库的逻辑设计 - 10 - 3.3 数据库的结构创建 - 10 - 第四章 后台系统和数据库的配置 - 13 - 4.1后台服务器配置 - 13 - 4.2后台数据库的配置 - 13 - 4.3后台全局配置文件 - 13 - 第五章 前端网络页面的开发与设计 - 14 - 5.1登录页面 - 14 - 5.2 管理员用户页面 - 15 - 5.3 注册用户页面 - 16 - 5.4主页面 - 17 - 5.5用户注册页面 - 18 - 5.6 规章制度管理页面 - 18 - 第六章 系统的安全性 - 19 - 6.1 session和cookie的安
5G通信行业、网络优化、通信工程建设资料。
99-煤矿安全生产标准化基本要求及评分方法.pdf
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
475现场通讯器用户手册
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
600A钳形电流表使用手册
5G通信、网络优化与通信建设
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
5G通信、网络优化与通信建设
Binomial Self-compensation for Motion Error in Dynamic 3D Scanning