溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-07-07 13:50:10 來源:網(wǎng)絡 閱讀:899 作者:warrent 欄目:系統(tǒng)運維

前言:


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

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

所以說,想了解SELinux的,可以了解一下,為了以防以后自己所在的公司要求必須開啟SELinux,但自己又不懂,那就尷尬了,不了解也無所謂,因為遇到強制開啟SELinux的公司,也不是那么容易的事情。

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

正文:


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

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

結(jié)論:用戶讀取一個文件,必須該進程先通過SELinux驗證,然后才是對用戶的權限進行驗證。

關于上面提到的政策及安全性文本,我也沒搞的太明白,里面的東西過于深奧(這是我一個在國外工作的朋友對我說的,畢業(yè)兩年,年薪30W+,我挺佩服的一個人)。

我們不搞那么深奧的東西(主要是我也沒怎么搞懂),我們就來一些簡單的。

1、如何查看SELinux對一個文件的權限控制?

[root@node1 ~]# ls -Z       #這就是查看SELinux相關權限的選項
-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的特殊權限

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

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

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

上述是SELinux對文件的權限控制,SELinux也是針對于進程來進行權限控制的,那么,如何查看進程所對應的SELinux權限呢?請看下面:

[root@localhost ~]# ps -eZ             #執(zhí)行該命令,查看進程所對應的SELinux權限
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)容
#當然了,SELinux必須是開啟狀態(tài)下,才可查看這些信息,如果SELinux關閉,是查不到的。

前面一直在說開啟、關閉SELinux,那么怎么操作呢?請繼續(xù)看下去。

相關命令如下:

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

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

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

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

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的運行模式
# 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的工作模式即可,這里不談它的三種政策

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

來兩個小小的實驗吧!

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

[root@node1 ~]# yum -y install httpd           #安裝web服務
[root@node1 ~]# yum -y install vsftpd*        #安裝FTP服務
[root@node1 ~]# systemctl start httpd          #啟動web服務
[root@node1 ~]# systemctl start vsftpd        #啟動FTP服務
[root@node1 ~]# echo "test web `date +%F`" > /var/www/html/test.html   #做一個測試網(wǎng)頁
[root@node1 ~]# ll -Z /var/www/html/test.html    #查看該網(wǎng)頁的type
-rw-r--r--. root root unconfined_u:object_r:'httpd_sys_content_t':s0 /var/www/html/test.html
#可以看到是屬于httpd進程的
[root@node1 ~]# echo -e "ftptest \n`date +%F`" > /var/ftp/pub/test.txt   #做一個文件放到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            #確認當前SELinux狀態(tài)是開啟狀態(tài)
Enforcing
#為了避免防火墻的干擾,這里關閉firewalld防火墻(防火墻不是這個博文要說的)

客戶端訪問node1的web服務和FTP服務:

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

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

1、對web網(wǎng)頁進行測試

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

[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,沒問題,類型字段已經(jīng)更改成功了

client再次訪問測試:

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

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

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

上面chcon命令可以改回來,但是比較麻煩,不建議使用,這里說一下restorecon這個命令

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

[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
[root@node1 ~]# restorecon -R /var/www/html/  #使用該命令,這里并沒有指定那個網(wǎng)頁文件
#是因為我想說“-R”這個選項,就是遞歸修改的意思
[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了,沒問題,變成了它最初的類型字段

client端應該又可以訪問了吧?一起瞧瞧:

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

OK,沒問題了。關于web網(wǎng)頁文件的測試至此結(jié)束?。?!

2、對FTP服務進行測試

1、修改FTP服務的根目錄

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

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

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

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

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

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

OK,沒問題,訪問到了

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

[root@node1 ~]# rpm -qa | grep setroubleshoot    #查詢該命令是否安裝
[root@node1 ~]# yum -y install setroubleshoot    #沒有安裝的話,使用該命令安裝
[root@node1 ~]# tailf /var/log/messages         #動態(tài)刷新查看著日志消息

客戶端訪問:

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

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

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

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

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

*****  Plugin catchall_labels (36.2 confidence) suggests   *******************
#這一段表示解決問題的幾率只有36.2%,越往下幾率越小
If you want to allow vsftpd to have read access on the test directory
Then 必須更改 test 中的標簽
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'            #這個幾率只有36.2%的提示信息,讓我們運行這條命令
#那知道為什么幾率這么小么?因為這條命令是讓我們將test恢復默認類型,肯定不會成功呀,它的默認類型就沒有改過

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

毫無疑問,可以正常訪問到它的ftp服務:

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

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

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI