Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

前言:

張家口網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),張家口網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為張家口上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的張家口做網(wǎng)站的公司定做!


SELinux是一個(gè)很深?yuàn)W的東西,我問(wèn)過(guò)身邊好多運(yùn)維技術(shù)人員,他們公司服務(wù)器的SElinux在生產(chǎn)環(huán)境中是開啟狀態(tài)還是關(guān)閉狀態(tài),得到一個(gè)統(tǒng)一的答案——直接關(guān)閉,無(wú)一例外。

網(wǎng)上也有一句話——一個(gè)資深的運(yùn)維工程師,他系統(tǒng)的SELinux一定是關(guān)閉的。

所以說(shuō),想了解SELinux的,可以了解一下,為了以防以后自己所在的公司要求必須開啟SELinux,但自己又不懂,那就尷尬了,不了解也無(wú)所謂,因?yàn)橛龅綇?qiáng)制開啟SELinux的公司,也不是那么容易的事情。

上面說(shuō)了那么一大堆,那么什么是SELinux呢?這篇文章就要聊一聊SELinux的一些概念及設(shè)置方法。

正文:


SELinux它是安全強(qiáng)化的linux含義,我們都知道在Linux中,一個(gè)文件能不能被當(dāng)前用戶所讀取到,是由該用戶對(duì)這個(gè)文件所具有的權(quán)限來(lái)決定的,熟知的一般權(quán)限有讀、寫、執(zhí)行,特殊的一點(diǎn)的權(quán)限又有l(wèi)sattr命令查看到的特殊權(quán)限,又或者是SUID、SGID、SBIT等特殊權(quán)限,這些權(quán)限基本都是針對(duì)用戶來(lái)進(jìn)行控制的,而SELinux類似這些權(quán)限,但又不是和這些權(quán)限一個(gè)種類的,前面說(shuō)到的權(quán)限是針對(duì)用戶進(jìn)行權(quán)限控制的,而SELinux是針對(duì)某個(gè)進(jìn)程進(jìn)行控制的,那么,當(dāng)用戶對(duì)一個(gè)文件進(jìn)行讀取操作時(shí),系統(tǒng)是如何執(zhí)行的呢?下面附上鳥哥的私房菜中的一張圖片一起來(lái)看一下:
Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

上圖的重點(diǎn)在于程序如何取得目標(biāo)的資源訪問(wèn)權(quán)限!由上圖可以看出來(lái),程序想要讀取一個(gè)文件,必須要先通過(guò)SELinux政策內(nèi)的規(guī)則,然后再進(jìn)行安全性文本的對(duì)比,若對(duì)比失敗則無(wú)法進(jìn)行下一步驗(yàn)證(驗(yàn)證針對(duì)用戶設(shè)置的權(quán)限),這里的政策、安全性文本都是由SELinux來(lái)提供的,總結(jié)來(lái)說(shuō),用戶要讀取一個(gè)文件,該讀取進(jìn)程必須要通過(guò)SELinux的檢測(cè)(當(dāng)然,SELinux要在開啟狀態(tài)下),然后才有資格針對(duì)用戶去進(jìn)行權(quán)限驗(yàn)證,若SELinux是關(guān)閉狀態(tài),毫無(wú)疑問(wèn)咯,直接驗(yàn)證用戶的權(quán)限即可決定是否可以讀取到該文件。

結(jié)論:用戶讀取一個(gè)文件,必須該進(jìn)程先通過(guò)SELinux驗(yàn)證,然后才是對(duì)用戶的權(quán)限進(jìn)行驗(yàn)證。

關(guān)于上面提到的政策及安全性文本,我也沒(méi)搞的太明白,里面的東西過(guò)于深?yuàn)W(這是我一個(gè)在國(guó)外工作的朋友對(duì)我說(shuō)的,畢業(yè)兩年,年薪30W+,我挺佩服的一個(gè)人)。

我們不搞那么深?yuàn)W的東西(主要是我也沒(méi)怎么搞懂),我們就來(lái)一些簡(jiǎn)單的。

1、如何查看SELinux對(duì)一個(gè)文件的權(quán)限控制?

