基本介紹
MLS&MCS(Multi-Level Security and Multi-Category Security)
多層安全技術是指強制實施Bell-La Padula
強制訪問模型的安全方案。在MLS下,用戶和進程稱爲Subject(主體)
,文件、設備和系統的其他組件稱爲Object(對象)
。主體和對象都標有安全級別,每個安全級別都由一個敏感度和一個類別組成。在SELinux
的情況下,一個進程(以“機密”級別運行)可以按當前級別進行讀/寫,但只能讀取低級別的文件,或者寫更高級別的文件(在被許可的情況下)。一個進程訪問不同安全等級文件的示意圖如下:
安全等級的組成部分
MLS / MCS 表示格式
以下是SELinux
中MLS/MCS等級表示的示意圖:
其中各字段含義如下:
sensitivity
- 敏感度級別是分級的,一般來說s0最低。這些值是使用敏感性聲明定義的。傳統上,MLS系統的最大值是s15(儘管“參考策略”的最大值是構建時間選項)。對於MCS系統,僅定義了一個靈敏度,即s0。category
- 類別是可選的(即可以有零個或多個類別),並且它們將構成無序且不相關的列表。這些值是使用category語句定義的。C1,C3表示無序列表,而C1.C3則表示C1、C2、C3連續的列表。傳統上,該值在C0和C255之間(儘管參考策略的最大值是構建時間選項),不過在我試驗的Centos 7
已經達到了C1023。level
- 等級就是由敏感度和類別組成的
安全等級的構成
一個安全等級是由兩個安全級別構成的範圍標識的,就像下面這張圖描述的那樣:
對於等級下限表示的是當前進程或主體的等級,而上限則是表示能被許可訪問的最高等級。對於SELinux
來說一般下限被設置爲s0,而上限則被設置爲s0:c0.c1023.用一下命令就能看到相關進程的安全等級範圍:
[root@localhost /]# ps -Z
LABEL PID TTY TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 11360 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 13783 pts/0 00:00:00 man
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 13794 pts/0 00:00:00 less
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 14908 pts/0 00:00:00 ps
不同等級之間的訪問控制
上面這張圖中灰色的區域即表示了s0 - s3:c1.c5
安全等級進程所能訪問的文件的等級標籤。
雖然在模型中規定是可以往高等級文件寫入的,不過實際情況中
SELinux
是不允許往高等級文件寫入數據的,除非有特別許可。
在SELinux中使用MLS/MCS
本次實驗的平臺的是Centos7
,請在進行本次試驗時,務必對系統進行快照備份,以便恢復。
由於MLS並不是很支持
X window
系統(圖形界面),所以在開始下面操作之前,請永久切換爲字符界面。
- 首先需要安裝
selinux-policy-mls
包
[root@localhost /]# yum install -y selinux-policy-mls
- 修改配置文件
/etc/selinux/config
,以啓用MLS
功能
# 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=permissive
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=mls
請務必將運行模式設置爲
permissive
,否則可能重啓後無法開機
- 使用
fixfiles
腳本在下一次重啓後,重新標記系統文件
# 該命令會創建/.autorelabel文件
[root@localhost /]# fixfiles -F onboot
- 然後重啓系統,將會看到如下輸出,重新標記的時間取決於你的電腦性能,大概會持續8分鐘。
*** Warning -- SELinux mls policy relabel is required.
*** Relabeling could take a very long time, depending on file
*** system size and speed of hard drives.
***********
最下面的星號*
,每一個即表示已經標記完了1000個文件。
- 在開機之後,由於我們運行在許可模式下,
SELinux
並不會阻止文件的訪問,而只是單純的記錄不符合規則的訪問。
使用如下指令查看,有哪些文件訪問被記錄了下來,需要對文件的等級進行修改,或者修改訪問進程的等級已符合規則。如果爲空(剛裝的虛擬機
),就說明系統當前所有的進程的訪問都是符合規則的,這時才能修改運行模式爲enforce
,否則可能會出現系統運行異常崩潰的問題。
[root@localhost /]# grep "SELinux is preventing" /var/log/messages
修改MLS等級
- 修改
SELinux
用戶的MLS等級標籤
# 例如:semanage login --modify --range s3:c123 dask
# 可以不用設置MLS範圍,而是直接設置當前的MLS等級,即只設置下限
[root@localhost /]# semanage login --modify --range (level) (selinux_user)
進程的上下文標識是繼承自運行的用戶的
- 修改文件的MLS等級標籤
[root@localhost /]# chcon -R -l s2 /home/dask