Selinux安全上下文详解
SELinux介紹
????DAC:自由訪問控制
????MAC:? 強制訪問控制
???????? ??DAC環境下進程是無束縛的
????? ????? MAC環境下策略的規則決定控制的嚴格程度
????????? ? MAC環境下進程可以被限制
????????????策略被用來定義被限制的進程能夠使用哪些資源(文件和端口)
????????????默認情況下,沒有被明確允許的行為將被拒絕
?
Selinux策略
????對象(object):所有可以讀取的對象,包括文件、目錄和進程、端口等
????主體:進程稱為主體(subject)
????Selinux中所有的文件都賦予一個type的文件類型標簽,對于所有的進程也賦予格子衣domain的標簽。domain標簽能夠執行的操作由安全策略里定義
????當一個subject試圖訪問一個object,Kernel中的策略執行服務器將檢查AVC(訪問矢量緩存Access Vector Cache),在AVC中,subject和object的權限被緩存,查找“應用+文件”的安全環境。然后根據查詢結果允許或拒絕訪問
????安全策略:定義主體讀取對象的規則類數據庫,規則中記錄了哪個類型的主體使用哪個方法讀取哪一個對象是允許還是拒絕,并且定義了哪種行為是允許或拒絕
Selinux安全上下文
????傳統Linux,一切接文件,由用戶,組,權限控制訪問
????在Selinux中,一切皆對象(object),由存放在inode的擴展屬性域的安全元素所控制其訪問
????所有文件和端口資源和進程都具備安全標簽:安全上下文(security context)
????安全上下文有五個元素組成:
????????user:role:type:sensitivity:category
????????user_u:object_r:tmp_t:s0:c0
????實際上下文:存放在文件系統中,ls -Z;ps -Z可以查看詳細信息
????期望(默認)上下文:存放在二進制的SElinux策略庫(映射目錄和期望安全上下文)
????????semanage? fcontext? -l
五個安全元素
????User:指示登錄系統的用戶類型,如root,user_u,system_u,多數本地進程都屬于自由(unconfined)進程
? ? Role:定義文件,進程和用戶的用途:文件:object_r,進程和用戶:system_r
????Type:指定數據類型,規則中定義何種進程類型訪問何種文件Target策略基于type實現,多服務公用:public_conten_t
????Sensitivity:限制訪問的需要,由組織定義的分層安全級別,如unclassified,secret,top,secret,一個對象有且只要一個sensitivity,分0-15級,s0最低,Target策略默認使用s0
????Category:對于特定組織劃分不分層的分類,如FBI Secret,NSA secret,一個對象可以有多個catagroy,c0-c1-23共1024個分類,Target策略不適用category
Selinux配置文件
? ? Selinux配置文件(configuration)或策略文件(policy)位于/etc/目錄下
????/etc/sysconfig/selinux是一個符號鏈接,真正的配置文件為:/etc/selinux/config
Selinux常用工具
????chcon命令修改文件安全上下文
????????chcon [options] CONTEXT files
????????說明:
????????????CONTEXT為要設置的安全上下文
????????????files對象(文件)
????????????options
????????????????-f: 強迫修改
????????????????-R:遞歸修改對象的安全上下文
????????????????-r ROLE:修改安全上下文角色的配置
????????????????-t TYPE:修改安全上下文類型的配置
????????????????-u USER:修改安全上下文用戶的配置
在我們的實際生產環境中跟文件權限最相關的是位于第三字段的數據類型,下面我們就用具體的示例來講解一下修改文件的type類型導致文件權限的變更
我們通過更改/var/log/messages文件的安全上下文類型來做一下演示
首先查看messages文件的原有標簽
ls -Z? ?/var/log/messages
現將message更改成default_t類型
因為我們更改了messages文件的安全上下文所有導致此文件與/var/log目錄上下文標簽不匹配所以所有日志都將無法寫入此文件
更改回原來的標簽類型
chcon -t var_log_t? /var/log/messages
還可以使用第二種方法直接恢復
首先查詢selinux策略的數據庫種messages對應的標簽類型,然后使用restorecon后面跟/var/log/message直接恢復即可
semanage fcontext? ?-l? |? grep /var/log/message
注意:此命令要求Selinux的策略數據庫中必須曾經記錄過此文件的標簽
假設此時我們需要自己創建一個網頁文件,那么該怎樣設置它的文件標簽呢?
首先創建一個目錄/data
在目錄中任意創建幾個文件a.txt,b.txt
我們使用ls -Z? /data查看會發現新創建的文件的標簽默認為default_t
這里我們可以知道自己手動常見的文件因為selinux安全測錄==策略數據庫中沒有記載,所以一律為defaults_t標簽類型
查看一下在/httpd服務的主目錄下的文件標簽類型為httpd_sys_content_t,此類型標簽代表了用戶可以從主目錄進入訪問的標簽類型
防火墻策略放行httpd服務之后用瀏覽器訪問
瀏覽器可以正常訪問登錄
那么如果我們自己從新在/data目錄下定義一個網頁會怎樣?
首先修改httpd的配置文件
在/data目錄下創建一個名為test2.html的網頁文件
并添加內容test2 page!!!
將DocumentRoot主目錄定義到/data下,并通過瀏覽器重新訪問
此時我們查看一下手動創建的test2.html文件它的標簽為default_t類型
此類型的標簽導致我們訪問失敗
然后我們修改test2.html的文件類型標簽,之后重啟服務并重新訪問
chcon -t? httpd_sys_content_t? test2.html
備注:我們在為自己創建的文件設置標簽時,首先的知道此類型的文件需要打上哪種標簽,可以到selinux的安全策略庫中查詢一下。
當然我們如果每次都手動設置每個文件會比較麻煩,所以我們可以直接將/data父目錄設置成httpd類型的標簽,并將此目錄加到selinux的安全策略庫中
使用如下命令:
這樣以后所有在/data目錄下創建的文件都會自動打上http_sys_content_t標簽類型
接下來說一下端口的定義:
Selinux端口標簽
查看端口標簽
????semanage port -l
添加端口
????semanage port -a -t port_label -p tcp|upd PORT
????semanage port -a -t http_port_t -p tcp? 8998
刪除端口
????semanage port -d? -t port_lable -p tcp|udp? PORT
????semanage port -d -t http_port_t -p tcp 8998
修改現有端口為新標簽
????semanage port -m -t port_label -p? tcp|upd PORT
????semanage port -m -t http_port_t -p tcp 8998??
我們查看一下系統中httpd服務支持的端口
使用semanage port -a -t http_port_t -p tcp 8998
可以看到httpd服務支持的幾個端口
然后我們手動將8998端口定義到httpd服務支持的端口中,并修改httpd服務的配置文件讓它監聽在8998端口上,重啟服務之后,使用瀏覽器訪問網站
可以看到網站監聽在新的端口上,并且能夠正常訪問。
最后我們在來說一下Selinux的布爾值
SELinux布爾值
布爾值規則
????getsebool
????setsebool
查看bool命令
????getsebool [-a] [boolean]
????semanage boolean -l
????semanage boolean -l -C :查看修改過的布爾值
設置bool值命令
????setsebool [-P] boolean value(on ,off)
????setsebool [-P] Boolean value(0,1)
例如查看一下ftp服務當前所有生效的布爾型值
如果希望ftp支持匿名上傳可以將第一項ftpd_anon_write -->off改為on
setsebool?ftpd_anon_write=1
備注:此命令更改的只是內存中的數據,只起到臨時生效的作用
想讓更改永久生效則使用 -P 選項
上面的內容就是關于Selinux安全上下文的講解
轉載于:https://blog.51cto.com/11970509/2320779
總結
以上是生活随笔為你收集整理的Selinux安全上下文详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postgresql数据库用户名密码验证
- 下一篇: linux 其他常用命令