主頁 > 知識(shí)庫 > 如何理解Linux下的SELinux

如何理解Linux下的SELinux

熱門標(biāo)簽:阿里云 檢查注冊表項(xiàng) 硅谷的囚徒呼叫中心 網(wǎng)站建設(shè) 美圖手機(jī) 智能手機(jī) 百度競價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 使用U盤裝系統(tǒng)

一、SELinux簡介

SELinux是一個(gè)內(nèi)核級(jí)別的安全機(jī)制,從Linux2.6內(nèi)核之后就將SELinux集成在了內(nèi)核當(dāng)中,因?yàn)镾ELinux是內(nèi)核級(jí)別的,所以我們對于其配置文件的修改都是需要重新啟動(dòng)操作系統(tǒng)才能生效的。

現(xiàn)在主流發(fā)現(xiàn)的Linux版本里面都集成了SELinux機(jī)制,CentOS/RHEL都會(huì)默認(rèn)開啟SELinux機(jī)制。

系統(tǒng)資源都是通過進(jìn)程來讀取更改的,為了保證系統(tǒng)資源的安全,傳統(tǒng)的Linux使用用戶、文件權(quán)限的概念來限制資源的訪問,通過對比進(jìn)程的發(fā)起用戶和文件權(quán)限以此來保證系統(tǒng)資源的安全,這是一種自由訪問控制方式(DAC);但是隨著系統(tǒng)資源安全性要求提高,出現(xiàn)了在Linux下的一種安全強(qiáng)化機(jī)制(SELinux),該機(jī)制為進(jìn)程和文件加入了除權(quán)限之外更多的限制來增強(qiáng)訪問條件,這種方式為強(qiáng)制訪問控制(MAC)。這兩種方式最直觀的對比就是,采用傳統(tǒng)DAC,root可以訪問任何文件,而在MAC下,就算是root,也只能訪問設(shè)定允許的文件。

工作原理如下圖:

二、SELinux基本概念

我們知道,操作系統(tǒng)的安全機(jī)制其實(shí)就是對兩樣?xùn)|西做出限制:進(jìn)程和系統(tǒng)資源(文件、網(wǎng)絡(luò)套接字、系統(tǒng)調(diào)用等)。

在之前學(xué)過的知識(shí)當(dāng)中,Linux操作系統(tǒng)是通過用戶和組的概念來對我們的系統(tǒng)資源進(jìn)行限制,我們知道每個(gè)進(jìn)程都需要一個(gè)用戶才能執(zhí)行。

在SELinux當(dāng)中針對這兩樣?xùn)|西定義了兩個(gè)基本概念:域(domin)和上下文(context)。

2.1、工作類型

SELinux下存在不同的規(guī)則,SELinux根據(jù)不同的工作類型對這些規(guī)則打開或關(guān)閉(on|off<布爾值1|0>),然后通過規(guī)則的開啟與關(guān)閉具體地限制不同進(jìn)程對文件的讀取。

getsebool -a 或者 sestatus -b # 查看當(dāng)前工作類型下各個(gè)規(guī)則的開啟與否

setsebool -P 規(guī)則名稱 [0|1] # 修改當(dāng)前工作類型下指定規(guī)則的開啟關(guān)閉,-P表示同時(shí)修改文件使永久生效

域就是用來對進(jìn)行進(jìn)行限制,而上下文就是對系統(tǒng)資源進(jìn)行限制。

2.2、security context介紹

安全上下文存在于進(jìn)程與文件中,context隨進(jìn)程一起存入內(nèi)存中,文件的context存放在其對應(yīng)的inode中,因此進(jìn)程在訪問文件時(shí),要先讀取inode,再判斷是否能夠訪問該文件。

ls -Z    # 顯示文件的安全上下文

ps -eZ   # 顯示所有進(jìn)程的安全上下文