[root@node1 ~]# ls -Z       #這就是查看SELinux相關(guān)權(quán)限的選項(xiàng)
-rw-------. root root 'system_u':'object_r':'admin_home_t':s0 anaconda-ks.cfg
#最后一列是文件名
-rw-r--r--  root root ?                                cpu.cfs_quota_us~
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 initial-setup-ks.cfg
#在上面字體顏色有些特殊的便是SELinux的特殊權(quán)限

我剛看到這些東西的時(shí)候,內(nèi)心的想法就是:我的天哪,這是什么鬼東西!哈哈?。?!

不要慌,問(wèn)題不大,我這篇文章存在的意義就是將復(fù)雜的問(wèn)題簡(jiǎn)單化,你需要了解的是“ 'system_u':'object_r':'admin_home_t'”每個(gè)文件的三個(gè)字段的意思,但也不需要全部了解,你只需要知道每一段后面“_u、_r”的含義,以及最主要的一段“_t”這段是什么就行了,前面兩段““_u、_r”選擇性忽略就行了。

相關(guān)解釋如下:
_u(user):相當(dāng)于賬號(hào)方面的身份識(shí)別!
_r(role):通過(guò)角色字段,我們可以知道這個(gè)資料是屬于進(jìn)程、文件資源還是代表使用者。一般的角色有:object_r:代表的是文件或目錄等文件資源,這應(yīng)該是最常見的;system_r:代表的就是進(jìn)程啦!不過(guò),一般使用者也會(huì)被指定成為 system_r。
_t(type):這個(gè)最重要,前面兩個(gè)“user”和“role”基本不重要,重要的是在于這個(gè)類型(type)字段!基本上一個(gè)主體進(jìn)程能不能讀取到這個(gè)文件資源,就與這個(gè)字段有關(guān)。

上述是SELinux對(duì)文件的權(quán)限控制,SELinux也是針對(duì)于進(jìn)程來(lái)進(jìn)行權(quán)限控制的,那么,如何查看進(jìn)程所對(duì)應(yīng)的SELinux權(quán)限呢?請(qǐng)看下面:

[root@localhost ~]# ps -eZ             #執(zhí)行該命令,查看進(jìn)程所對(duì)應(yīng)的SELinux權(quán)限
LABEL                              PID TTY          TIME CMD
system_u:system_r:init_t:s0          1 ?        00:00:01 systemd
system_u:system_r:kernel_t:s0        2 ?        00:00:00 kthreadd
system_u:system_r:kernel_t:s0        3 ?        00:00:00 ksoftirqd/0
system_u:system_r:kernel_t:s0        4 ?        00:00:00 kworker/0:0
system_u:system_r:kernel_t:s0        5 ?        00:00:00 kworker/0:0H
system_u:system_r:kernel_t:s0        6 ?        00:00:00 kworker/u256:0
system_u:system_r:kernel_t:s0        7 ?        00:00:00 migration/0
                   ...............#省略部分內(nèi)容
#當(dāng)然了,SELinux必須是開啟狀態(tài)下,才可查看這些信息,如果SELinux關(guān)閉,是查不到的。

前面一直在說(shuō)開啟、關(guān)閉SELinux,那么怎么操作呢?請(qǐng)繼續(xù)看下去。

相關(guān)命令如下:

[root@localhost ~]# getenforce               #查看當(dāng)前SELinux狀態(tài)
Enforcing
[root@localhost ~]# setenforce 0            #將狀態(tài)設(shè)置為寬容模式
[root@localhost ~]# getenforce                #再繼續(xù)查看是否更改成功
Permissive
[root@localhost ~]# setenforce 1              #再次改為強(qiáng)制狀態(tài)
[root@localhost ~]# getenforce                 #再次查看
Enforcing

SELinux共有三種模式:Enforcing、Permissive、disabled。關(guān)于這三種模式的解釋如下:

  • Enforcing:強(qiáng)制模式,處于該狀態(tài)模式下的SELinux是正常運(yùn)行的,可以對(duì)程序的讀取起到很好的控制作用;
  • Permissive:寬容模式,處于該狀態(tài)下的SELinux也是正在運(yùn)行的,只是對(duì)于程序的讀取不進(jìn)行限制,只是記錄下日志等相關(guān)信息。
  • disabled:禁用模式,就是直接關(guān)閉了,如果想要改為此種模式,需要修改配置文件,并重新啟動(dòng)服務(wù)器。

