SELinux

一 SELinux 簡介

1 SELinux(security enhanced Linux)安全強化的Linux

SELinux 是由美國國家安全局(NSA)開發,我們知道所有的系統資源都是透過進程來進行存取的,那麼/var/www/html/如果設定爲777,代表所有進程均可對該目錄進行存取,爲了控制權限與進程之間的問題,SELinux是在進行進程、文件等細部權限設定依據一個核心模塊,由於啓動網絡服務也是進程,因此也剛好也能控制網路服務能否存存取系統資源的一道關卡。

2 傳統的文件權限與賬號關係:自主式訪問控制,DAC

系統賬號分爲系統管理員(root)與一般用戶,各種權限對root是無效的,因此,當某個進程要對文件進行存取時,系統就會根據該進程的擁有者/羣組,並比對文件的權限,若權限通過檢查,就可以存取該文件了這種存取方式是(DAC discretionary access control),基本上,就是依據進程擁有者與文件資源的rwx權限來決定有無存取能力
DAC的困擾:
root 具有最高的權限:如果有一個進程屬於root的權限,則系統上的任何資源都可以進行存取
使用者可以取得進程來變更文件資源的訪問權限:如果你不小心將某個目錄的權限設定爲777,由於對任何人的權限會變成rwx,因此該目錄就會被任何人所任意存取!

3 以政策規則定製特定進程讀取特定文件:委任式訪問控制,MAC

爲了避免DAC容易發生的問題,因此SELinux導入了委任式訪問控制(mandatory access control)的方法,委任式訪問控制控制可以針對特定的進程與特定的文件資源來進行權限的控管, 即使你是root,那麼在使用不同的進程時,你所取得的權限並不一定時root,而得要看當時該進程的設定而定。這樣,我們對控制的主體變成了進程而不是使用者,此外,這個主體進程也不能任意使用系統文件資源,因爲每個文件資源也有針對該主體進程設定可取用的權限.
SELinux 也提供一些預設的政策(policy),並在該政策內提供多個(rule),
SELinux
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

二 SELinux 的內部解析

SELinux是通過MAC的方式來控管進程,他控制的主體是進程,而目標則該進程能否讀取的文件資源。

主體(subject)

SELinux主要想要管理的就是進程,因此主體跟process相同

目標(object)

主體進程能否存取的目標資源一般都是文件系統,因此目標和文件系統相同

政策(policy)

由於進程與文件數量大,因此SELinux會依據某些服務來定製基本的存取安全性政策,這些政策內還會有詳細的規則(rule)來制定不同的服務開發某些資源的存取與否。
三個主要政策
1 targeted:針對網絡服務限制較多,針對本機限制較少是,是預設的政策
2 minmum:由target修訂而來,僅針對選擇的進程來保護
3 mls:完整的SELinux限制,限制方面比較嚴格
建議使用預設的target政策

安全性本文(security context)

主體能不能存取目標除了政策指定外,主體與目標的安全性本文必須一致才能順利存取,
SELinux重點在保護進程讀取文件系統的權限,
SELinux

主體進程必須要通過SELinux政策內的規則放行後,就可以與目標資源進行安全性本文的對比,若對比失敗,則無法存取文件,若對比成功則可以開始存取目標

**安全性本文存在於主體進程與目標文件資源中,進程內存內,所以安全性本文可以存入是沒問題的,文件的安全性本文是放置在文件的iNode內,因此主體進程想要讀取目標文件資源,同時需要讀取iNode。

查看SELinux相關信息
SELinux
解釋
lrwxrwxrwx. root root system_u(身份識別):object_r(角色):bin_t(類型):s0 bin -> usr/bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot

身份識別(identify)

相當於賬號方面的身份識別,主要的身份識別常見有下幾種類型

unconfined_u:不受限的用戶,也就是說,該文件來自於不受限的進程所產生的,一般來說,我們使用可登入賬號取得bash之後預設的bash環境是不受SELinux管制的,因爲bash並不是特別的網絡服務,因此,在這個不受SELinux所限制的bash進程所產生的文件,其身份識別大多數就是unconfined_u這個用戶

system_u: 系統用戶,大部分就是系統自己產生的文件
基本上,如果是系統或軟件本身所提供的文件,大多數就是system_u這個身份名稱,而如果是我們用戶透過bash自己建立的文件,則大多數是不受限制的,如果是網絡服務所產生的的文件,或者系統服務運行過程中的文件,則大部分的識別就會是system_u

SELinux
自己創建的文件是unconined_u,而vsftp的文件則是system_u
SELinux