我們可以通過 ps -Z 這命令來查看當(dāng)前進(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

通過 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

在稍后我們來探討一下這些字段所代表的含義。

三、策略

在SELinux中,我們是通過定義策略來控制哪些域可以訪問哪些上下文。

在SELinux中,預(yù)置了多種的策略模式,我們通常都不需要自己去定義策略,除非是我們自己需要對一些服務(wù)或者程序進(jìn)行保護(hù)

在CentOS/RHEL中,其默認(rèn)使用的是目標(biāo)(target)策略,那么何為目標(biāo)策略呢?

目標(biāo)策略定義了只有目標(biāo)進(jìn)程受到SELinux限制,非目標(biāo)進(jìn)程就不會(huì)受到SELinux限制,通常我們的網(wǎng)絡(luò)應(yīng)用程序都是目標(biāo)進(jìn)程,比如httpd、mysqld,dhcpd等等這些網(wǎng)絡(luò)應(yīng)用程序。

我們的CentOS的SELinux配置文件是存放在 /etc/sysconfig/ 目錄下的 selinux文件,我們可以查看一下里面的內(nèi)容:

[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使用的策略就是目標(biāo)策略

四、SELinux模式

SELinux的工作模式一共有三種 enforcing、permissive和disabled

①enforcing強(qiáng)制模式:只要是違反策略的行動(dòng)都會(huì)被禁止,并作為內(nèi)核信息記錄

②permissive允許模式:違反策略的行動(dòng)不會(huì)被禁止,但是會(huì)提示警告信息

③disabled禁用模式:禁用SELinux,與不帶SELinux系統(tǒng)是一樣的,通常情況下我們在不怎么了解SELinux時(shí),將模式設(shè)置成disabled,這樣在訪問一些網(wǎng)絡(luò)應(yīng)用時(shí)就不會(huì)出問題了。

上面也說了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默認(rèn)的工作模式是enforcing

# SELINUXTYPE= can take one of these two values:

#     targeted - Targeted processes are protected,

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

使用命令修改工作模式只在當(dāng)前有效,想要開機(jī)生效,而且如果想要在disabled和其他兩種模式之間切換,只有修改配置文件參數(shù)然后重啟,該配置文件是/etc/selinux/config,另外也可以通過/etc/sysconfig/selinux文件修改,其實(shí)該文件是/etc/selinux/config的軟鏈接文件

我們SELinux默認(rèn)的工作模式是enforcing,我們可以將其修改為 permissive或者是disabled

我們?nèi)绻榭串?dāng)前SELinux的工作狀態(tài),可以使用 getenforce 命令來查看:

[root@xiaoluo ~]# getenforce 

Enforcing

當(dāng)前的工作模式是 enforcing,我們?nèi)绻O(shè)置當(dāng)前的SELinux工作狀態(tài),可以使用 setenforce [0|1] 命令來修改,setenforce 0表示設(shè)置成 permissive,1表示enforcing

【注意:】通過 setenforce 來設(shè)置SELinux只是臨時(shí)修改,當(dāng)系統(tǒng)重啟后就會(huì)失效了,所以如果要永久修改,就通過修改SELinux主配置文件

[root@xiaoluo ~]# setenforce 0

[root@xiaoluo ~]# getenforce

Permissive

[root@xiaoluo ~]# setenforce 1

[root@xiaoluo ~]# getenforce 

Enforcing

我們可以通過 ls -Z 這個(gè)命令來查看我們文件的上下文信息,也就是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ā)現(xiàn)其比傳統(tǒng)的 ls 命令多出來了system_u:object_r:admin_home_t:s0 這個(gè)東西,我們現(xiàn)在就來分析一下這段語句所代表的含義

system_u:object_r:admin_home_t:s0

這條語句通過:劃分成了四段,第一段 system_u 代表的是用戶,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home 表示的是類型,最后一段 s0 是跟MLS、MCS相關(guān)的東西,暫時(shí)不需要管

①system_u:指的是SElinux用戶,root表示root賬戶身份,user_u表示普通用戶無特權(quán)用戶,system_u表示系統(tǒng)進(jìn)程,通過用戶可以確認(rèn)身份類型,一般搭配角色使用。身份和不同的角色搭配時(shí)有權(quán)限不同,雖然可以使用su命令切換用戶但對于SElinux的用戶并沒有發(fā)生改變,賬戶之間切換時(shí)此用戶身份不變,在targeted策略環(huán)境下用戶標(biāo)識(shí)沒有實(shí)質(zhì)性作用。

