SELinux中的Apache和MySQL设定

原贴:http://www.gofun.com.cn:8080/viewtopic.php?f=8&t=234



Post new topic Reply to topic [ 3 posts ]  
AuthorMessage
  Post subject: SELinux中的Apache和MySQL设定
Post Posted: 2007 Jul 08, Sun, 1:35 pm 
Offline

Joined: 2007 Mar 16, Fri, 1:37 pm
Posts: 207
Fedora Core 3 在安装时默认把SELinux的选项激活了。SELinux比普通的Linux内核提供了更高的安全性,理论上说,在系统因为未知漏洞溢出的时候,普通用户是不可能得到超级用户的权限了。但是,就是因为SELinux安全性的提高,导致我们在使用时,会发生一些我们以前从没遇到的问题。

前两天我在使用Fedora Core 3搭建PHP+MySQL的WebServer时就遇到了一些问题。现在整理一下,如果您也遇到同样的问题,那么,看过这篇文章,就应该可以轻而易举的解决了。

1. Apache - Document root must be a directory 问题。

有可能和这个问题并发的问题还有 403 Forbidden 禁止访问的问题。

现象描述:

不使用系统默认的 /var/www/html作为系统的Document Root,自己新建一个目录后修改 /etc/httpd/conf/httpd.conf 中的配置,然后重起Apache的Daemon,发现Apache无法起动,系统报错:

  Document root must be a directory

但是,我们设置的DocumentRoot 的确是一个目录,而且apache用户具有可读权限。

另一种情况:新建一个虚拟目录或文件后,无法访问,显示 Forbidden, 403 Error,但文件或目录有可读权限。

问题产生的原因:

一开始我想来想去想不出为什么,但是给我感觉是权限的问题,用传统的Linux的思维方式来看,权限绝对没有问题。但是仔细一想,SELinux是不是会有其他安全的设定?

检查 avc message,查看 /var/log/messages文件,发现有类似以下内容的这样一段:

Dec 24 17:54:59 hostname kernel: audit(1098222899.827:0): avc: /

denied { getattr } for pid=19029 exe=/usr/sbin/httpd /

path=/var/www/html/about.html dev=dm-0 ino=373900 /

scontext=root:system_r:httpd_t tcontext=user_ubject_r:user_home_t /

tclass=file

嘿嘿,问题找到了,果然是SELinux的新特性搞的鬼。我把目录或文件设成了user_home_t类型,因此apache的进程没有权限,无法访问。针对Apache的进程所使用的SELinux target policy规定了apache的进程只能访问httpd_sys_content_t类型的目录或文件。

解决办法:

很简单,把目录或文件的策略类型改成 httpd_sys_content_t 就可以了

使用root用户

# chcon -t httpd_sys_content_t 目录名或文件名

然后可以用 ls -laZ 命令查看文件目录的策略类型



2. Mysql - Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)

刚搞定Apache,mySQL又出问题了。

问题现象:

本机用mysql命令可以正常登录数据库并正常操作。但是在php写的页面中,不管怎样,连接mySQL数据库时,都会报如下错误:

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)

问题原因:

查看mysql.sock文件,存在并且任何人都可读可写。发现avc message (/var/log/messages)中同样有策略错误的记录。

用 ps -efZ|grep mysql 命令检查mysql的进程,发现mySQL使用了unconfined_t 这个未定义策略类型在运行,而mysql.sock以及mysqld文件的策略类型都是var_lib_t。很明显,这应该是个Fedora Core 3 的 BUG,SELinux target policy的BUG,redhat并没有为mySQL制定正确的target policy。

解决办法:

到redhat的bugzilla系统上搜索,果然找到了这个BUG。

 Bug #:  138421 

https://bugzilla.redhat.com/bugzill...g.cgi?id=138421

在这个页面找到新的target policy的补丁安装即可

补丁下载页面:

ftp://people.redhat.com/dwalsh/SELinux/FC3

你也可以从本文的附件中下载

只要下载

selinux-policy-targeted-1.17.30-2.23以上的版本就能正常使用mySQL了。

如果你原来的系统安装了 selinux-policy-targeted-source (源代码),那么你也必需下载source的rpm文件,并首先升级这个包,因为两个包有依赖关系。

补丁安装办法:

使用root用户。

先升级新的target-policy-source (如果你之前安装了这个包的话)

# rpm -Uvh selinux-policy-targeted-sources-1.17.30-2.61.noarch.rpm

升级新的target-policy

# rpm -Uvh selinux-policy-targeted-1.17.30-2.61.noarch.rpm

更新mysql相关的target policy

# rpm -q -l mysql-server | restorecon -R -v -f -

# rpm -q -l mysql | restorecon -R -v -f -

重起mysql的服务

# service mysqld restart

试一下吧,一定有效 


 
 
  Profile  
 
  Post subject: Re: SELinux中的Apache和MySQL设定
Post Posted: 2007 Jul 08, Sun, 1:35 pm 
Offline

Joined: 2007 Mar 16, Fri, 1:37 pm
Posts: 207
在FC 6的SEinux环境中运行php, mysql, apache。

网上有很多遭遇selinux而导致apache等无法运行的情况,
大多数新手甚至部分的管理员的解决方法都是禁用SELINUX。
看了很郁闷,NSA造出SELINU是为了给人更多的安全保护,而不是给人造成更多的麻烦。
我不擅长写什么教程,不过还是随便弄了几下,
可能不是很清晰,没办法,你得自己研究了。
虽然可能存在错误,但是相信还是有帮助的。
我的一直跑在合适的上下文中,挺好的。
关于它们的非SELINUX环境安装,网上很多文章可以参考。
其实在SELINUX环境安装并没什么差别,只是我认为把--sbindir选项指定
为/usr/sbin后,系统安装过程中会自己标记哪个属于sbin_t,哪个属于httpd_exec_t.
首先还是安装mysql-5.0.37
我选用的是如下选项,个人的爱好需求也不一样,所以应该根据自己需求更改,

./configure --prefix=/usr/local/mysql /
--sysconfdir=/etc /
--sharedstatedir=/var/lib/mysql /
--localstatedir=/var/lib/mysql /
--with-charset=gb2312 /
--with-extra-charsets=big5,latin1 /
--without-debug /
--enable-assembler --with-openssl=yes /
--with-unix-socket-path=/tmp/mysql.sock /
--mandir=/usr/share/man /
--sbindir=/usr/sbin /
--libexecdir=/usr/bin

安装后初始化数据库什么的我就不说了,
只是想告诉你应该改什么,
如果不指定--sysconfdir=/etc,
那么你应该把my.cnf放到--prefix=所指向的目录,
将目录更改为mysqld_etc_t
将安装代码目录中的mysql.server复制到/etc/init.d目录中,
更改安全上下文为 initrc_exec_t.

/sbin/chkconfig --add mysql
/sbin/chkconfig --level 5 mysql on

命令:
chcon -t mysqld_etc_t my.cnf
安装apache.
./configure --prefix=/usr/local/apache /
--sysconfdir=/etc --mandir=/usr/share/man /
--enable-module=so --enable-rewrite /
--enable-shared=max --enable-http /
--enable-cgi --without-debug --enable-ssl

我是用了这些选项。
根据httpd安装包中的目录结构,
文档根目录在/var/www。
所以先安装httpd-2.2.3XXX.rpm安装包,
将/var/www目录重命名,然后,将安装包移去,将目录下的html更名为htdocs.
删除/usr/local/apache/目录下的htdocs目录
将logs文件夹复制到/var/log/httpd,在/usr/local/apache目录下建立一个指向它的连接。

将配置文件放入/etc/apache, 那么最好将logs文件夹移动到
/var/log/httpd/,而在该目录再建立一个指向的连接。
将/var/log/httpd/及其子目录文件更改为httpd_log_t
chcon -R -t httpd_log_t /var/log/httpd

