linux的訪問(wèn)控制
-
Discretionary Access Control(DAC)
自主(自由)訪問(wèn)控制:這種訪問(wèn)控制下棚壁,一個(gè)進(jìn)程如果被劫持您朽,那這個(gè)進(jìn)程就有了運(yùn)行這個(gè)進(jìn)程用戶(hù)的所有訪問(wèn)權(quán)限带射。如:
一個(gè)httpd進(jìn)程
[root@localhost ~]# ps aux |grep httpd
apache 3937 0.0 0.2 224060 2944 ? S 18:37 0:00 /usr/sbin/httpd -DFOREGROUND
apache 3938 0.0 0.2 224060 2944 ? S 18:37 0:00 /usr/sbin/httpd -DFOREGROUND
apache 3939 0.0 0.2 224060 2944 ? S 18:37 0:00 /usr/sbin/httpd -DFOREGROUND
....
httpd進(jìn)程的屬于apche用戶(hù)的萍虽,我們來(lái)看一下,/etc/passwd文件
[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1204 Oct 26 18:37 /etc/passwd
這里可以看出/etc/passwd
文件是root用戶(hù)藐不,root組的滋恬,但other用戶(hù)是對(duì)這個(gè)文件是有r
權(quán)限的聊训,那如果有人劫持了httpd進(jìn)程,那他就可以訪問(wèn)到/etc/passwd
文件恢氯,這種不就知道了系統(tǒng)上有什么用戶(hù)了带斑,就可以有針對(duì)性的對(duì)用戶(hù)進(jìn)程密碼破解。系統(tǒng)中other用戶(hù)對(duì)很多的文件都有r
權(quán)限勋拟,這是非常不安全的勋磕。
在自主訪問(wèn)控制下,沒(méi)有辦法將一個(gè)進(jìn)程的訪問(wèn)限制在一個(gè)允許的范圍內(nèi)敢靡。如:
httpd進(jìn)程就只能訪問(wèn)我們提供給用戶(hù)可以訪問(wèn)的資源挂滓,而我們不想用戶(hù)看到的資源,就不能訪問(wèn)醋安。那這樣如httpd進(jìn)程被劫持了杂彭,那也就只能訪問(wèn)有限的資源,不可能看到其它的資源吓揪。
這能不能實(shí)現(xiàn)呢亲怠?
-
Mandatory Access Control(MAC)
在MAC(強(qiáng)制訪問(wèn)控制)這種模型里,管理員管理訪問(wèn)控制柠辞。管理員制定策略团秽,用戶(hù)不能改變它。策略定義了哪個(gè)主體能訪問(wèn)哪個(gè)對(duì)象叭首。這種訪問(wèn)控制模型可以增加安全級(jí)別习勤,因?yàn)樗诓呗裕魏螞](méi)有被顯式授權(quán)的操作都不能執(zhí)行焙格。MAC被開(kāi)發(fā)和實(shí)現(xiàn)在最重視保密的系統(tǒng)中图毕,如軍事系統(tǒng)。主體獲得清楚的標(biāo)記眷唉,對(duì)象得到分類(lèi)標(biāo)記予颤,或稱(chēng)安全級(jí)別。
在“強(qiáng)制訪問(wèn)控制”模型中冬阳,每一個(gè)進(jìn)程能做什么都有明確的規(guī)則蛤虐,而且遵循沒(méi)有明確說(shuō)明可以訪問(wèn)的,就不能訪問(wèn)肝陪,這樣能在任何一個(gè)進(jìn)程被劫持也只能訪問(wèn)我們定義規(guī)則中明確說(shuō)明它能訪問(wèn)的資源驳庭,所能破壞的也在定義的范圍內(nèi),(這就是最小訪問(wèn)原則)
-
SELinux
selinux就是一種mac的訪問(wèn)控制氯窍,任何一個(gè)進(jìn)程的訪問(wèn)都要經(jīng)過(guò)selinux中定義的規(guī)則檢查饲常,通過(guò)才能進(jìn)行訪問(wèn)
規(guī)則定義在什么地方呢?
-
policy(政策)
這就是規(guī)則庫(kù)狼讨,一堆的規(guī)則(rule)集合在一起就成了政策(policy)不皆,那按照MAC的定義是不是要將系統(tǒng)上所有的程序能做什么都寫(xiě)成規(guī)則才能使用selinux呢?理論上是的熊楼,只有這樣才能做到最小化訪問(wèn)原則霹娄,但每一個(gè)系統(tǒng)上運(yùn)行的程序千千萬(wàn)萬(wàn),光是寫(xiě)這個(gè)規(guī)則我想都沒(méi)有人再去用selinux了鲫骗。(而且規(guī)則不是普通用戶(hù)能寫(xiě)的)
那怎么使用呢犬耻?還好在Centos 7 中為我們提供了有policy
[root@localhost ~]# ll /etc/sysconfig/selinux
lrwxrwxrwx. 1 root root 17 Oct 10 19:24 /etc/sysconfig/selinux -> ../selinux/config
[root@localhost ~]# 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 three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
在/etc/selinux/conf
中系統(tǒng)為我們提供了三種policy
- targeted
默認(rèn)使用的policy,只能有限的程序受selinux的保護(hù)执泰。 - minimum
這是targeted的修改版枕磁,僅選定的進(jìn)程受保護(hù)。(用的不多) - mls
多級(jí)安全保護(hù)术吝。(用的不多)
像上面所有的如果要所有的程序都受selinux的控制计济,這將是一個(gè)非常龐大的工程茸苇,對(duì)用戶(hù)來(lái)說(shuō)基本沒(méi)有用戶(hù)體驗(yàn),(我們不能做任何事沦寂,除非在policy中添加我們能做什么的rule学密,那光寫(xiě)rule就天荒地老了,還用什么传藏?)所以只控制有限的程序是一個(gè)不錯(cuò)的選擇
-
安全上下文(Security Context)
在啟動(dòng)selinux后腻暮,系統(tǒng)中所有的資源都會(huì)被打標(biāo)(label),這就是安全上下文(context)毯侦。selinux就是通過(guò)這些標(biāo)記來(lái)輔助完成訪問(wèn)控制的哭靖。
規(guī)則中不可能寫(xiě) httpd進(jìn)程能訪問(wèn)/var/www/html/index.html文件
,這樣的具體的條目侈离,這樣改一下 httpd
的文件名那所有的規(guī)則就都要重寫(xiě)试幽,明顯不能這么做,那又要怎么做呢卦碾?
先看一下安全上下文長(zhǎng)什么樣:
[root@localhost ~]# ls -Z /sbin/httpd
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /sbin/httpd
[root@localhost ~]# ps -eZ |grep httpd
system_u:system_r:httpd_t:s0 3936 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 3937 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 3938 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 3939 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 3940 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 3941 ? 00:00:00 httpd
[root@localhost ~]# ls -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
看到加上-Z
選項(xiàng)后多出來(lái)的顯示了嗎抡草?這就是context
system_u:system_r:httpd_t:s0
unconfined_u:object_r:httpd_sys_content_t:s0
這里有四段:
user:role:type:range
字段 | 說(shuō)明 |
---|---|
user | SELinux用戶(hù)身份。這可以與允許SELinux用戶(hù)使用的一個(gè)或多個(gè)角色相關(guān)聯(lián)蔗坯。 使用SELinux策略將每個(gè)Linux用戶(hù)映射到一個(gè)SELinux用戶(hù)康震。這使Linux用戶(hù)可以繼承對(duì)SELinux用戶(hù)的限制。映射的SELinux用戶(hù)身份在SELinux上下文中用于該會(huì)話(huà)中的進(jìn)程宾濒,以便定義他們可以輸入哪些角色和級(jí)別腿短。 |
role | SELinux角色。這可以與SELinux用戶(hù)被允許訪問(wèn)的一種或多種類(lèi)型相關(guān)聯(lián)绘梦。 SELinux的一部分是基于角色的訪問(wèn)控制(RBAC)安全模型橘忱。該角色是RBAC的屬性。 SELinux用戶(hù)被授權(quán)使用角色卸奉,角色被授權(quán)用于域钝诚。該角色充當(dāng)域和SELinux用戶(hù)之間的中介¢茫可以輸入的角色決定了可以輸入哪些域凝颇。最終,它控制可以訪問(wèn)的對(duì)象類(lèi)型疹鳄。這有助于減少特權(quán)升級(jí)攻擊的漏洞拧略。 |
type | 當(dāng)類(lèi)型與進(jìn)程相關(guān)聯(lián)時(shí),它定義SELinux用戶(hù)(subject)可以訪問(wèn)哪些進(jìn)程(或domain)瘪弓。 當(dāng)類(lèi)型與object相關(guān)聯(lián)時(shí)垫蛆,它定義SELinux用戶(hù)對(duì)該object具有什么訪問(wèn)權(quán)限。 類(lèi)型是類(lèi)型強(qiáng)制的屬性。該類(lèi)型定義進(jìn)程的域袱饭,并定義文件的類(lèi)型川无。 SELinux策略規(guī)則定義類(lèi)型如何相互訪問(wèn),無(wú)論是訪問(wèn)類(lèi)型的域還是訪問(wèn)另一個(gè)域的域虑乖。僅當(dāng)存在允許訪問(wèn)的特定SELinux策略規(guī)則時(shí)懦趋,才允許訪問(wèn)。 |
range | 此字段也可以稱(chēng)為級(jí)別决左,并且僅在策略支持MCS或MLS時(shí)才顯示愕够。該條目可以包括: ?單個(gè)安全級(jí)別走贪,其中包含敏感級(jí)別和零個(gè)或多個(gè)類(lèi)別 (例如s0佛猛,s1:c0,s7:c10.c15) ?由兩個(gè)安全級(jí)別(低和高)組成的范圍坠狡,兩個(gè)安全級(jí)別之間用連字符分隔 (例如s0-s15:c0.c1023)继找。 |
上面的做個(gè)了解就好,在Centos的targeted中可以不去關(guān)心user逃沿、role婴渡、range,只關(guān)心type就好了
類(lèi)型是類(lèi)型強(qiáng)制的屬性凯亮。該類(lèi)型定義進(jìn)程的域边臼,并定義文件的類(lèi)型。 SELinux策略規(guī)則定義類(lèi)型如何相互訪問(wèn)假消,無(wú)論是訪問(wèn)類(lèi)型的域還是訪問(wèn)另一個(gè)域的域柠并。僅當(dāng)存在允許訪問(wèn)的特定SELinux策略規(guī)則時(shí),才允許訪問(wèn)富拗。
type 這個(gè)字段臼予,在進(jìn)程和文件(linux上一切皆文件)上有不同的稱(chēng)呼
在進(jìn)程上,一般稱(chēng)作domain / 域
在文件上啃沪,一般稱(chēng)作type / 類(lèi)型
再來(lái)看一下上面的安全上下文
system_u:object_r:httpd_exec_t:s0 /sbin/httpd
文件
system_u:system_r:httpd_t:s0 3936 ? 00:00:00 httpd
進(jìn)程
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
文件
我們知道在Centos中httpd服務(wù)的默認(rèn)訪問(wèn)路徑在/var/www/html/中粘拾,我們安裝、啟動(dòng)一個(gè)httpd服務(wù)创千,再在/var/www/html/下創(chuàng)建的html文件缰雇,可以直接在瀏覽器中訪問(wèn)
現(xiàn)在來(lái)解釋一下這個(gè)上下文,用戶(hù)執(zhí)行了httpd_exec_t
類(lèi)型的httpd程序追驴,可以產(chǎn)生一個(gè)工作在httpd_t
域的進(jìn)程寓涨,這個(gè)進(jìn)程可以訪問(wèn)httpd_sys_content_t
類(lèi)型的文件/var/www/html/index.html
這些其實(shí)都是在policy中有明確的rule定義的
從 httpd_exec_t
類(lèi)型(entrypoint)運(yùn)行進(jìn)入 httpd_t
域
[root@localhost ~]# sesearch -A -t httpd_exec_t |grep httpd_t
allow httpd_t httpd_exec_t : file { ioctl read getattr lock map execute execute_no_trans entrypoint open } ;
...
httpd_t
域可以 訪問(wèn) httpd_sys_content_t
類(lèi)型的鏈接文件、目錄氯檐、文件
[root@localhost ~]# sesearch -A -s httpd_t |grep httpd_sys_content_t
allow httpd_t httpd_sys_content_t : lnk_file { read getattr } ;
allow httpd_t httpd_sys_content_t : dir { ioctl read getattr lock search open } ;
allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock map open } ;
allow httpd_t httpd_sys_content_t : dir { ioctl read write getattr lock add_name remove_name search open } ;
這里要說(shuō)明一個(gè)戒良,在開(kāi)啟了selinux,并執(zhí)行targeted 策略后冠摄,系統(tǒng)為我們定義了一堆的rule糯崎,來(lái)控制常見(jiàn)的網(wǎng)絡(luò)服務(wù)几缭,如:httpd,vsftp沃呢,samba等等
[root@localhost html]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
[root@localhost html]# chcon -t admin_home_t index.html
[root@localhost html]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 index.html
這是因?yàn)檫\(yùn)行在httpd_t
域的httpd薄霜,不能read(讀) admin_home_t
類(lèi)型的文件
[root@localhost html]# mkdir -pv /service/http/
mkdir: created directory ‘/service’
mkdir: created directory ‘/service/http/’
[root@localhost html]# ls -dZ /service/http/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /service/http/
這是因?yàn)閜olicy中定義/var/www/html目錄和其下的目錄、文件的type為httpd_sys_content_t
惰瓜,這樣運(yùn)行在httpd_t
域的httpd否副,就可以訪問(wèn)了,但將DocumentRoot重新指定位置后崎坊,在policy中就沒(méi)有我們指定位置的相關(guān)定義备禀,不會(huì)將指定的目錄的context設(shè)置為typehttpd_sys_content_t
,這樣httpd進(jìn)程也就不能正常訪問(wèn)了
以上都可以將httpd服務(wù)的網(wǎng)站 目錄、文件(object)類(lèi)型修改為httpd_sys_content_t
就可以正常訪問(wèn)了
其實(shí)還有一種修改方法奈揍,但不建議在實(shí)際中使用
? 一直說(shuō)targeted 只控制了部分的進(jìn)程曲尸,那就將系統(tǒng)中的進(jìn)程分為了confined
(受控) 和 unconfined
(不受控),我們是不是可以將httpd調(diào)整為 不受控 呢男翰?
[root@localhost html]# systemctl stop httpd
[root@localhost html]# ls -Z /bin/cat
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /bin/cat
[root@localhost html]# ls -Z /sbin/httpd
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /sbin/httpd
[root@localhost html]# chcon -t bin_t /sbin/httpd
[root@localhost html]# ls -Z /sbin/httpd
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /sbin/httpd
[root@localhost html]# systemctl start httpd
[root@localhost html]# ps -eZ |grep httpd
system_u:system_r:unconfined_service_t:s0 4517 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 4518 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 4519 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 4520 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 4521 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 4522 ? 00:00:00 httpd
可以看到現(xiàn)在httpd進(jìn)程的domain變?yōu)榱藆nconfined_service_t另患,現(xiàn)在再來(lái)訪問(wèn)網(wǎng)站就不再受控于selinux了,你再像上面的例子調(diào)整網(wǎng)站文件的位置蛾绎,type都可以正常訪問(wèn)了昆箕,(當(dāng)然DAC還是要遵守的)。
-
BOOLEANS(布爾值)
在targeted中秘通,關(guān)于context的規(guī)則我們沒(méi)有能力去修改(能力有限啊为严,聽(tīng)說(shuō)寫(xiě)規(guī)則是一項(xiàng)專(zhuān)業(yè)的技能),但有著一些boolean我們是可以去改變的
布爾值允許在運(yùn)行時(shí)更改SELinux策略的某些部分肺稀,而無(wú)需任何SELinux策略編寫(xiě)知識(shí)第股。這允許進(jìn)行更改,例如允許服務(wù)訪問(wèn)NFS卷话原,而無(wú)需重新加載或重新編譯SELinux策略夕吻。
這個(gè)值一般是讓我們可以改變服務(wù)的運(yùn)行特性
如:
[root@localhost html]# semanage boolean -l
SELinux boolean State Default Description
httpd_enable_cgi (on , on) Allow httpd to enable cgi
httpd_use_nfs (off , off) Allow httpd to use nfs
httpd_anon_write (off , off) Allow httpd to anon write
...
ftpd_anon_write (off , off) Allow ftpd to anon write
...
samba_enable_home_dirs (off , off) Allow samba to enable home dirs
samba_create_home_dirs (off , off) Allow samba to create home dirs
samba_share_nfs (off , off) Allow samba to share nfs
...
這里定義了targeted認(rèn)為不安全的一些服務(wù)運(yùn)行特性,如:httpd的匿名寫(xiě)操作繁仁,ftpd的匿名寫(xiě)涉馅,samba的用戶(hù)家目錄,這些默認(rèn)都是off黄虱,不允許的稚矿。但在實(shí)際中有可能我們又要用到這些功能,那可以在boolean中進(jìn)行on,放行晤揣。
現(xiàn)在我們對(duì)Centos 7 上的targeted策略有了一定的了解桥爽,在使用中用到最多的:
- type的修改
- boolean的修改
至于:什么 "多級(jí)安全(MLS) " ,"限制用戶(hù)"等等的諸多功能昧识,我們就不討論了钠四,自行查看官方文檔
SELinux User's and Administrator's Guide
下面來(lái)說(shuō)一說(shuō)selinux的相關(guān)配置和命令:
-
1. SELinux 的開(kāi)啟,關(guān)閉
- 關(guān)閉
在/etc/selinux/config文件中修改SELINUX=disabled
即可 - 開(kāi)啟
selinux的開(kāi)啟有兩種模式:enforcing
和permissive
- enfocing
這是強(qiáng)制模式跪楞,所有接受selinux控制的進(jìn)程對(duì)object的訪問(wèn)都要在rule中有明確的定義缀去,沒(méi)有就不能訪問(wèn),并記錄日志 - permissive
這是寬容模式甸祭,所有接受selinux控制的進(jìn)程對(duì)object的訪問(wèn)都要在rule中有明確的定義缕碎,沒(méi)有也可以訪問(wèn),但會(huì)記錄到日志中(常用于排錯(cuò)中)
- enfocing
- 關(guān)閉
-
2. SELinux 的日志
SELinux決定(例如允許或禁止訪問(wèn))被緩存淋叶。此緩存稱(chēng)為訪問(wèn)向量緩存(AVC)阎曹。 SELinux拒絕訪問(wèn)時(shí)伪阶,將記錄拒絕消息煞檩。這些拒絕也稱(chēng)為“ AVC拒絕”,并根據(jù)運(yùn)行的守護(hù)程序記錄到其他位置:
服務(wù) | Log 位置 |
---|---|
auditd on | /var/log/audit/audit.log |
auditd off; rsyslogd on | /var/log/messages |
setroubleshootd, rsyslogd, and auditd on | /var/log/audit/audit.log 易于閱讀的拒絕消息也發(fā)送至 /var/log/messages |
-
3.SELinux 的命令
getenfoce
??查看當(dāng)前的工作模式
setenfoce [0|1]
??改變當(dāng)前的工作模式
??0: permissive
??1: enfocing
?
setenfoce可是在系統(tǒng)運(yùn)行時(shí)臨時(shí)切換開(kāi)啟狀態(tài)的selinux的運(yùn)行模式栅贴,但不能將selinux從disable(關(guān)閉)斟湃,切換到0或1中來(lái),selinux從關(guān)閉到開(kāi)啟需要重啟系統(tǒng)檐薯,而selinux在系統(tǒng)重啟過(guò)程中將根據(jù)policy對(duì)所有文件(object)進(jìn)行打標(biāo)
[root@localhost html]# getenforce
Enforcing
getsebool
??查看boolean設(shè)定
??-a 查看全部
??boolean 查看指定boolean的值
setsebool [ -P] boolean value
??設(shè)置boolean值[0|1] [off|on]
??如果指定了-P選項(xiàng)凝赛,則值都將寫(xiě)入磁盤(pán)上的策略文件。重新啟動(dòng)后保持不變坛缕。
[root@localhost html]# getsebool -a |grep tftp
tftp_anon_write --> off
tftp_home_dir --> off
chcon - 改變object上下文
?? -u, --user=USER 在目標(biāo)安全上下文中設(shè)置用戶(hù)USER
?? -r, --role=ROLE 在目標(biāo)安全上下文中設(shè)置角色ROLE
?? -t, --type=TYPE 在目標(biāo)安全上下文中設(shè)置類(lèi)型TYPE
?? -R, --recursive 遞歸操作文件和目錄
[root@localhost html]# chcon -t admin_home_t index.html
[root@localhost html]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 index.html
restorecon pathname - 還原pathname本來(lái)的context
?? -v 顯示過(guò)程
sestatus [-v | -b]
??顯示selinux的相當(dāng)信息
??-v: 顯示更多的信息
??-b: 顯示boolean值信息
[root@localhost html]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
seinfo
??可以顯示更多墓猎、更詳細(xì)的信息,如:user, role, type
?? -t 顯示類(lèi)型
?? -r 顯示角色
?? -u 顯示用戶(hù)
?? -b 顯示布爾值
[root@localhost html]# seinfo
Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.31 (binary, mls)
Classes: 129 Permissions: 267
Sensitivities: 1 Categories: 1024
Types: 4774 Attributes: 258
Users: 8 Roles: 14
Booleans: 315 Cond. Expr.: 361
Allow: 106707 Neverallow: 0
Auditallow: 155 Dontaudit: 10045
Type_trans: 18058 Type_change: 74
Type_member: 35 Role allow: 39
Role_trans: 416 Range_trans: 5899
Constraints: 143 Validatetrans: 0
Initial SIDs: 27 Fs_use: 32
Genfscon: 102 Portcon: 613
Netifcon: 0 Nodecon: 0
Permissives: 0 Polcap: 5
sesearch
??SELinux策略查詢(xún)工具
sesearch [OPTIONS] RULE_TYPE [RULE_TYPE ...] [EXPRESSION] [POLICY ...]
??OPTIONS
??-A, --allow
????搜索允許規(guī)則赚楚。
??EXPRESSIONS
??-s NAME, --source=NAME
????查找以類(lèi)型/屬性名稱(chēng)為源的規(guī)則毙沾。(subject domain)
??-t NAME, --target=NAME
????查找以類(lèi)型/屬性NAME為目標(biāo)的規(guī)則。(object type)
[root@localhost ~]# sesearch -A -t httpd_exec_t |grep httpd_t
allow httpd_t httpd_exec_t : file { ioctl read getattr lock map execute execute_no_trans entrypoint open } ;
semanage
[root@localhost html]# semanage -h
usage: semanage [-h]
{import,export,login,user,port,ibpkey,ibendport,interface,module,node,fcontext,boolean,permissive,dontaudit}
...
semanage is used to configure certain elements of SELinux policy with-out
requiring modification to or recompilation from policy source.
positional arguments:
{import,export,login,user,port,ibpkey,ibendport,interface,module,node,fcontext,boolean,permissive,dontaudit}
import 導(dǎo)入本地自定義
export 輸出本地自定義
login 管理linux用戶(hù)和SELinux受限用戶(hù)之間的登錄映射
user 管理SELinux受限用戶(hù)(SELinux用戶(hù)的角色和級(jí)別)
port 管理網(wǎng)絡(luò)端口類(lèi)型定義
ibpkey Manage infiniband ibpkey type definitions
ibendport Manage infiniband end port type definitions
interface 管理網(wǎng)絡(luò)接口類(lèi)型定義
module 管理SELinux策略模塊
node 管理網(wǎng)絡(luò)節(jié)點(diǎn)類(lèi)型定義
fcontext 管理文件上下文映射定義
boolean 管理布爾值以有選擇地啟用功能
permissive 管理流程類(lèi)型強(qiáng)制模式
dontaudit 禁用/啟用策略中的dontaudit規(guī)則
[root@localhost html]# semanage user -h "使用-h 獲取幫助"
查看時(shí)常用 "-l"來(lái)顯示相關(guān)信息宠页,如:
[root@localhost html]# semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
guest_u user s0 s0 guest_r
root user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
staff_u user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
sysadm_u user s0 s0-s0:c0.c1023 sysadm_r
system_u user s0 s0-s0:c0.c1023 system_r unconfined_r
unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
完
以下參考
=========================
May <subject> do <action> to <object>
May a web server access files in users' home directories?
<Web服務(wù)器>可以<訪問(wèn)><用戶(hù)主目錄中的文件>嗎左胞?
圖1.1 SELinux允許以httpd_t運(yùn)行的Apache進(jìn)程訪問(wèn)/var/www/html/目錄,并且它拒絕同一進(jìn)程訪問(wèn)/data/mysql/目錄举户,因?yàn)閷?duì)于httpd_t和mysqld_db_t類(lèi)型上下文沒(méi)有允許規(guī)則烤宙。另一方面,以mysqld_t身份運(yùn)行的MariaDB進(jìn)程能夠訪問(wèn)/data/mysql/目錄俭嘁,而SELinux也正確拒絕mysqld_t類(lèi)型的進(jìn)程來(lái)訪問(wèn)標(biāo)記為httpd_sys_content_t的/var/www/html/目錄躺枕。
Linux Discretionary Access Control(DAC)
DAC主要的內(nèi)容包括以下幾個(gè)概念:主體、客體、權(quán)限(rwx)拐云、所有權(quán)(ugo)蔓姚。
?
在這個(gè)模型中,主體是用戶(hù)的身份慨丐,客體是資源或者說(shuō)是文件(切記:一切皆文件)坡脐。由客體的屬主對(duì)自己的客體進(jìn)行管理,由主體自己決定是否將自己的客體訪問(wèn)權(quán)限或部分訪問(wèn)權(quán)限授予其他主體房揭,這種控制方式是自主的备闲。也就是說(shuō),在自主訪問(wèn)控制下捅暴,用戶(hù)可以按自己的意愿恬砂,有選擇地與其他用戶(hù)共享他的文件。
?
我們所定義的DAC系統(tǒng)有兩個(gè)至關(guān)重要的標(biāo)準(zhǔn):
?
- 文件的所有權(quán):系統(tǒng)中的每個(gè)文件(一些特殊文件可能沒(méi)有蓬痒,如塊設(shè)備文件等)都有所有者泻骤。在DAC系統(tǒng)中,文件的所有者是創(chuàng)建這個(gè)文件的計(jì)算機(jī)的使用者(或事件梧奢,或另一個(gè)文件)狱掂。那么此文件的自主訪問(wèn)控制權(quán)限由它的創(chuàng)建者來(lái)決定如何設(shè)置和分配;
?- 訪問(wèn)權(quán)限:文件的所有者擁有訪問(wèn)權(quán)限亲轨,并且可以將訪問(wèn)權(quán)限分配給自己及其他用戶(hù)趋惨。
上述兩個(gè)標(biāo)準(zhǔn)說(shuō)明:
?
- 文件的所有權(quán)的優(yōu)先級(jí)高于訪問(wèn)權(quán)限
?
1)文件的所有者即便沒(méi)有任何權(quán)限,也可以在為自己分配權(quán)限之后獲得訪問(wèn)文件的能力惦蚊。
?
2)非文件的所有者即便已經(jīng)獲得了訪問(wèn)權(quán)限器虾,也可能會(huì)被所有者隨時(shí)收回,從而導(dǎo)致無(wú)權(quán)訪問(wèn)該文件蹦锋。
?- 權(quán)限是文件訪問(wèn)的關(guān)鍵
?
1)無(wú)論是不是文件的所有者兆沙,關(guān)系到使用者能否訪問(wèn)文件的最直接的因素是其所對(duì)應(yīng)的用戶(hù)是否獲得了可訪問(wèn)該文件的權(quán)限
?
2)使用者被分配的何種權(quán)限,就只能以該權(quán)限所規(guī)定的操作來(lái)訪問(wèn)文件莉掂,無(wú)法越權(quán)葛圃。
======================
配置文件 /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
SELinux關(guān)閉
修改配置文件 SELINUX=disabled
,并重啟主機(jī)
SELinux啟用后巫湘,可以有兩種運(yùn)行模式:強(qiáng)制(enforcing)或許可(permissive)装悲。
~]$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 30
Enforcing Mode
當(dāng)SELinux在強(qiáng)制模式下運(yùn)行時(shí),它將強(qiáng)制執(zhí)行SELinux策略尚氛,并根據(jù)SELinux策略規(guī)則拒絕訪問(wèn)诀诊。在Red Hat Enterprise Linux中,當(dāng)系統(tǒng)最初與SELinux一起安裝時(shí)阅嘶,默認(rèn)情況下啟用強(qiáng)制模式属瓣。Permissive Mode
當(dāng)SELinux在許可模式下運(yùn)行時(shí)载迄,不會(huì)強(qiáng)制執(zhí)行SELinux策略。系統(tǒng)保持運(yùn)行狀態(tài)抡蛙,SELinux不會(huì)拒絕任何操作护昧,而只會(huì)記錄AVC消息,然后將其用于故障排除粗截,調(diào)試和SELinux策略改進(jìn)惋耙。在這種情況下,每個(gè)AVC僅記錄一次熊昌。
改變selinux的Mode
~]# getenforce
Enforcing
~]# setenforce 0
~]# getenforce
Permissive
~]# setenforce 1
~]# getenforce
Enforcing
在啟動(dòng)時(shí)绽榛,您可以設(shè)置幾個(gè)內(nèi)核參數(shù)來(lái)更改SELinux的運(yùn)行方式:
enforcing=0
設(shè)置此參數(shù)會(huì)使計(jì)算機(jī)以許可模式啟動(dòng),這在解決問(wèn)題時(shí)很有用婿屹。如果文件系統(tǒng)太損壞灭美,則使用許可模式可能是檢測(cè)問(wèn)題的唯一選擇。此外昂利,在許可模式下届腐,系統(tǒng)會(huì)繼續(xù)正確創(chuàng)建標(biāo)簽。在此模式下創(chuàng)建的AVC消息可以與在強(qiáng)制模式下不同蜂奸。在寬松模式下犁苏,僅報(bào)告第一個(gè)拒絕。但是窝撵,在強(qiáng)制模式下傀顾,您可能會(huì)拒絕讀取目錄襟铭,并且應(yīng)用程序停止碌奉。在許可模式下,您將收到相同的AVC消息寒砖,但是應(yīng)用程序?qū)⒗^續(xù)讀取目錄中的文件赐劣,此外,您還將獲得每個(gè)拒絕的AVC哩都。
selinux=0
此參數(shù)導(dǎo)致內(nèi)核不加載SELinux基礎(chǔ)結(jié)構(gòu)的任何部分魁兼。初始化腳本會(huì)注意到系統(tǒng)使用selinux=0參數(shù)啟動(dòng)并touch /.autorelabel
文件。這將導(dǎo)致系統(tǒng)在您下次啟用SELinux時(shí)引導(dǎo)時(shí)自動(dòng)重新標(biāo)記漠嵌。
強(qiáng)制系統(tǒng)重新標(biāo)記咐汞,以下命令:
~]# touch /.autorelabel
~]# reboot
在運(yùn)行SELinux的系統(tǒng)上,所有進(jìn)程和文件都以表示安全相關(guān)信息的方式標(biāo)記儒鹿。此信息稱(chēng)為SELinux上下文化撕。對(duì)于文件,可以使用ls -Z命令查看:
~]$ ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
在此示例中约炎,SELinux提供了一個(gè)用戶(hù)(unconfined_u)植阴,一個(gè)角色(object_r)蟹瘾,一個(gè)類(lèi)型(user_home_t)和一個(gè)級(jí)別(s0)。此信息用于制定訪問(wèn)控制決策掠手。在DAC系統(tǒng)上憾朴,訪問(wèn)是根據(jù)Linux用戶(hù)和組ID控制的。在DAC規(guī)則之后檢查SELinux策略規(guī)則喷鸽。如果DAC規(guī)則首先拒絕訪問(wèn)众雷,則不使用SELinux策略規(guī)則。
默認(rèn)情況下做祝,新創(chuàng)建的文件和目錄繼承其父目錄的SELinux類(lèi)型报腔。例如,當(dāng)在/ etc目錄中創(chuàng)建一個(gè)標(biāo)有etc_t類(lèi)型的新文件時(shí)剖淀,新文件將繼承相同的類(lèi)型:
~]$ ls -dZ - /etc
drwxr-xr-x. root root system_u:object_r:etc_t:s0 /etc
~]# touch /etc/file1
~]# ls -lZ /etc/file1
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0 /etc/file1
- chcon
Chcon命令更改文件的SELinux上下文纯蛾。但是,使用chcon命令進(jìn)行的更改,在重新標(biāo)記或執(zhí)行restorecon命令后將被重置纵隔,不能持續(xù)存在翻诉。
~]$ touch file1
~]$ ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
將類(lèi)型更改為samba_share_t。 -t選項(xiàng)僅更改類(lèi)型捌刮。然后查看更改:
~]$ chcon -t samba_share_t file1
~]$ ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:samba_share_t:s0 file1
恢復(fù)file1文件的SELinux上下文碰煌。使用-v選項(xiàng)查看更改:
~]$ restorecon -v file1
restorecon reset file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:user_home_t:s0
restorecon
命令讀取/etc/selinux/targeted/contexts/files/
目錄中的文件,以查看文件應(yīng)具有的SELinux上下文绅作。
更改目錄及其內(nèi)容類(lèi)型
~]# mkdir /web
~]# touch /web/file{1,2,3}
~]# ls -dZ /web
drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web
~]# ls -lZ /web
-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file3
~]# chcon -R -t httpd_sys_content_t /web/
~]# ls -dZ /web/
drwxr-xr-x root root unconfined_u:object_r:httpd_sys_content_t:s0 /web/
~]# ls -lZ /web/
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
- semanage fcontext
通過(guò)semanage fcontext進(jìn)行的更改由以下實(shí)用程序使用芦圾。當(dāng)重新標(biāo)記文件系統(tǒng)并且restorecon實(shí)用工具恢復(fù)默認(rèn)的SELinux上下文時(shí),將使用setfiles實(shí)用工具俄认。這意味著即使重新標(biāo)記了文件系統(tǒng)个少,semanage fcontext所做的更改也將保持不變。
要顯示新創(chuàng)建的文件和目錄的上下文眯杏,請(qǐng)以超級(jí)用戶(hù)身份輸入以下命令
~]# semanage fcontext -C -l
快速參考
要在文件系統(tǒng)中保留SELinux上下文更改夜焦,請(qǐng)重新標(biāo)記:
- 輸入以下命令,記住要使用文件或目錄的完整路徑:
~]# semanage fcontext -a options file-name|directory-name
- 使用restorecon實(shí)用工具應(yīng)用上下文更改:
~]# restorecon -v file-name|directory-name
修改文件
~]# touch /etc/file1
~]$ ls -Z /etc/file1
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
~]# semanage fcontext -a -t samba_share_t /etc/file1
~]# ls -Z /etc/file1
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
~]$ semanage fcontext -C -l
/etc/file1 unconfined_u:object_r:samba_share_t:s0
~]# restorecon -v /etc/file1
restorecon reset /etc/file1 context unconfined_u:object_r:etc_t:s0->system_u:object_r:samba_share_t:s0
更改目錄及其內(nèi)容類(lèi)型
~]# mkdir /web
~]# touch /web/file{1,2,3}
~]# ls -dZ /web
drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web
~]# ls -lZ /web
-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file3