角色(role)

透過角色字段,我們可以知道這個資料是屬於進程,文件資源還是使用者。
object_r:代表的是文件或目錄等文件資源
system_r:代表的就是進程

類型(type)最重要

基本上,一個主體進程能不能讀取到這個文件資源,與類型字段有關,而類型字段在文件與進程的定義不太相同。
type:在文件資源(object)上面稱爲類型type
domain :在主體進程(subject)則成爲領域(domain)

domain 需要與type搭配,則該進程才能順利讀取文件資源啦
進程與文件SELinux type字段的相關性
SELinux

進程與文件SELinux type字段的相關性

基本上進程主要分爲兩大類,一種是系統有受限的system_u:system_r,另一種則可能是用戶自己的
SELinux

比較不受限的進程(通常是本機用戶自己執行的程序),亦是unconfined_u:unconfined_r這兩種
SELinux
此安全本文的類型名稱爲crond_t格式
SELinux

[root@localhost ~]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d
drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d
-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab
-rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond

當我們執行/usr/sbin/crond之後,這個程序的進程的domain類型會是crond_t 這個crond_t 能夠讀取的配置文件爲system_cron_spool_t這種類型。因此無論/etc/crontab,/tec/cron.d 以及/var/spool/cron 都會是相關的SELINUX類型,
SELinux
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

三 SELinux 運行模式

enforcing:強制模式,代表SELinux運行中,且已經正確的開始限制domain/type了
permissive:寬容模式,代表SELinux運行中,不僅會有警告信息並不會實際限制domain/type的存取,這種模式可以運來作爲SELinux的debug之用。

disabled:關閉,SELinux並沒有實際運作
SELinux
由上述可知,並非所有的進程都會被SELinux管制,可以透過ps -eZ 去撰取
[root@localhost ~]# ps -eZ | grep -E 'cron|bash'
system_u:system_r:crond_t:s0-s0:c0.c1023 1031 ? 00:00:00 crond
system_u:system_r:crond_t:s0-s0:c0.c1023 1034 ? 00:00:00 atd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1739 pts/0 00:00:00 bash
其中bash不經過SELinux的過濾,直接進入rwx的判斷的
查看SELinux的模式:
[root@localhost ~]# getenforce
Permissive

SELinux的政策(policy)

sestatus [-vb]

選項與參數
-v :檢查列於/etc/sestatus.conf 內的文件與進程的安全性文本內容
-b: 將目前政策的規則布爾值列出。

[root@www ~]# sestatus
SELinux status: disabled 沒有啓動的狀態

[root@localhost ~]# sestatus
SELinux status: enabled 是否啓動SELinux
SELinuxfs mount: /sys/fs/selinux SELinux 的相關文件數據掛載點
SELinux root directory: /etc/selinux SELinux的根目錄
Loaded policy name: targeted 目前的政策
Current mode: permissive 目前的模式
Mode from config file: error (Success) 目前配置文件內規範的SELinux 模式
Policy MLS status: enabled 是否含有NLS的模式機制
Policy deny_unknown status: allowed 是否預設抵擋未知的主體進程
Max kernel policy version: 28

目前的政策:targeted,mls,minmum三種

SELinux的啓動與關閉
當由enforcing或permissive改成disabled,或由disabled改成其他模式,需要重新啓動, 因爲系統必須要針對文件寫入安全性本文的信息,所以開機過程會花費不少時間在等待重新寫入 SELinux 安全性本文 (有時也稱爲SELinux Label)

讓SELinux在enforcing和permissive 之間的切換方式:

setenforce [0|1]

參數與選項:
0:轉化成permissive 寬容模式
1: 轉成 enforcing 強制模式

[root@localhost ~]# setenforce 1
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

四 SELinux 政策內的規則管理

SELinux各個規則的布爾查詢 getsebool

[root@localhost ~]# getsebool -a [規則名稱]

選項與參數:
-a :列出目前系統上面的所有SELinux規則的布爾值爲開啓或關閉值
[root@localhost ~]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off

**SELinux 各個規格的主體進程能夠讀取的文件 SELinux type 查詢 seinfo,sesearch

安裝完成後就可以查詢規則中限制的東西了
[root@localhost ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@localhost ~]#
yum install /mnt/Packages/setools-console-***
已加載插件:langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

seinfo 的選項與參數

-A:列出SELinux的狀態,規則布爾值、身份識別、角色、類別等信息
-u:列出SELinux的所有身份識別(user)種類
-r:列出SELinux 的所有角色role(種類)
-t:列出SELinux的所有類別(type)種類
-b:列出所有規則的種類(布爾值)