②object_r:object_r一般為文件目錄的角色、system_r一般為進(jìn)程的角色,在targeted策略環(huán)境中用戶的角色一般為system_r。用戶的角色類似用戶組的概念,不同的角色具有不同的身份權(quán)限,一個(gè)用戶可以具備多個(gè)角色,但是同一時(shí)間只能使用一個(gè)角色。在targeted策略環(huán)境下角色沒有實(shí)質(zhì)作用,在targeted策略環(huán)境中所有的進(jìn)程文件的角色都是system_r角色。

③admin_home:文件和進(jìn)程都有一個(gè)類型,SElinux依據(jù)類型的相關(guān)組合來限制存取權(quán)限。

五、實(shí)例

下面我們通過一個(gè)實(shí)例來看一下上下文 context 的值和SELinux的訪問控制

比如說我搭建好了一個(gè)Web服務(wù)器,我們知道www服務(wù)器其默認(rèn)網(wǎng)頁存放位置是在 /var/www/html 這個(gè)目錄下,我們?nèi)绻谶@里新建一個(gè) index.html 測試頁面,啟動(dòng)我們的www服務(wù)器,刷新就能見到其內(nèi)容了,這時(shí)我們?nèi)绻窃谖覀兊?/home 目錄下建立一個(gè) index.html 頁面,然后將其移動(dòng)到 /var/www/html 這個(gè)目錄下,再刷新頁面,其還會(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  ]

然后打開瀏覽器,輸入我們的 127.0.0.1 來訪問,此時(shí)看到的界面是Apache的測試界面:

因?yàn)槲覀兇藭r(shí)的 /var/www/html 下還不存在任何頁面:

[root@xiaoluo home]# ll /var/www/html/

total 0

接下來我們在 /home 目錄下建立一個(gè) index.html 的頁面,然后將其移動(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í),按照正常情況,因?yàn)閔tml目錄下存在了一個(gè)index.html的頁面,我們此時(shí)如果刷新瀏覽器頁面,應(yīng)該會(huì)跳轉(zhuǎn)到index.html頁面的

但是事實(shí)我們發(fā)現(xiàn),頁面還是在這個(gè)測試頁面,到底是為什么呢?這個(gè)就跟我們的SELinux的安全策略有關(guān)系了,我們可以去 /var/log/audit 這個(gè)目錄下查看 audit.log 這個(gè)文件,從中找出錯(cuò)誤信息

[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è)日志文件中,我們就可以看到刷新頁面不出來index.html的原因就是因?yàn)槲覀兊腟ELinux安全策略所導(dǎo)致的

我們通過 ls -Z 命令先來看看剛移動(dòng)過來的 index.html 的上下文信息

[root@xiaoluo html]# ls -Z

-rw-r--r--. root root unconfined_u:object_r:home_root_t:s0 index.html

我們發(fā)現(xiàn)其第三個(gè)字段的類型是 home_root_t,這是為什么呢?因?yàn)槲覀儎偛攀窃?/home 目錄下創(chuàng)建的這index.html文件,所以其默認(rèn)會(huì)繼承上一層目錄的SELinux的類型信息,我們可以查看一下 /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值是受上一級(jí)目錄影響的,一般情況下它們會(huì)繼承上一級(jí)目錄的context值,但是,一些安裝服務(wù)產(chǎn)生的文件context值會(huì)例外,不繼承上級(jí)目錄的context值,服務(wù)會(huì)自動(dòng)創(chuàng)建它們的context值,比如沒有裝http服務(wù)的時(shí)候/var/目錄下時(shí)沒有www目錄的,安裝httpd服務(wù)后該服務(wù)會(huì)自動(dòng)創(chuàng)建出所需的目錄,并定義與服務(wù)相關(guān)的目錄及文件才context值,它們并不會(huì)繼承上級(jí)目錄的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ā)現(xiàn)我們的 /var/www/html 這個(gè)目錄的上下文類型是httpd_sys_content_t, 而我們剛才移動(dòng)過來的 index.html 的類型卻是 home_root_t,因?yàn)槲覀兇藭r(shí)的SELinux的工作模式是 enforcing,所以對于違反策略的行動(dòng)是被禁止的,所以我們刷新頁面并不會(huì)出現(xiàn)我們的index.html里面的信息,那么我們這個(gè)時(shí)候應(yīng)該解決這個(gè)問題呢?