安装php,
./configure --prefix=/usr/local/apache --sysconfdir=/etc --mandir=/usr/share/man --enable-module=so --enable-rewrite --enable-shared=max --enable-http --enable-cgi --without-debug --enable-ssl

然后在配置apache。
安装好后的apache启动后会提示:
[root@localhost modules]# /usr/sbin/apachectl restart
httpd: Syntax error on line 53 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/modules/libphp5.so into server: /usr/local/apache/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied
解决方法:
[root@localhost modules]# chcon -t textrel_shlib_t libphp5.so

你的mysqlq启动后可能仍然运行在unconfined_t.即便你使用
run_init 或者 runcon命令仍然提示权限不足之类的错误,
而apache可能能够运行在httpd_t中,可是无法关闭。
(比如通过runcon 运行/usr/sbin/apachectl start)
先运行runcon -t httpd_t /usr/sbin/apachtctl start
在运行mysql启动脚本。
没关系,现在你可以运行:


audit2allow -m local -l -i /var/log/audit/audit.log > local.te
checkmodule -M -m -o local.mod local.te
semodule_package -o local.pp -m local.mod
semodule -i local.pp

(使用这些命令的前提是你安装并启用的内核审计-audit。
这是我的rpm -qa | grep "policy"的输出。
selinux-policy-devel-2.4.6-46.fc6
policycoreutils-1.34.1-4.fc6
checkpolicy-1.33.1-2.fc6
policycoreutils-newrole-1.34.1-4.fc6

重新启动系统,
用root运行:
ps auxZ | grep mysql
看看是不是运行在mysqld_t下输出应该类似下面这样:
[root@localhost audit]# ps auxZ | grep mysql
user_u:system_r:initrc_t root 3415 0.0 0.1 4688 1120 pts/0 S 14:44 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/localhost.localdomain.pid
user_u:system_r:mysqld_t mysql 3448 0.0 1.8 127188 14032 ? Sl 14:44 0:00 /usr/sbin/mysqld --basedir=/usr/local/mysql --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/localhost.localdomain.pid --skip-external-locking --port=3306 --socket=/tmp/mysql.sock

使用init脚本启动apache要自己编写脚本。去下面的地址:
http://kb.discuz.net/index.php?title=Ap ... A%E6%9C%AC
将内容修改保存后,放入/etc/init.d,更改安全上下文为initrc_exec_t.
如果没什么大问题,你现在应该能使用mysql,php了。
我尝试增加httpd服务到sysv服务列表中,可是总提示说httpd服务不支持chkconfig
应该是脚本的格式不对,我不想在照着http的rpm包中的脚本修改了,使用apachectl start一样可以启动,支持auto_domain_trans.
因为我可不想开机启动apache。


 
 
  Profile  
 
  Post subject: CentOS 4.4对于MySQL的SELinux设置
Post Posted: 2007 Jul 08, Sun, 1:37 pm 
Offline

Joined: 2007 Mar 16, Fri, 1:37 pm
Posts: 207
装了CentOS后,把原来系统自带的MySQL4.x卸载掉,从mysql.com上下载了MySQL 5.0的rpm下来安装,安装好后,使用都正常,但是发现console和/var/log/messages中出现大量的警告信息如下:

Code:
Mar 15 05:00:27 gaobo kernel: audit(1173906027.759:2): avc: denied { append } for pid=3332 comm="mysqld" name="gaobo.moloon.com.e
rr" dev=dm-0 ino=3720485 scontext=user_u:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=file
Mar 15 05:00:27 gaobo fstab-sync[3366]: added mount point /media/cdrom for /dev/hdc
Mar 15 05:00:28 gaobo kernel: audit(1173906028.538:3): avc: denied { create } for pid=3332 comm="mysqld" name="mysql.sock" sconte
xt=user_u:system_r:mysqld_t tcontext=user_u:object_r:var_lib_t tclass=sock_file
Mar 15 05:00:28 gaobo kernel: audit(1173906028.551:4): avc: denied { read } for pid=3332 comm="mysqld" name="host.frm" dev=dm-0 i
no=3720437 scontext=user_u:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=file
Mar 15 05:00:28 gaobo kernel: audit(1173906028.617:5): avc: denied { getattr } for pid=3332 comm="mysqld" name="host.MYI" dev=dm-
0 ino=3720438 scontext=user_u:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=file
Mar 15 05:00:28 gaobo kernel: audit(1173906028.617:6): avc: denied { write } for pid=3332 comm="mysqld" name="host.MYI" dev=dm-0
ino=3720438 scontext=user_u:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=file
Mar 15 05:00:29 gaobo lsb_log_message: succeeded
Mar 15 05:02:49 gaobo sshd(pam_unix)[4065]: session opened for user root by root(uid=0)
Mar 15 06:05:13 gaobo kernel: audit(1173909913.749:7): avc: denied { unlink } for pid=4139 comm="mysqld" name="mysql.sock" dev=dm
-0 ino=3720415 scontext=user_u:system_r:mysqld_t tcontext=user_u:object_r:var_lib_t tclass=sock_file
Mar 15 06:05:16 gaobo lsb_log_message: succeeded
Mar 15 06:05:16 gaobo kernel: audit(1173909916.894:8): avc: denied { append } for pid=4199 comm="mysqld" name="gaobo.moloon.com.e
rr" dev=dm-0 ino=3720485 scontext=root:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=file
Mar 15 06:05:17 gaobo kernel: audit(1173909917.042:9): avc: denied { create } for pid=4199 comm="mysqld" name="mysql.sock" sconte
xt=root:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=sock_file
Mar 15 06:05:17 gaobo kernel: audit(1173909917.042:10): avc: denied { read } for pid=4199 comm="mysqld" name="host.frm" dev=dm-0
ino=3720437 scontext=root:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=file
Mar 15 06:05:17 gaobo kernel: audit(1173909917.043:11): avc: denied { getattr } for pid=4199 comm="mysqld" name="host.MYI" dev=dm
-0 ino=3720438 scontext=root:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=file
Mar 15 06:05:17 gaobo kernel: audit(1173909917.043:12): avc: denied { write } for pid=4199 comm="mysqld" name="host.MYI" dev=dm-0
ino=3720438 scontext=root:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=file
Mar 15 06:05:17 gaobo lsb_log_message: succeeded
Mar 15 06:27:57 gaobo kernel: audit(1173911277.664:13): avc: denied { unlink } for pid=4885 comm="mysqld" name="mysql.sock" dev=d
m-0 ino=3720420 scontext=root:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=sock_file
Mar 15 06:27:59 gaobo lsb_log_message: succeeded
Mar 15 06:27:59 gaobo kernel: audit(1173911279.909:14): avc: denied { create } for pid=4943 comm="mysqld" name="mysql.sock" scont
ext=root:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=sock_file
Mar 15 06:28:00 gaobo lsb_log_message: succeeded
Mar 15 06:39:40 gaobo kernel: audit(1173911980.684:15): avc: denied { getattr } for pid=4960 comm="mysqld" name="mysql.sock" dev=
dm-0 ino=3720422 scontext=root:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=sock_file


查了下发现原来是SELinux安全约束条件对MySQL进行限制造成的。用以下命令就可以简单搞定:

# audit2allow -d


audit2allow 命令可以把一些访问权限规则设定为许可的。-d 选项是从dmsg的输出中获得上面的那些权限禁止信息,然后进行授权许可操作。也可以从文件中获得,直接从dmsg中获得可能会把一些可疑操作也许可了,比较保险的方法是把/var/log/messages文件中所有许可禁止信息copy到一个文件中,一行一行看这个新文件中的禁止是否应该打开,如果不应该打开的就删掉该行。然后再用audit2allow命令从这个文件读入进行许可授权。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值