SELinux是一個(gè)內核級別的安全機制,從Linux2.6內核之后就將SELinux集成在了內核當中,因為SELinux是內核級別的,所以我們對于其配置文件的修改都是需要重新啟動(dòng)操作系統才能生效的。
現在主流發(fā)現的Linux版本里面都集成了SELinux機制,CentOS/RHEL都會(huì )默認開(kāi)啟SELinux機制。
系統資源都是通過(guò)進(jìn)程來(lái)讀取更改的,為了保證系統資源的安全,傳統的Linux使用用戶(hù)、文件權限的概念來(lái)限制資源的訪(fǎng)問(wèn),通過(guò)對比進(jìn)程的發(fā)起用戶(hù)和文件權限以此來(lái)保證系統資源的安全,這是一種自由訪(fǎng)問(wèn)控制方式(DAC);但是隨著(zhù)系統資源安全性要求提高,出現了在Linux下的一種安全強化機制(SELinux),該機制為進(jìn)程和文件加入了除權限之外更多的限制來(lái)增強訪(fǎng)問(wèn)條件,這種方式為強制訪(fǎng)問(wèn)控制(MAC)。這兩種方式最直觀(guān)的對比就是,采用傳統DAC,root可以訪(fǎng)問(wèn)任何文件,而在MAC下,就算是root,也只能訪(fǎng)問(wèn)設定允許的文件。
工作原理如下圖:
我們知道,操作系統的安全機制其實(shí)就是對兩樣東西做出限制:進(jìn)程和系統資源(文件、網(wǎng)絡(luò )套接字、系統調用等)。
在之前學(xué)過(guò)的知識當中,Linux操作系統是通過(guò)用戶(hù)和組的概念來(lái)對我們的系統資源進(jìn)行限制,我們知道每個(gè)進(jìn)程都需要一個(gè)用戶(hù)才能執行。
在SELinux當中針對這兩樣東西定義了兩個(gè)基本概念:域(domin)和上下文(context)。
SELinux下存在不同的規則,SELinux根據不同的工作類(lèi)型對這些規則打開(kāi)或關(guān)閉(on|off<布爾值1|0>),然后通過(guò)規則的開(kāi)啟與關(guān)閉具體地限制不同進(jìn)程對文件的讀取。
getsebool -a 或者 sestatus -b # 查看當前工作類(lèi)型下各個(gè)規則的開(kāi)啟與否
setsebool -P 規則名稱(chēng) [0|1] # 修改當前工作類(lèi)型下指定規則的開(kāi)啟關(guān)閉,-P表示同時(shí)修改文件使永久生效
域就是用來(lái)對進(jìn)行進(jìn)行限制,而上下文就是對系統資源進(jìn)行限制。
安全上下文存在于進(jìn)程與文件中,context隨進(jìn)程一起存入內存中,文件的context存放在其對應的inode中,因此進(jìn)程在訪(fǎng)問(wèn)文件時(shí),要先讀取inode,再判斷是否能夠訪(fǎng)問(wèn)該文件。
ls -Z # 顯示文件的安全上下文
ps -eZ # 顯示所有進(jìn)程的安全上下文
我們可以通過(guò) ps -Z 這命令來(lái)查看當前進(jìn)程的域的信息,也就是進(jìn)程的SELinux信息:
[root@xiaoluo ~]# ps -Z
LABEL PID TTY TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2503 pts/0 00:00:00 su
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2511 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3503 pts/0 00:00:00 ps
通過(guò) ls -Z 命令我們可以查看文件上下文信息,也就是文件的SELinux信息:
[root@xiaoluo ~]# ls -Z
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop
-rw-r--r--+ root root system_u:object_r:admin_home_t:s0 install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog
在稍后我們來(lái)探討一下這些字段所代表的含義。
在SELinux中,我們是通過(guò)定義策略來(lái)控制哪些域可以訪(fǎng)問(wèn)哪些上下文。
在SELinux中,預置了多種的策略模式,我們通常都不需要自己去定義策略,除非是我們自己需要對一些服務(wù)或者程序進(jìn)行保護
在CentOS/RHEL中,其默認使用的是目標(target)策略,那么何為目標策略呢?
目標策略定義了只有目標進(jìn)程受到SELinux限制,非目標進(jìn)程就不會(huì )受到SELinux限制,通常我們的網(wǎng)絡(luò )應用程序都是目標進(jìn)程,比如httpd、mysqld,dhcpd等等這些網(wǎng)絡(luò )應用程序。
我們的CentOS的SELinux配置文件是存放在 /etc/sysconfig/ 目錄下的 selinux文件,我們可以查看一下里面的內容:
[root@xiaoluo ~]# cat /etc/sysconfig/selinux
# 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 // 我們的CentOS使用的策略就是目標策略
SELinux的工作模式一共有三種 enforcing、permissive和disabled
①enforcing強制模式:只要是違反策略的行動(dòng)都會(huì )被禁止,并作為內核信息記錄
②permissive允許模式:違反策略的行動(dòng)不會(huì )被禁止,但是會(huì )提示警告信息
③disabled禁用模式:禁用SELinux,與不帶SELinux系統是一樣的,通常情況下我們在不怎么了解SELinux時(shí),將模式設置成disabled,這樣在訪(fǎng)問(wèn)一些網(wǎng)絡(luò )應用時(shí)就不會(huì )出問(wèn)題了。
上面也說(shuō)了SELinux的主配置文件是 /etc/sysconfig/selinux
[root@xiaoluo ~]# cat /etc/sysconfig/selinux
# 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 // 我們看到SELinux默認的工作模式是enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
使用命令修改工作模式只在當前有效,想要開(kāi)機生效,而且如果想要在disabled和其他兩種模式之間切換,只有修改配置文件參數然后重啟,該配置文件是/etc/selinux/config,另外也可以通過(guò)/etc/sysconfig/selinux文件修改,其實(shí)該文件是/etc/selinux/config的軟鏈接文件
我們SELinux默認的工作模式是enforcing,我們可以將其修改為 permissive或者是disabled
我們如果要查看當前SELinux的工作狀態(tài),可以使用 getenforce 命令來(lái)查看:
[root@xiaoluo ~]# getenforce
Enforcing
當前的工作模式是 enforcing,我們如果要設置當前的SELinux工作狀態(tài),可以使用 setenforce [0|1] 命令來(lái)修改,setenforce 0表示設置成 permissive,1表示enforcing
【注意:】通過(guò) setenforce 來(lái)設置SELinux只是臨時(shí)修改,當系統重啟后就會(huì )失效了,所以如果要永久修改,就通過(guò)修改SELinux主配置文件
[root@xiaoluo ~]# setenforce 0
[root@xiaoluo ~]# getenforce
Permissive
[root@xiaoluo ~]# setenforce 1
[root@xiaoluo ~]# getenforce
Enforcing
我們可以通過(guò) ls -Z 這個(gè)命令來(lái)查看我們文件的上下文信息,也就是SELinux信息,
[root@xiaoluo ~]# ls -Z
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop
-rw-r--r--+ root root system_u:object_r:admin_home_t:s0 install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog
我們發(fā)現其比傳統的 ls 命令多出來(lái)了system_u:object_r:admin_home_t:s0 這個(gè)東西,我們現在就來(lái)分析一下這段語(yǔ)句所代表的含義
system_u:object_r:admin_home_t:s0
這條語(yǔ)句通過(guò):劃分成了四段,第一段 system_u 代表的是用戶(hù),第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home 表示的是類(lèi)型,最后一段 s0 是跟MLS、MCS相關(guān)的東西,暫時(shí)不需要管
①system_u:指的是SElinux用戶(hù),root表示root賬戶(hù)身份,user_u表示普通用戶(hù)無(wú)特權用戶(hù),system_u表示系統進(jìn)程,通過(guò)用戶(hù)可以確認身份類(lèi)型,一般搭配角色使用。身份和不同的角色搭配時(shí)有權限不同,雖然可以使用su命令切換用戶(hù)但對于SElinux的用戶(hù)并沒(méi)有發(fā)生改變,賬戶(hù)之間切換時(shí)此用戶(hù)身份不變,在targeted策略環(huán)境下用戶(hù)標識沒(méi)有實(shí)質(zhì)性作用。
②object_r:object_r一般為文件目錄的角色、system_r一般為進(jìn)程的角色,在targeted策略環(huán)境中用戶(hù)的角色一般為system_r。用戶(hù)的角色類(lèi)似用戶(hù)組的概念,不同的角色具有不同的身份權限,一個(gè)用戶(hù)可以具備多個(gè)角色,但是同一時(shí)間只能使用一個(gè)角色。在targeted策略環(huán)境下角色沒(méi)有實(shí)質(zhì)作用,在targeted策略環(huán)境中所有的進(jìn)程文件的角色都是system_r角色。
③admin_home:文件和進(jìn)程都有一個(gè)類(lèi)型,SElinux依據類(lèi)型的相關(guān)組合來(lái)限制存取權限。
下面我們通過(guò)一個(gè)實(shí)例來(lái)看一下上下文 context 的值和SELinux的訪(fǎng)問(wèn)控制
比如說(shuō)我搭建好了一個(gè)Web服務(wù)器,我們知道www服務(wù)器其默認網(wǎng)頁(yè)存放位置是在 /var/www/html 這個(gè)目錄下,我們如果在這里新建一個(gè) index.html 測試頁(yè)面,啟動(dòng)我們的www服務(wù)器,刷新就能見(jiàn)到其內容了,這時(shí)我們如果是在我們的 /home 目錄下建立一個(gè) index.html 頁(yè)面,然后將其移動(dòng)到 /var/www/html 這個(gè)目錄下,再刷新頁(yè)面,其還會(huì )不會(huì )正常顯示呢?
首先我們啟動(dòng)我們的 httpd 服務(wù):
[root@xiaoluo ~]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for xiaoluo
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
然后打開(kāi)瀏覽器,輸入我們的 127.0.0.1 來(lái)訪(fǎng)問(wèn),此時(shí)看到的界面是Apache的測試界面:
因為我們此時(shí)的 /var/www/html 下還不存在任何頁(yè)面:
[root@xiaoluo home]# ll /var/www/html/
total 0
接下來(lái)我們在 /home 目錄下建立一個(gè) index.html 的頁(yè)面,然后將其移動(dòng)到我們的/var/www/html 目錄下
[root@xiaoluo home]# vi index.html
This is a test about SELinux
[root@xiaoluo home]# mv index.html /var/www/html/
[root@xiaoluo html]# cd /var/www/html/
[root@xiaoluo html]# ls
index.html
此時(shí),按照正常情況,因為html目錄下存在了一個(gè)index.html的頁(yè)面,我們此時(shí)如果刷新瀏覽器頁(yè)面,應該會(huì )跳轉到index.html頁(yè)面的
但是事實(shí)我們發(fā)現,頁(yè)面還是在這個(gè)測試頁(yè)面,到底是為什么呢?這個(gè)就跟我們的SELinux的安全策略有關(guān)系了,我們可以去 /var/log/audit 這個(gè)目錄下查看 audit.log 這個(gè)文件,從中找出錯誤信息
[root@xiaoluo html]# tail /var/log/audit/audit.log
type=CRED_DISP msg=audit(1369575601.957:289): user pid=3637 uid=0 auid=0 ses=44 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:setcred acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
type=USER_END msg=audit(1369575601.957:290): user pid=3637 uid=0 auid=0 ses=44 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_close acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
type=AVC msg=audit(1369575729.534:291): avc: denied { getattr } for pid=3619 comm="httpd" path="/var/www/html/index.html" dev=sda2 ino=538738 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=file
type=SYSCALL msg=audit(1369575729.534:291): arch=c000003e syscall=4 success=no exit=-13 a0=7f34198634f8 a1=7fffbc87bee0 a2=7fffbc87bee0 a3=7f341985ff60 items=0 ppid=3612 pid=3619 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1369575729.535:292): avc: denied { getattr } for pid=3619 comm="httpd" path="/var/www/html/index.html" dev=sda2 ino=538738 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=file
type=SYSCALL msg=audit(1369575729.535:292): arch=c000003e syscall=6 success=no exit=-13 a0=7f34198635c8 a1=7fffbc87bee0 a2=7fffbc87bee0 a3=1 items=0 ppid=3612 pid=3619 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1369575736.549:293): avc: denied { getattr } for pid=3618 comm="httpd" path="/var/www/html/index.html" dev=sda2 ino=538738 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=file
type=SYSCALL msg=audit(1369575736.549:293): arch=c000003e syscall=4 success=no exit=-13 a0=7f34198634f8 a1=7fffbc87bee0 a2=7fffbc87bee0 a3=7f341985ff60 items=0 ppid=3612 pid=3618 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1369575736.549:294): avc: denied { getattr } for pid=3618 comm="httpd" path="/var/www/html/index.html" dev=sda2 ino=538738 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=file
type=SYSCALL msg=audit(1369575736.549:294): arch=c000003e syscall=6 success=no exit=-13 a0=7f34198635c8 a1=7fffbc87bee0 a2=7fffbc87bee0 a3=1 items=0 ppid=3612 pid=3618 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
從這個(gè)日志文件中,我們就可以看到刷新頁(yè)面不出來(lái)index.html的原因就是因為我們的SELinux安全策略所導致的
我們通過(guò) ls -Z 命令先來(lái)看看剛移動(dòng)過(guò)來(lái)的 index.html 的上下文信息
[root@xiaoluo html]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:home_root_t:s0 index.html
我們發(fā)現其第三個(gè)字段的類(lèi)型是 home_root_t,這是為什么呢?因為我們剛才是在 /home 目錄下創(chuàng )建的這index.html文件,所以其默認會(huì )繼承上一層目錄的SELinux的類(lèi)型信息,我們可以查看一下 /home 這個(gè)目錄的上下文信息:
[root@xiaoluo html]# ls -Z -d /home/
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 /home/
我們看到,其第三個(gè)字段和我們剛才的index.html相同,由此可以看出文件的context值是受上一級目錄影響的,一般情況下它們會(huì )繼承上一級目錄的context值,但是,一些安裝服務(wù)產(chǎn)生的文件context值會(huì )例外,不繼承上級目錄的context值,服務(wù)會(huì )自動(dòng)創(chuàng )建它們的context值,比如沒(méi)有裝http服務(wù)的時(shí)候/var/目錄下時(shí)沒(méi)有www目錄的,安裝httpd服務(wù)后該服務(wù)會(huì )自動(dòng)創(chuàng )建出所需的目錄,并定義與服務(wù)相關(guān)的目錄及文件才context值,它們并不會(huì )繼承上級目錄的context值。
[root@xiaoluo html]# ls -Z -d /var
drwxr-xr-x. root root system_u:object_r:var_t:s0 /var
[root@xiaoluo html]# ls -Z -d /var/www/html/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
此時(shí)我們發(fā)現我們的 /var/www/html 這個(gè)目錄的上下文類(lèi)型是httpd_sys_content_t, 而我們剛才移動(dòng)過(guò)來(lái)的 index.html 的類(lèi)型卻是 home_root_t,因為我們此時(shí)的SELinux的工作模式是 enforcing,所以對于違反策略的行動(dòng)是被禁止的,所以我們刷新頁(yè)面并不會(huì )出現我們的index.html里面的信息,那么我們這個(gè)時(shí)候應該解決這個(gè)問(wèn)題呢?
通常解決辦法由兩種:
①直接將SELinux的工作模式設置成 disabled,這樣就不會(huì )出現策略攔截問(wèn)題了,但是這樣的話(huà)我們的系統就沒(méi)有SELinux安全防護了
②通過(guò) restorecon 或者 chcon 命令來(lái)修復我們的文件上下文信息
命令 restorecon 可以用來(lái)恢復文件默認的上下文:
restorecon -R -v /var/www/html/index.html //-R 表示遞歸,如果是目錄,則該目錄下的所有子目錄、文件都會(huì )得到修復
命令 chcon 可以改變文件的上下文信息,通常我們使用一個(gè)參照文件來(lái)進(jìn)行修改:
chcon --reference=/var/www/html/index.html /var/www/html/test.html
這里我們通過(guò)使用 restorecon 命令來(lái)恢復我們文件默認的上下文:
[root@xiaoluo html]# restorecon -v index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[root@xiaoluo html]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
我們看到,使用 restorecon 命令以后,index.html的上下文信息就繼承了上一級目錄 html 這個(gè)目錄的上下文信息了,這個(gè)時(shí)候我們再刷新頁(yè)面就可以看到我們index.html里面的內容了
通過(guò)這個(gè)實(shí)例我們就明白了文件的上下文信息與SELinux之間的關(guān)系了,并知道了通過(guò)查看 /var/log/audit/audit.log 這個(gè)日志文件的信息找出錯誤所在,以及通過(guò) restorecon 命令來(lái)修復我們的文件的上下文信息
SELinux阻止的進(jìn)程的日志記錄存放在/var/log/audit/audit.log文件中,但是該文件中的內容用戶(hù)閱讀體驗很差,可以去cat /var/log/audit/audit.log看看,因此系統為我們提供了sealert工具,幫助我們整理該日志文件,sealert工具處理日志文件的時(shí)候需要花費一點(diǎn)時(shí)間,請耐心等待。
另外SELinux的日志功能需要auditd.service服務(wù)的開(kāi)啟。
結合案例(apache SELinux配置)來(lái)了解sealert工具:
1.確保本機配置了httpd服務(wù)并處于開(kāi)啟狀態(tài)
2./usr/sbin/httpd命令會(huì )開(kāi)啟進(jìn)程去讀取/var/www/html/目錄下以.html結尾的文件,現在在家目錄下創(chuàng )建文件~/index.html,隨意編寫(xiě)內容,之后把新創(chuàng )建的文件移動(dòng)至/var/www/html/下。
3.我們通過(guò)瀏覽器,在地址欄輸入本機IP,查看成功與否,當出現如下界面的時(shí)候表示訪(fǎng)問(wèn)失敗。
4.我們在配置服務(wù)的時(shí)候確定了沒(méi)有問(wèn)題,這時(shí)候我們要想到可能是SELinux阻止了我們訪(fǎng)問(wèn)。我們通過(guò)命令
sealert -a/var/log/audit/audit.log
查看SELinux日志,我們找到httpd的關(guān)鍵字,閱讀內容,下圖中的內容是我們主要關(guān)注的部分,其他則是/var/log/audit/audit.log的內容,我們可以忽略。最后我們優(yōu)先考慮改動(dòng)最小的解決方案,即修改SELinux標簽。
5.執行命令
restorecon -v /var/www/html/index.html
就是修改該文件為httpd能夠訪(fǎng)問(wèn)的默認標簽
6.再用瀏覽器訪(fǎng)問(wèn)查看結果,這次成功。
以上就是如何理解Linux下的SELinux的詳細內容,更多關(guān)于Linux SELinux的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站