通常解決辦法由兩種:

①直接將SELinux的工作模式設(shè)置成 disabled,這樣就不會(huì)出現(xiàn)策略攔截問題了,但是這樣的話我們的系統(tǒng)就沒有SELinux安全防護(hù)了

②通過 restorecon 或者 chcon 命令來修復(fù)我們的文件上下文信息

命令 restorecon 可以用來恢復(fù)文件默認(rèn)的上下文:

restorecon -R -v /var/www/html/index.html  //-R 表示遞歸,如果是目錄,則該目錄下的所有子目錄、文件都會(huì)得到修復(fù) 

命令 chcon 可以改變文件的上下文信息,通常我們使用一個(gè)參照文件來進(jìn)行修改:

chcon --reference=/var/www/html/index.html /var/www/html/test.html

這里我們通過使用 restorecon 命令來恢復(fù)我們文件默認(rèn)的上下文:

[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的上下文信息就繼承了上一級(jí)目錄 html 這個(gè)目錄的上下文信息了,這個(gè)時(shí)候我們再刷新頁面就可以看到我們index.html里面的內(nèi)容了

通過這個(gè)實(shí)例我們就明白了文件的上下文信息與SELinux之間的關(guān)系了,并知道了通過查看 /var/log/audit/audit.log 這個(gè)日志文件的信息找出錯(cuò)誤所在,以及通過 restorecon 命令來修復(fù)我們的文件的上下文信息

六、SELinux日志管理

SELinux阻止的進(jìn)程的日志記錄存放在/var/log/audit/audit.log文件中,但是該文件中的內(nèi)容用戶閱讀體驗(yàn)很差,可以去cat /var/log/audit/audit.log看看,因此系統(tǒng)為我們提供了sealert工具,幫助我們整理該日志文件,sealert工具處理日志文件的時(shí)候需要花費(fèi)一點(diǎn)時(shí)間,請耐心等待。

另外SELinux的日志功能需要auditd.service服務(wù)的開啟。

結(jié)合案例(apache SELinux配置)來了解sealert工具:

1.確保本機(jī)配置了httpd服務(wù)并處于開啟狀態(tài)

2./usr/sbin/httpd命令會(huì)開啟進(jìn)程去讀取/var/www/html/目錄下以.html結(jié)尾的文件,現(xiàn)在在家目錄下創(chuàng)建文件~/index.html,隨意編寫內(nèi)容,之后把新創(chuàng)建的文件移動(dòng)至/var/www/html/下。

3.我們通過瀏覽器,在地址欄輸入本機(jī)IP,查看成功與否,當(dāng)出現(xiàn)如下界面的時(shí)候表示訪問失敗。

4.我們在配置服務(wù)的時(shí)候確定了沒有問題,這時(shí)候我們要想到可能是SELinux阻止了我們訪問。我們通過命令

sealert -a/var/log/audit/audit.log

查看SELinux日志,我們找到httpd的關(guān)鍵字,閱讀內(nèi)容,下圖中的內(nèi)容是我們主要關(guān)注的部分,其他則是/var/log/audit/audit.log的內(nèi)容,我們可以忽略。最后我們優(yōu)先考慮改動(dòng)最小的解決方案,即修改SELinux標(biāo)簽。

5.執(zhí)行命令

restorecon -v /var/www/html/index.html

就是修改該文件為httpd能夠訪問的默認(rèn)標(biāo)簽

6.再用瀏覽器訪問查看結(jié)果,這次成功。

以上就是如何理解Linux下的SELinux的詳細(xì)內(nèi)容,更多關(guān)于Linux SELinux的資料請關(guān)注腳本之家其它相關(guān)文章!

標(biāo)簽:煙臺(tái) 懷化 湖北 黃山 山南 湘潭 賀州 通遼

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《如何理解Linux下的SELinux》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266