Fedora Core 3
在安裝時(shí)默認(rèn)把SELinux的選項(xiàng)激活了。SELinux比普通的Linux內(nèi)核提供了更高的安全性,理論上說(shuō),在系統(tǒng)因?yàn)槲粗┒匆绯龅臅r(shí)候,普通用
戶是不可能得到超級(jí)用戶的權(quán)限了。但是,就是因?yàn)镾ELinux安全性的提高,導(dǎo)致我們?cè)谑褂脮r(shí),會(huì)發(fā)生一些我們以前從沒(méi)遇到的問(wèn)題。
前兩天我在使用Fedora Core 3搭建PHP+MySQL的WebServer時(shí)就遇到了一些問(wèn)題。現(xiàn)在整理一下,如果您也遇到同樣的問(wèn)題,那么,看過(guò)這篇文章,就應(yīng)該可以輕而易舉的解決了。
1. Apache - Document root must be a directory 問(wèn)題。
有可能和這個(gè)問(wèn)題并發(fā)的問(wèn)題還有 403 Forbidden 禁止訪問(wèn)的問(wèn)題。
現(xiàn)象描述:
不使用系統(tǒng)默認(rèn)的 /var/www/html作為系統(tǒng)的Document Root,自己新建一個(gè)目錄后修改 /etc/httpd/conf/httpd.conf 中的配置,然后重起Apache的Daemon,發(fā)現(xiàn)Apache無(wú)法起動(dòng),系統(tǒng)報(bào)錯(cuò):
Document root must be a directory
但是,我們?cè)O(shè)置的DocumentRoot 的確是一個(gè)目錄,而且apache用戶具有可讀權(quán)限。
另一種情況:新建一個(gè)虛擬目錄或文件后,無(wú)法訪問(wèn),顯示 Forbidden, 403 Error,但文件或目錄有可讀權(quán)限。
問(wèn)題產(chǎn)生的原因:
一開(kāi)始我想來(lái)想去想不出為什么,但是給我感覺(jué)是權(quán)限的問(wèn)題,用傳統(tǒng)的Linux的思維方式來(lái)看,權(quán)限絕對(duì)沒(méi)有問(wèn)題。但是仔細(xì)一想,SELinux是不是會(huì)有其他安全的設(shè)定?
檢查 avc message,查看 /var/log/messages文件,發(fā)現(xiàn)有類(lèi)似以下內(nèi)容的這樣一段:
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
嘿嘿,問(wèn)題找到了,果然是SELinux的新特性搞的鬼。我把目錄或文件設(shè)成了user_home_t類(lèi)型,因此apache的進(jìn)程沒(méi)有權(quán)限,無(wú)法訪問(wèn)。 針對(duì)Apache的進(jìn)程所使用的SELinux target policy規(guī)定了apache的進(jìn)程只能訪問(wèn)httpd_sys_content_t類(lèi)型的目錄或文件。
解決辦法:
很簡(jiǎn)單,把目錄或文件的策略類(lèi)型改成 httpd_sys_content_t 就可以了
使用root用戶
# chcon -t httpd_sys_content_t 目錄名或文件名
然后可以用 ls -laZ 命令查看文件目錄的策略類(lèi)型
2. Mysql - Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)
剛搞定Apache,mySQL又出問(wèn)題了。
問(wèn)題現(xiàn)象:
本機(jī)用mysql命令可以正常登錄數(shù)據(jù)庫(kù)并正常操作。但是在php寫(xiě)的頁(yè)面中,不管怎樣,連接mySQL數(shù)據(jù)庫(kù)時(shí),都會(huì)報(bào)如下錯(cuò)誤:
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)
問(wèn)題原因:
查看mysql.sock文件,存在并且任何人都可讀可寫(xiě)。發(fā)現(xiàn)avc message (/var/log/messages)中同樣有策略錯(cuò)誤的記錄。
用 ps -efZ|grep mysql 命令檢查mysql的進(jìn)程,發(fā)現(xiàn)mySQL使用了unconfined_t 這個(gè)未定義策略類(lèi)型在運(yùn)行,而mysql.sock以及mysqld文件的策 略類(lèi)型都是var_lib_t。很明顯,這應(yīng)該是個(gè)Fedora Core 3 的 BUG,SELinux target policy的BUG,redhat并沒(méi)有為mySQL制定正確的target policy。
解決辦法:
到redhat的bugzilla系統(tǒng)上搜索,果然找到了這個(gè)BUG。
Bug #: 138421
[url]https://bugzilla.redhat.com/bugzill...g.cgi?id=138421[/url]
在這個(gè)頁(yè)面找到新的target policy的補(bǔ)丁安裝即可
補(bǔ)丁下載頁(yè)面:
[url]ftp://people.redhat.com/dwalsh/SELinux/FC3[/url]
你也可以從本文的附件中下載
只要下載
selinux-policy-targeted-1.17.30-2.23以上的版本就能正常使用mySQL了。
如果你原來(lái)的系統(tǒng)安裝了 selinux-policy-targeted-source (源代碼),那么你也必需下載source的rpm文件,并首先升級(jí)這個(gè)包,因?yàn)閮蓚€(gè)包有依賴關(guān)系。
補(bǔ)丁安裝辦法:
使用root用戶。
先升級(jí)新的target-policy-source (如果你之前安裝了這個(gè)包的話)
# rpm -Uvh selinux-policy-targeted-sources-1.17.30-2.61.noarch.rpm
升級(jí)新的target-policy
# rpm -Uvh selinux-policy-targeted-1.17.30-2.61.noarch.rpm
更新mysql相關(guān)的target policy
# rpm -q -l mysql-server | restorecon -R -v -f -
# rpm -q -l mysql | restorecon -R -v -f -
重起mysql的服務(wù)
# service mysqld restart
試一下吧,一定有效
前兩天我在使用Fedora Core 3搭建PHP+MySQL的WebServer時(shí)就遇到了一些問(wèn)題。現(xiàn)在整理一下,如果您也遇到同樣的問(wèn)題,那么,看過(guò)這篇文章,就應(yīng)該可以輕而易舉的解決了。
1. Apache - Document root must be a directory 問(wèn)題。
有可能和這個(gè)問(wèn)題并發(fā)的問(wèn)題還有 403 Forbidden 禁止訪問(wèn)的問(wèn)題。
現(xiàn)象描述:
不使用系統(tǒng)默認(rèn)的 /var/www/html作為系統(tǒng)的Document Root,自己新建一個(gè)目錄后修改 /etc/httpd/conf/httpd.conf 中的配置,然后重起Apache的Daemon,發(fā)現(xiàn)Apache無(wú)法起動(dòng),系統(tǒng)報(bào)錯(cuò):
Document root must be a directory
但是,我們?cè)O(shè)置的DocumentRoot 的確是一個(gè)目錄,而且apache用戶具有可讀權(quán)限。
另一種情況:新建一個(gè)虛擬目錄或文件后,無(wú)法訪問(wèn),顯示 Forbidden, 403 Error,但文件或目錄有可讀權(quán)限。
問(wèn)題產(chǎn)生的原因:
一開(kāi)始我想來(lái)想去想不出為什么,但是給我感覺(jué)是權(quán)限的問(wèn)題,用傳統(tǒng)的Linux的思維方式來(lái)看,權(quán)限絕對(duì)沒(méi)有問(wèn)題。但是仔細(xì)一想,SELinux是不是會(huì)有其他安全的設(shè)定?
檢查 avc message,查看 /var/log/messages文件,發(fā)現(xiàn)有類(lèi)似以下內(nèi)容的這樣一段:
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
嘿嘿,問(wèn)題找到了,果然是SELinux的新特性搞的鬼。我把目錄或文件設(shè)成了user_home_t類(lèi)型,因此apache的進(jìn)程沒(méi)有權(quán)限,無(wú)法訪問(wèn)。 針對(duì)Apache的進(jìn)程所使用的SELinux target policy規(guī)定了apache的進(jìn)程只能訪問(wèn)httpd_sys_content_t類(lèi)型的目錄或文件。
解決辦法:
很簡(jiǎn)單,把目錄或文件的策略類(lèi)型改成 httpd_sys_content_t 就可以了
使用root用戶
# chcon -t httpd_sys_content_t 目錄名或文件名
然后可以用 ls -laZ 命令查看文件目錄的策略類(lèi)型
2. Mysql - Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)
剛搞定Apache,mySQL又出問(wèn)題了。
問(wèn)題現(xiàn)象:
本機(jī)用mysql命令可以正常登錄數(shù)據(jù)庫(kù)并正常操作。但是在php寫(xiě)的頁(yè)面中,不管怎樣,連接mySQL數(shù)據(jù)庫(kù)時(shí),都會(huì)報(bào)如下錯(cuò)誤:
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)
問(wèn)題原因:
查看mysql.sock文件,存在并且任何人都可讀可寫(xiě)。發(fā)現(xiàn)avc message (/var/log/messages)中同樣有策略錯(cuò)誤的記錄。
用 ps -efZ|grep mysql 命令檢查mysql的進(jìn)程,發(fā)現(xiàn)mySQL使用了unconfined_t 這個(gè)未定義策略類(lèi)型在運(yùn)行,而mysql.sock以及mysqld文件的策 略類(lèi)型都是var_lib_t。很明顯,這應(yīng)該是個(gè)Fedora Core 3 的 BUG,SELinux target policy的BUG,redhat并沒(méi)有為mySQL制定正確的target policy。
解決辦法:
到redhat的bugzilla系統(tǒng)上搜索,果然找到了這個(gè)BUG。
Bug #: 138421
[url]https://bugzilla.redhat.com/bugzill...g.cgi?id=138421[/url]
在這個(gè)頁(yè)面找到新的target policy的補(bǔ)丁安裝即可
補(bǔ)丁下載頁(yè)面:
[url]ftp://people.redhat.com/dwalsh/SELinux/FC3[/url]
你也可以從本文的附件中下載
只要下載
selinux-policy-targeted-1.17.30-2.23以上的版本就能正常使用mySQL了。
如果你原來(lái)的系統(tǒng)安裝了 selinux-policy-targeted-source (源代碼),那么你也必需下載source的rpm文件,并首先升級(jí)這個(gè)包,因?yàn)閮蓚€(gè)包有依賴關(guān)系。
補(bǔ)丁安裝辦法:
使用root用戶。
先升級(jí)新的target-policy-source (如果你之前安裝了這個(gè)包的話)
# rpm -Uvh selinux-policy-targeted-sources-1.17.30-2.61.noarch.rpm
升級(jí)新的target-policy
# rpm -Uvh selinux-policy-targeted-1.17.30-2.61.noarch.rpm
更新mysql相關(guān)的target policy
# rpm -q -l mysql-server | restorecon -R -v -f -
# rpm -q -l mysql | restorecon -R -v -f -
重起mysql的服務(wù)
# service mysqld restart
試一下吧,一定有效