使用命令的話,只可以將SELinux暫時(shí)性的改為強(qiáng)制模式或?qū)捜菽J?,不能修改為禁用模式,并且是一次性修改的,如果重啟的話,它將?huì)讀取到配置文件中的模式繼續(xù)運(yùn)行。

SELinux的配置文件介紹如下:

[root@node1 ~]# vim /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#以下是SELinux的三種工作模式介紹:enforcing、permissive、disabled
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing                        #這里是修改SELinux的運(yùn)行模式
# SELINUXTYPE= can take one of three two values:
#以下是SELinux的三種政策介紹,targeted、minimum、mls
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted           #這里是修改SELinux的三種政策
#一般是修改SELinux的工作模式即可,這里不談它的三種政策

上面是默認(rèn)的政策與啟動(dòng)的模式!你要注意的是,如果改變了政策則需要重新啟動(dòng);如果由 enforcing或 permissive 改成 disabled ,或由 disabled 改成其他兩個(gè),那也必須要重新啟動(dòng)。這是因?yàn)?SELinux是整合到核心里面去的, 你只可以在 SELinux 運(yùn)作下切換成為強(qiáng)制 (enforcing) 或?qū)捜?(permissive)模式,不能夠直接關(guān)閉 SELinux 的! 如果剛剛你發(fā)現(xiàn)getenforce 出現(xiàn) disabled 時(shí),請(qǐng)到上述文件修改成為 enforcing 然后重新啟動(dòng)吧?。ㄖ貑⒌倪^(guò)程會(huì)很慢,并且很有可能重啟不起來(lái),我沒(méi)有去找無(wú)法重啟的解決辦法,自行解決吧)。

來(lái)兩個(gè)小小的實(shí)驗(yàn)吧!

服務(wù)器node1和客戶端,node1上面有web服務(wù)和FTP服務(wù)。然后客戶端訪問(wèn)( 注意,此時(shí)SELinux是開啟狀態(tài)):

[root@node1 ~]# yum -y install httpd           #安裝web服務(wù)
[root@node1 ~]# yum -y install vsftpd*        #安裝FTP服務(wù)
[root@node1 ~]# systemctl start httpd          #啟動(dòng)web服務(wù)
[root@node1 ~]# systemctl start vsftpd        #啟動(dòng)FTP服務(wù)
[root@node1 ~]# echo "test web `date +%F`" > /var/www/html/test.html   #做一個(gè)測(cè)試網(wǎng)頁(yè)
[root@node1 ~]# ll -Z /var/www/html/test.html    #查看該網(wǎng)頁(yè)的type
-rw-r--r--. root root unconfined_u:object_r:'httpd_sys_content_t':s0 /var/www/html/test.html
#可以看到是屬于httpd進(jìn)程的
[root@node1 ~]# echo -e "ftptest \n`date +%F`" > /var/ftp/pub/test.txt   #做一個(gè)文件放到ftp目錄下
[root@node1 ~]# ll -R -Z /var/ftp/               #查看FTP根目錄下文件的type類型
/var/ftp/:
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 pub

/var/ftp/pub:
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 test.txt
[root@node1 ~]# getenforce            #確認(rèn)當(dāng)前SELinux狀態(tài)是開啟狀態(tài)
Enforcing
#為了避免防火墻的干擾,這里關(guān)閉firewalld防火墻(防火墻不是這個(gè)博文要說(shuō)的)

客戶端訪問(wèn)node1的web服務(wù)和FTP服務(wù):

訪問(wèn)node1的web服務(wù):
Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

訪問(wèn)node1的FTP服務(wù):
Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

1、對(duì)web網(wǎng)頁(yè)進(jìn)行測(cè)試

現(xiàn)在改一下web服務(wù)的網(wǎng)頁(yè)文件,看看client是否還能訪問(wèn)的到:

[root@node1 ~]# chcon -t admin_home_t /var/www/html/test.html    #更改類型為“admin_home_t”
[root@node1 ~]# ll -Z /var/www/html/test.html      #查看是否更改成功
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/test.html
#OK,沒(méi)問(wèn)題,類型字段已經(jīng)更改成功了

client再次訪問(wèn)測(cè)試:

Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

那么將類型改回來(lái),有兩種方法,一種是使用命令chcon手動(dòng)再次修改,剛才怎么改的,現(xiàn)在就怎么改回來(lái),命令如下:

