在使用CentOS時(shí)多多少少會(huì)涉及SELinux允睹,尤其是針對(duì)Web服務(wù),大部分的做法是關(guān)閉SELinux幌氮,正確的做法是設(shè)置好SELiunx缭受,可以防范網(wǎng)站攻擊風(fēng)險(xiǎn)。
本文參照官方SELinux文檔整理
1. Apache HTTP服務(wù)和SELinux
當(dāng)SELinux啟動(dòng)该互,Apache HTTP服務(wù)(httpd
)默認(rèn)運(yùn)行在受限模式下米者。運(yùn)行的進(jìn)程只能在設(shè)定好的域domains
內(nèi)運(yùn)行,并與其他受限進(jìn)程分開(kāi)宇智。如果一個(gè)受限進(jìn)程被攻擊蔓搞,依靠SELinux策略policy
配置,攻擊者訪問(wèn)的資源和可能的損失都會(huì)被限制随橘。
接下來(lái)演示一下:
- 運(yùn)行
getenforce
命令確認(rèn)SELinux的運(yùn)行在enforcing
強(qiáng)制模式下:
~]# getenforce
Enforcing
- 查看
httpd
的狀態(tài)喂分,確認(rèn)服務(wù)正在運(yùn)行:
~]# systemctl status httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2018-11-05 17:13:09 CST; 43min ago
- 查看
httpd
進(jìn)程是否關(guān)聯(lián)了SELinuxcontext
(上下文):
~]# ps -eZ | grep httpd
system_u:system_r:httpd_t:s0 30275 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 30276 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 30277 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 30278 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 30279 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 30280 ? 00:00:00 httpd
通過(guò)
ps
命令的-Z
參數(shù)可以查看進(jìn)城SELinux上下文狀態(tài)。
SELinux 上下文與httpd
進(jìn)程關(guān)聯(lián)內(nèi)容為机蔗,system_u:system_r:httpd_t:s0
蒲祈。其中httpd_t
是SELinux的類(lèi)型type
。這個(gè)類(lèi)型定義了一個(gè)進(jìn)程域domain
和一個(gè)文件類(lèi)型type
萝嘁。
當(dāng)前httpd
進(jìn)程運(yùn)行在httpd_t
域httpd_t
中梆掸。
SELinux策略policy
定義了在受限域(如httpd_t
)中運(yùn)行的進(jìn)程,如何與文件牙言、其他進(jìn)程和系統(tǒng)進(jìn)行交互沥潭。
文件必須被正確標(biāo)記label
,以通過(guò)httpd
訪問(wèn)它們嬉挡。比如:httpd
可以讀取標(biāo)記為httpd_sys_content_t
類(lèi)型的文件钝鸽,但是不能進(jìn)行寫(xiě)入操作,即便是文件加入了寫(xiě)入權(quán)限庞钢,如下:
~]# ls -Z /var/www/html/index.html
-rw-rw-rw-. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
SELinux的布爾型設(shè)置boolean
必須啟動(dòng)拔恰,以便允許確定的行為,比如基括,允許腳本網(wǎng)絡(luò)訪問(wèn)颜懊,允許httpd
訪問(wèn)NFS
和CIFS
卷,或者httpd
允許執(zhí)行CGI
腳本风皿。
2. Apache HTTP端口與SELinux端口
當(dāng)/etc/httpd/conf/httpd.conf
文件配置完河爹,httpd
監(jiān)聽(tīng)一個(gè)或多個(gè)端口,比如80
,443
,448
,8080
,8009
或者8443
等等桐款。
必須使用semanage port
命令添加新的端口到SELinux策略配置中咸这。
下面演示使用新的httpd
端口后,必須添加SELinux端口策略魔眨,否側(cè)httpd
無(wú)法啟動(dòng)媳维。
- 確認(rèn)
httpd
服務(wù)沒(méi)有運(yùn)行
~]# systemctl stop httpd
~]# systemctl status httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
- 使用
semanage
工具查看當(dāng)前關(guān)于httpd
的監(jiān)聽(tīng)端口:
~]# semanage port -l | grep -w http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
- 編輯
/etc/httpd/conf/httpd.conf
文件,修改Listen
的端口號(hào)為12345
遏暴,可以確認(rèn)12345
端口不再SELinux策略policy
配置中:
~]# vim /etc/httpd/conf/httpd.conf
---
#Listen 12.34.56.78:80
Listen 12345
---
- 再次啟動(dòng)
httpd
查看結(jié)果:
~]# systemctl start httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.
~]# ausearch -m avc -c httpd
type=AVC msg=audit(1541420299.439:1731): avc:
denied { name_bind } for pid=51139 comm="httpd" src=12345
scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0
tclass=tcp_socket
httpd
服務(wù)無(wú)法啟動(dòng)
使用ausearch
命令查看SELinux相關(guān)日志
日志顯示SELinux已經(jīng)拒絕(denied)啟動(dòng)httpd
服務(wù)
- 現(xiàn)在允許
httpd
監(jiān)聽(tīng)12345
端口
~]# semanage port -a -t http_port_t -p tcp 12345
~]# semanage port -l | grep httpd
http_port_t tcp 12345, 80, 81, 443, 488, 8008, 8009, 8443, 9000
- 再次啟動(dòng)
httpd
服務(wù)侄刽,可以看到添加端口后,服務(wù)正常啟動(dòng)了
~]# systemctl start httpd.service
為了保證能正常訪問(wèn)朋凉,還需要在防火墻中添加端口
12345
~]# firewall-cmd --permanent --add-port=12345/tcp ~]# firewall-cmd --reload
- 至此可以發(fā)現(xiàn)SELinux中對(duì)于端口的限制策略州丹。
注意:
a.semanage port
刪除端口,使用-d
參數(shù)即可
semanage port -d -t http_port_t -p tcp 12345
b.firewall-cmd
刪除端口杂彭,使用--remove-port
參數(shù)
firewall-cmd --permanent --remove-port=12345/tcp
firewall-cmd --reload
3. 類(lèi)型上下文(TYPES)
在SELinux的默認(rèn)策略targeted
中墓毒,高級(jí)進(jìn)程隔離的主要權(quán)限控制方法是使用類(lèi)型強(qiáng)制Type EnForcement
。
所有文件和進(jìn)程都使用類(lèi)型type
標(biāo)簽label
來(lái)標(biāo)記:為進(jìn)程定義一個(gè)SELinux域domain
類(lèi)型盖灸,為文件定義一個(gè)SELinux類(lèi)型type
蚁鳖。
SELinux策略規(guī)則定義了類(lèi)型如何互相訪問(wèn),域是不是正在訪問(wèn)一個(gè)類(lèi)型赁炎,或者一個(gè)域訪問(wèn)其他的域醉箕。
只有在指定SELinux策略規(guī)則允許訪問(wèn)時(shí),才能訪問(wèn)讥裤。
參照下面例子在/var/www/html/
目錄中創(chuàng)建一個(gè)新文件己英,顯示當(dāng)前文件是繼承了父目錄/var/www/html/
目錄下的httpd_sys_content_t
類(lèi)型:
- 查看
/var/www/html/
目錄的SELinux上下文context
:
~]# ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
可以看到當(dāng)前目錄使用的是
httpd_sys_content_t
類(lèi)型
所有的類(lèi)型上下文都用_t
結(jié)尾
- 創(chuàng)建一個(gè)新文件再次驗(yàn)證文件的類(lèi)型上下文:
~]# touch /var/www/html/myfile1
~]# ls -Z /var/www/html/myfile1
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/myfile1
可以看到文件的類(lèi)型上下文被標(biāo)記為
httpd_sys_content_t
厢破,說(shuō)明這是繼承了父目錄的類(lèi)型上下文摩泪。
使用httpd_sys_content_t
類(lèi)型见坑,那么SELinux允許httpd
讀取當(dāng)前文件,但不允許寫(xiě)操作熊楼,即便是給文件加入了寫(xiě)權(quán)限。
SELinux策略定義了運(yùn)行在httpd_t
域中的進(jìn)程可以讀寫(xiě)的類(lèi)型,這有助于防止進(jìn)程訪問(wèn)其他進(jìn)程使用的文件。
例如:httpd
能訪問(wèn)標(biāo)記為httpd_sys_content_t
類(lèi)型的文件合瓢,但是默認(rèn)情況下不能訪問(wèn)標(biāo)記為samba_share_t
類(lèi)型的文件晴楔。
同樣税弃,在用戶主目錄中的文件被標(biāo)記為user_home_t
類(lèi)型:默認(rèn)在用戶目錄中,不允許httpd
讀取或?qū)懭胛募?/p>
下面列出了一些關(guān)于httpd
的類(lèi)型幔翰,不同的類(lèi)型允許靈活的配置和訪問(wèn):
httpd_sys_content_t
這個(gè)類(lèi)型針對(duì)靜態(tài)web內(nèi)容,比如靜態(tài)網(wǎng)站使用的.html
文件做修。
標(biāo)記為這種類(lèi)型的文件蔗坯,httpd
可以讀取訪問(wèn)步悠,并且可以執(zhí)行腳本答姥。
默認(rèn)情況下,標(biāo)有此類(lèi)型的文件和目錄不能被httpd
或其他進(jìn)程寫(xiě)入或修改尚粘。
需要注意的是,默認(rèn)情況下敲长,在/var/www/html/
目錄中創(chuàng)建或復(fù)制的文件都用httpd_sys_content_t
類(lèi)型標(biāo)記。
httpd_sys_script_exec_t
如果希望httpd
執(zhí)行的腳本泽铛,使用這種類(lèi)型。
這種類(lèi)型通常用于/var/www/cgi-bin/
目錄中的通用網(wǎng)關(guān)接口(CGI
)腳本辑鲤。
默認(rèn)情況下,SELinux策略阻止httpd
執(zhí)行CGI
腳本月褥。為了實(shí)現(xiàn)這一點(diǎn)弛随,使用httpd_sys_script_exec_t
類(lèi)型標(biāo)記腳本宁赤,并啟用httpd_enable_cgi
布爾值舀透。
用httpd_sys_script_exec_t
標(biāo)記的腳本在httpd_sys_script_t
域中運(yùn)行時(shí)被httpd
執(zhí)行愕够。
httpd_sys_script_t
域可以訪問(wèn)其他系統(tǒng)域挚躯,比如postgresql_t
和mysqld_t
。
httpd_sys_rw_content_t
標(biāo)記為這種類(lèi)型的文件可以由標(biāo)記為httpd_sys_script_exec_t
類(lèi)型的腳本寫(xiě)入感挥,但不能被標(biāo)記為任何其他類(lèi)型的腳本修改。
標(biāo)記為httpd_sys_rw_content_t
類(lèi)型來(lái)標(biāo)記文件越败,將由具有httpd_sys_script_exec_
t類(lèi)型的腳本讀取和寫(xiě)入触幼。
httpd_sys_ra_content_t
標(biāo)記為這種類(lèi)型的文件可以由標(biāo)記為httpd_sys_script_exec_t
類(lèi)型的腳本追加寫(xiě)入,但不能由標(biāo)記為任何其他類(lèi)型的腳本修改究飞。
使用httpd_sys_ra_content_t
類(lèi)型來(lái)標(biāo)記的文件置谦,將由標(biāo)有httpd_sys_script_exec_t
類(lèi)型的腳本讀取并追加到這些文件中。
httpd_unconfined_script_exec_t
標(biāo)記為這種類(lèi)型的腳本亿傅,意味著腳本不受限媒峡,運(yùn)行在沒(méi)有SELinux保護(hù)的情況下。
在無(wú)可奈何的情況下葵擎,針對(duì)對(duì)復(fù)雜腳本使用此類(lèi)型谅阿。
換個(gè)角度來(lái)說(shuō),最好使用這種類(lèi)型酬滤,而不是對(duì)httpd
或整個(gè)系統(tǒng)禁用SELinux保護(hù)签餐。
4. 修改SELinux上下文context
a. 臨時(shí)修改上下文
可以通過(guò)使用chcon
命令修改文件和目錄的類(lèi)型上下文。chcon
的修改模式是臨時(shí)的盯串,當(dāng)系統(tǒng)重新標(biāo)記relabel
或者執(zhí)行restorecon
命令時(shí)就會(huì)失效氯檐。
SELinux策略控制用戶是否能夠修改指定文件的SELinux上下文。
接下來(lái)演示嘴脾,創(chuàng)建一個(gè)新的目錄/my/website/
和index.html
文件供httpd
使用男摧,并且設(shè)置標(biāo)簽允許httpd
訪問(wèn):
- 在根目錄下,創(chuàng)建一個(gè)新的目錄译打,查看當(dāng)前目錄的上下文狀態(tài):
~]# mkdir -p /my/website
~]# ls -dZ /my
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /my
可以看到默認(rèn)新建的目錄的類(lèi)型上下文是
default_t
- 使用
chcon
命令修改/my/
目錄及子目錄的類(lèi)型上下文:
~]# chcon -R -t httpd_sys_content_t /my/
~]# ls -dZ /my
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /my
~]# ls -Z /my
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 website
可以看到
/my/
目錄和子目錄/website
的類(lèi)型上下文都修改為httpd_sys_content_t
chcon
命令的-R
參數(shù)是遞歸全部子目錄和文件
chcon
命令的-t
參數(shù)是添加一個(gè)類(lèi)型
- 創(chuàng)建一個(gè)新文件耗拓,查看文件的類(lèi)型上下文:
~]# touch /my/website/index.html
~]# ls -Z /my/website/index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
可以看到,新建文件自動(dòng)繼承了奏司,所在文件夾的類(lèi)型上下文
b. 永久修改上下文
使用semanage fcontext
命令是創(chuàng)建一個(gè)標(biāo)簽乔询,并在重新標(biāo)記,配合restorecon
命令使用韵洋。
步驟:先使用semanage fcontext
修改文件上下文的配置竿刁,然后運(yùn)行restorecon
,讀取文件的上下文配置搪缨,并且允許修改標(biāo)簽食拜。
接下來(lái)還是使用上面的例子來(lái)演示,創(chuàng)建一個(gè)新的目錄/my/website/
和index.html
文件供httpd
使用副编,并且設(shè)置標(biāo)簽允許httpd
訪問(wèn):
- 在根目錄下负甸,創(chuàng)建一個(gè)新的目錄,查看當(dāng)前目錄的上下文狀態(tài):
~]# mkdir -p /my/website
~]# ls -dZ /my
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /my
- 使用
semanage fcontext
命令修改類(lèi)型上下文:
~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
~]# ls -dZ /my
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /my
可以看到使用
semanage fcontext
命令后,文件夾的類(lèi)型上下文并沒(méi)有發(fā)生變化呻待。
- 創(chuàng)建一個(gè)新的文件:
~]# touch /my/website/index.html
~]# ls -Z /my/website/index.html
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 /my/website/index.html
新建的文件
index.html
類(lèi)型上下文也沒(méi)有發(fā)生改變
- 接下來(lái)使用
restorecon
命令重新讀取文件上下文配置:
~]# restorecon -R -v /my/
restorecon reset /my context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /my/website context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
至此打月,可以看到文件夾和文件的類(lèi)型上下文都變?yōu)?code>httpd_sys_content_t。
restorecon
命令的-R
參數(shù)是遞歸全部子目錄和文件
restorecon
命令的-v
參數(shù)是顯示修改的標(biāo)記
5.布爾值設(shè)置boolean
SELinux是在系統(tǒng)底層運(yùn)行蚕捉。服務(wù)以多種方式運(yùn)行奏篙,可以通過(guò)使用布爾值來(lái)實(shí)現(xiàn)如何運(yùn)行指定的服務(wù)。布爾值設(shè)置允許在運(yùn)行時(shí)更改SELinux策略的部分內(nèi)容迫淹,而不需要了解如何編寫(xiě)SELinux的策略秘通。布爾值是實(shí)時(shí)更新的,例如允許服務(wù)訪問(wèn)NFS卷敛熬,而無(wú)需重新加載或重新編譯SELinux策略充易。
修改布爾值的狀態(tài)很簡(jiǎn)單,只需通過(guò)setsebool
命令即可荸型。比如:啟動(dòng)httpd_anon_write
布爾值,輸入下面的命令:
~]# setsebool httpd_anon_write on
關(guān)閉一個(gè)布爾值同樣使用setsebool
命令炸茧,僅僅是在on
和off
之間切換:
~]# setsebool httpd_anon_write off
需要注意
如果想永久修改布爾值瑞妇,需要在setsebool
命令后加入-P
參數(shù)。
一旦加入-P
參數(shù)梭冠,則系統(tǒng)重啟后依然有效辕狰。
下面列出與httpd
相關(guān)的部分布爾值:
布爾值 | 說(shuō)明 |
---|---|
httpd_anon_write | 當(dāng)被禁用時(shí),這個(gè)布爾值允許httpd只能讀取標(biāo)記為public_content_rw_t類(lèi)型的文件控漠。啟用此布爾值允許httpd寫(xiě)入標(biāo)記為public_content_rw_t類(lèi)型的文件蔓倍,例如包含公共文件傳輸服務(wù)文件的公共目錄。 |
httpd_mod_auth_ntlm_winbind | 啟用此布爾值允許使用httpd中的mod_auth_ntlm_winbind模塊訪問(wèn)NTLM和Winbind身份驗(yàn)證機(jī)制盐捷。 |
httpd_mod_auth_pam | 啟用此布爾值允許使用httpd中的mod_auth_pam模塊訪問(wèn)PAM身份驗(yàn)證機(jī)制偶翅。 |
httpd_sys_script_anon_write | 這個(gè)布爾值定義是否允許HTTP腳本對(duì)標(biāo)記為public_content_rw_t類(lèi)型的文件進(jìn)行寫(xiě)訪問(wèn),就像在公共文件傳輸服務(wù)中使用的那樣碉渡。 |
httpd_builtin_scripting | 這個(gè)布爾定義了對(duì)httpd腳本的訪問(wèn)聚谁。PHP內(nèi)容通常需要啟用這個(gè)布爾值。 |
httpd_can_network_connect | 當(dāng)禁用此布爾值時(shí)滞诺,將阻止HTTP腳本和模塊啟動(dòng)到網(wǎng)絡(luò)或遠(yuǎn)程端口的連接形导。啟用此布爾值以允許此訪問(wèn)。 |
httpd_can_network_connect_db | 當(dāng)禁用此布爾值時(shí)习霹,將阻止HTTP腳本和模塊啟動(dòng)到數(shù)據(jù)庫(kù)服務(wù)器的連接朵耕。啟用此布爾值以允許此訪問(wèn)。 |
httpd_can_network_relay | 當(dāng)httpd用作正向或反向代理時(shí)淋叶,啟用此布爾值阎曹。 |
httpd_can_sendmail | 當(dāng)禁用此布爾值時(shí),將阻止HTTP模塊發(fā)送郵件。如果在httpd中發(fā)現(xiàn)漏洞芬膝,這可以防止垃圾郵件攻擊望门。啟用此布爾值以允許HTTP模塊發(fā)送郵件。 |
httpd_dbus_avahi | 當(dāng)被禁用時(shí)锰霜,這個(gè)布爾值拒絕httpd通過(guò)總線訪問(wèn)avahi服務(wù)筹误。啟用此布爾值以允許此訪問(wèn)。 |
httpd_enable_cgi | 當(dāng)禁用此布爾值時(shí)癣缅,將阻止httpd執(zhí)行CGI腳本厨剪。啟用此布爾值以允許httpd執(zhí)行CGI腳本(CGI腳本必須用httpd_sys_script_exec_t類(lèi)型標(biāo)記)。 |
httpd_enable_ftp_server | 啟用此布爾值允許httpd在FTP端口上偵聽(tīng)并充當(dāng)FTP服務(wù)器友存。 |
httpd_enable_homedirs | 當(dāng)禁用此布爾值時(shí)祷膳,將阻止httpd訪問(wèn)用戶主目錄。啟用此布爾值以允許httpd訪問(wèn)用戶主目錄;例如屡立,/home/*/中的內(nèi)容直晨。 |
httpd_execmem | 當(dāng)啟用時(shí),這個(gè)布爾值允許httpd執(zhí)行需要可執(zhí)行和可寫(xiě)的內(nèi)存地址的程序膨俐。從安全角度來(lái)看勇皇,不建議啟用這個(gè)布爾值,因?yàn)樗鼫p少了對(duì)緩沖區(qū)溢出的保護(hù)焚刺,但是某些模塊和應(yīng)用程序(如Java和Mono應(yīng)用程序)需要這個(gè)特權(quán)敛摘。 |
httpd_ssi_exec | 這個(gè)布爾值定義web頁(yè)面中的服務(wù)器端包含(SSI)元素是否可以執(zhí)行。 |
httpd_tty_comm | 此布爾值定義是否允許httpd訪問(wèn)控制終端乳愉。通常不需要這種訪問(wèn)兄淫,但是在配置SSL證書(shū)文件等情況下,顯示和處理密碼提示需要終端訪問(wèn)蔓姚。 |
httpd_unified | 啟用后捕虽,此布爾值允許httpd_t完全訪問(wèn)所有httpd類(lèi)型(即執(zhí)行、讀取或?qū)懭雜ys_content_t)坡脐。禁用時(shí)薯鳍,在只讀、可寫(xiě)或可執(zhí)行的web內(nèi)容之間存在分離挨措。禁用此布爾值可以確保額外的安全級(jí)別挖滤,但增加了管理開(kāi)銷(xiāo),即必須根據(jù)每個(gè)腳本和其他web內(nèi)容各自具有的文件訪問(wèn)權(quán)限分別標(biāo)記腳本和其他web內(nèi)容浅役。 |
httpd_use_cifs | 啟用此布爾值以允許httpd訪問(wèn)標(biāo)記為cifs_t類(lèi)型的CIFS卷上的文件斩松,例如使用Samba掛載的文件系統(tǒng)。 |
httpd_use_nfs | 啟用此布爾值以允許httpd訪問(wèn)標(biāo)為nfs_t類(lèi)型的NFS卷上的文件觉既,例如使用NFS掛載的文件系統(tǒng)惧盹。 |
提示:
可以使用getsebool -a
命令獲取全部的布爾值~]$ getsebool -a | grep service_name
使用下面的命令查詢(xún)具體布爾值的說(shuō)明:
~]$ sepolicy booleans -b boolean_name
需要安裝
policycoreutils-devel
軟件包乳幸,才能使用sepolicy
命令。