[root@localhost ~]# seinfo

Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.28 (binary, mls)

Classes: 83 Permissions: 255
Sensitivities: 1 Categories: 1024
Types: 4446 Attributes: 353
Users: 8 Roles: 14
Booleans: 280 (各種selinux規則共280條) Cond. Expr.: 331
Allow: 90724 Neverallow: 0
Auditallow: 151 Dontaudit: 8054
Type_trans: 15683 Type_change: 74
Type_member: 28 Role allow: 29
Role_trans: 777 Range_trans: 5249
Constraints: 98 Validatetrans: 0
Initial SIDs: 27 Fs_use: 26
Genfscon: 91 Portcon: 549
Netifcon: 0 Nodecon: 0
Permissives: 30 Polcap: 2

sesearch [-A] [-g] [-t] [-b]

-A :列出後面數據中,允許[讀取或放行]的相關數據
-t:後面還要接類別,如-t httpd_t
-b:後面還要接SELinux的規則, httpd_enable_ftp_server

[root@localhost ~]# sesearch -A -s crond_t | grep spool
allow crond_t cron_spool_t : file { ioctl read getattr lock open } ;
allow crond_t var_spool_t : dir { ioctl read getattr lock search open } ;
allow daemon user_cron_spool_t : file { ioctl read write getattr lock append } ;
allow crond_t system_cron_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow crond_t system_cron_spool_t : dir { ioctl read getattr lock search open } ;
allow crond_t cron_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow 後面接着主機進程以及文件的SELinux type 意思是說,crond_t 可以讀取system_cron_spool_t、 cron_spool_t 、 cron_spool_t 的文件/目錄類型等。

SELinux

有 crond_t admin_home_t 存在,但是這是總體的信息,並沒有針對某些規則的尋找~所以還是不確定 aaa.py 能否被讀取。但是,基本上就是 SELinux type 出問題~因此纔會無法讀取的!

SELinux
httpd_enable_homedirs 的功能是允許 httpd 進程去讀取用戶家目錄的意思
[root@www ~]# sesearch -A -b httpd_enable_homedirs
其含義是列出此功能開啓後httpd進程能夠讀取的文件的數量的列表。
從上面的數據纔可以理解,在這個規則中,主要是放行 httpd_t 能否讀取用戶家目錄的文件! 所以,如果這個規則沒有啓動,基本上, httpd_t 這種進程就無法讀取用戶家目錄下的文件!

修改SELinux 規則的布爾值

setsebool [-P] (大寫) [規則名稱] [0|1]
選項與參數:
-P :直接將設定值寫入配置文件,該設定數據會生效。
SELinux
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

五 SELinux 安全本文修改

我們知道 SELinux 對受限的主體進程有沒有影響,第一關考慮SELinux 的三種類型,第二關考慮 SELinux 的政策規則是否放行,第三關則是開始比對 SELinuxtype 啦!

使用chcon 手動修改文件的SELINUX type

chcon [-R] [-t type ] [-u user] [-r role] 文件

選項與參數:
-R :連同給目錄下的此目錄也同時修改
-t: 後面接安全性本文的類型字段,
-u 後面接身份識別,如system_u
-r : 後面接角色,如system_r
-v: 若有變化,請將變動的結果列出來
--reference=範例文件,那某個文件當範例來修改後續的文件的類型。

SELinux
修改aaa.py的文件SELinux type
SELinux
通過--reference 進行修改:
SELinux

通過restorecon 來讓SELinux自己解決默認目錄下的SELinux type 。

使用restorecon 來讓文件恢復正確的SELinux type

restorecon [-Rv ] 文件或目錄

-R 連同次目錄一起修改
-v:將過程顯示到屏幕上
SELinux

semanage 默認目錄的安全性本文查詢與修改:

restorecon 可以恢復到原來的SELinux TYPE的原因是有個地方在記錄文件/目錄的selinux 默認類型,
查詢和增加修改預設的selinux type可以通過 semanage來實現
semanage {login| user|port|interface|fcontext|translation} -l

semanage fcontext -{a|d|m} {-frst} file_spec
選項與參數:
fcontext:主要用在安全性本文方面的用途,-l 爲查詢的意思。
-a: 增加的意思,你可以增加一些目錄的默認安全性本文類型設定
-m :修改的意思
-d:刪除的意思
SELinux

這便是restorecon和在其目錄下建立的文件默認是此SELinux 類型的原因。
SELinux

SELinux
查看其目錄的上一層SELinux的類型
SELinux

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章