[root@node1 ~]# chcon -t httpd_sys_content_t /var/www/html/test.html     #更改類型,使用戶可以正常訪問(wèn)

上面chcon命令可以改回來(lái),但是比較麻煩,不建議使用,這里說(shuō)一下restorecon這個(gè)命令

restorecon 命令可以讓文件恢復(fù)正確的 SELinux type(恢復(fù)默認(rèn)類型)。

[root@node1 ~]# ll -Z /var/www/html/test.html    #確認(rèn)類型還是自己隨便改的那個(gè)
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/test.html
[root@node1 ~]# restorecon -R /var/www/html/  #使用該命令,這里并沒(méi)有指定那個(gè)網(wǎng)頁(yè)文件
#是因?yàn)槲蚁胝f(shuō)“-R”這個(gè)選項(xiàng),就是遞歸修改的意思
[root@node1 ~]# ll -Z /var/www/html/test.html     #查看,是否成功
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/test.html
#OK了,沒(méi)問(wèn)題,變成了它最初的類型字段

client端應(yīng)該又可以訪問(wèn)了吧?一起瞧瞧:

Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

OK,沒(méi)問(wèn)題了。關(guān)于web網(wǎng)頁(yè)文件的測(cè)試至此結(jié)束!?。?/p>

2、對(duì)FTP服務(wù)進(jìn)行測(cè)試

1、修改FTP服務(wù)的根目錄

[root@node1 ~]# mkdir /test        #創(chuàng)建一個(gè)測(cè)試目錄
[root@node1 ~]# usermod -d /test ftp     #將/test目錄修改為FTP服務(wù)的默認(rèn)根目錄
#因?yàn)槟J(rèn)根目錄是它的宿主目錄,所以直接改它的宿主目錄,生產(chǎn)環(huán)境中,還是建議更改FTP服務(wù)的配置文件
[root@node1 ~]# echo -e "Are you ok ? \n `date +%F`" > /test/aaa.txt     #寫入一個(gè)測(cè)試文件
[root@node1 ~]# ll -Z /test/aaa.txt             #查看該文件的默認(rèn)類型
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 /test/aaa.txt
#由于這個(gè)文件和FTP服務(wù)進(jìn)程沒(méi)有關(guān)系,所以它的類型和剛安裝時(shí),/var/ftp/pub/test.txt的類型一樣
[root@node1 ~]# systemctl restart vsftpd        #重啟FTP服務(wù),以便更改生效

2、客戶端訪問(wèn)測(cè)試:
Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

當(dāng)然了,此時(shí),也可以使用chcon命令手動(dòng)更改該文件的類型,改為和/var/ftp/pub/test.txt一樣的類型,但是不可以使用restorecon命令,因?yàn)閞estorecon命令一般是將文件恢復(fù)為它初始的類型,而這個(gè)文件現(xiàn)在的類型就是初始類型啊!所以,需要另想其他方法。

方法一:使用setsebool命令修改它的布爾值:

[root@node1 ~]# getsebool -a | grep ftpd         #查看ftp相關(guān)的進(jìn)程控制
ftpd_anon_write --> off     #off表示關(guān)閉
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
[root@node1 ~]# setsebool -P ftpd_full_access 1   
#使用setsebool命令修改它訪問(wèn)相關(guān)的布爾值,1表示on(開啟),0表示off(關(guān)閉)。
[root@node1 ~]# getsebool -a | grep ftpd         #再次查看
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> on       #剛才就是將這個(gè)訪問(wèn)相關(guān)的進(jìn)程開啟了
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
[root@node1 ~]# getenforce           #確認(rèn)SELinux現(xiàn)在是開啟的
Enforcing

client再次訪問(wèn):
Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

OK,沒(méi)問(wèn)題,訪問(wèn)到了

方法2:使用setroubleshoot 工具
Redhat公司針對(duì)SELinux發(fā)布了一個(gè)非常好的工具——setroubleshoot (可以將SELinux的錯(cuò)誤訊息寫入 /var/log/messages中,并且給出解決方案)
(1)確認(rèn)setroubleshoot工具已安裝

[root@node1 ~]# rpm -qa | grep setroubleshoot    #查詢?cè)撁钍欠癜惭b
[root@node1 ~]# yum -y install setroubleshoot    #沒(méi)有安裝的話,使用該命令安裝
[root@node1 ~]# tailf /var/log/messages         #動(dòng)態(tài)刷新查看著日志消息

客戶端訪問(wèn):

Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

(2)客戶端訪問(wèn)失敗的同時(shí),服務(wù)器監(jiān)控的日志消息將會(huì)顯示如下提示:
Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

(3)我們運(yùn)行一下它提示的命令:

[root@node1 ~]# sealert -l 1e24155c-7602-4c51-8eb6-93ec8f77600f     #執(zhí)行日志中提示的信息
SELinux is preventing vsftpd from read access on the directory test.
#下面的(57.6 confidence)的含義是這一段提供的信息解決這個(gè)問(wèn)題的幾率有多大
#一般幾率越大的越靠前,所以一般看第一個(gè)就行
*****  Plugin catchall_boolean (57.6 confidence) suggests   ******************

If 要 allow ftpd to full access
Then 必須啟用 'ftpd_full_access' 布爾值告知 SELinux 此情況。
可以閱讀 'None' 手冊(cè)頁(yè)面來(lái)了解詳情。
Do       #Do表示要運(yùn)行以下命令來(lái)解決問(wèn)題
setsebool -P ftpd_full_access 1          #就是這條命令咯,我去......好像和我們第一種方法一樣....

*****  Plugin catchall_labels (36.2 confidence) suggests   *******************
#這一段表示解決問(wèn)題的幾率只有36.2%,越往下幾率越小
If you want to allow vsftpd to have read access on the test directory
Then 必須更改 test 中的標(biāo)簽
Do
# semanage fcontext -a -t FILE_TYPE 'test'
其中 FILE_TYPE 為以下內(nèi)容之一:admin_home_t, bin_t, boot_t, cache_home_t, cert_t, config_home_t, data_home_t, dbusd_etc_t, device_t, devpts_t, etc_runtime_t, etc_t, faillog_t, file_context_t, fonts_cache_t, fonts_t, ftpd_tmp_t, ftpd_tmpfs_t, ftpd_var_run_t, gconf_home_t, gnome_home_t, httpd_user_content_t, httpd_user_script_exec_t, krb5_conf_t, krb5_host_rcache_t, lib_t, locale_t, man_cache_t, man_t, mozilla_plugin_rw_t, net_conf_t, nscd_var_run_t, proc_t, public_content_rw_t, public_content_t, root_t, samba_etc_t, security_t, shell_exec_t, slapd_cert_t, src_t, sssd_public_t, sysfs_t, system_conf_t, system_db_t, systemd_logind_sessions_t, telepathy_cache_home_t, telepathy_data_home_t, textrel_shlib_t, tmp_t, tmpfs_t, udev_var_run_t, user_fonts_t, user_home_dir_t, user_home_t, user_tmp_t, usr_t, var_auth_t, var_lib_t, var_lock_t, var_log_t, var_run_t, virt_home_t, xferlog_t。
然后執(zhí)行:
restorecon -v 'test'            #這個(gè)幾率只有36.2%的提示信息,讓我們運(yùn)行這條命令
#那知道為什么幾率這么小么?因?yàn)檫@條命令是讓我們將test恢復(fù)默認(rèn)類型,肯定不會(huì)成功呀,它的默認(rèn)類型就沒(méi)有改過(guò)

                #.....................省略部分內(nèi)容
#其實(shí)這些提示信息,就是/var/log/messages日志中記錄的,只不過(guò)這樣顯示的看起來(lái)直觀了很多
[root@node1 ~]# setsebool -P ftpd_full_access 1        #那就執(zhí)行以下這個(gè)57.6%幾率的命令咯

毫無(wú)疑問(wèn),可以正常訪問(wèn)到它的ftp服務(wù):

Linux系統(tǒng)上的SELinux究竟是個(gè)什么?

———————— 本文至此結(jié)束,感謝閱讀 ————————

網(wǎng)頁(yè)名稱:Linux系統(tǒng)上的SELinux究竟是個(gè)什么?
分享鏈接:http://bm7419.com/article34/pcccse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、定制網(wǎng)站網(wǎng)站制作、網(wǎng)站導(dǎo)航品牌網(wǎng)站制作、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)