之前三篇文章基本操作相關室奏,這篇文章主要講到了原理,文章僅僅作為參考
REF:https://www.cnblogs.com/gailuo/p/5041034.html
1. 簡介
SELinux帶給Linux的主要價值是:提供了一個靈活的瑰艘,可配置的MAC機制。
Security-Enhanced Linux (SELinux)由以下兩部分組成:
1- Kernel SELinux模塊(/kernel/security/selinux)
2- 用戶態(tài)工具
SELinux是一個安全體系結構护姆,它通過LSM(Linux Security Modules)框架被集成到Linux Kernel 2.6.x中。它是NSA (United States National Security Agency)和SELinux社區(qū)的聯(lián)合項目眶诈。
SELinux提供了一種靈活的強制訪問控制(MAC)系統(tǒng)衍锚,且內(nèi)嵌于Linux Kernel中。SELinux定義了系統(tǒng)中每個【用戶】功蜓、【進程】园爷、【應用】和【文件】的訪問和轉(zhuǎn)變的權限,然后它使用一個安全策略來控制這些實體(用戶式撼、進程童社、應用和文件)之間的交互,安全策略指定如何嚴格或?qū)捤傻剡M行檢查著隆。
SELinux對系統(tǒng)用戶(system users)是透明的扰楼,只有系統(tǒng)管理員需要考慮在他的服務器中如何制定嚴格的策略。策略可以根據(jù)需要是嚴格的或?qū)捤傻摹?/p>
只有同時滿足了標準Linux訪問控制和SELinux訪問控制時美浦,主體才能訪問客體弦赖。
1.1 DAC與MAC的關鍵區(qū)別(root用戶)
MAC中安全增強型Linux(SELinux)開始是由NSA(國家安全局)啟動并加入到Linux系統(tǒng)中的一套核心組件及用戶工具,可以讓應用程序運行在其所需的最低權限上浦辨。
DAC中未經(jīng)修改過的Linux系統(tǒng)是使用自主訪問控制的蹬竖,用戶可以自己請求更高的權限,一單獲取,就有了所有權限币厕,不是針對某個文件的權限列另,由此惡意軟件幾乎可以訪問任何它想訪問的文件,而如果你授予其root權 限旦装,那它就無所不能了页衙。
在SELinux中沒有root這個概念,安全策略是由管理員來定義的同辣,任何軟件都無法取代它拷姿。這意味著那些潛在的惡意軟件所能造成的損害可以被控制在最小。一般情況下只有非常注重數(shù)據(jù)安全的企業(yè)級用戶才會使用SELinux旱函。
操作系統(tǒng)有兩類訪問控制:自主訪問控制(DAC)和強制訪問控制(MAC)响巢。
1-標準Linux安全:DAC
2-SELinux標準Linux安全+可以配置的MAC。
DAC機制都有一個共同的弱點棒妨,就是它們不能識別自然人與計算機程序之間最基本的區(qū)別踪古。簡單點說就是,如果一個用戶被授權允許訪問券腔,意味著程序也被授權訪問伏穆,如果程序被授權訪問,那么惡意程序也將有同樣的訪問權纷纫。DAC最根本的弱點是主體容易受到多種多樣的惡意軟件的攻擊枕扫,MAC就是避免這些攻擊的出路,大多數(shù)MAC特性組成了多層安全模型辱魁。
SELinux實現(xiàn)了一個更靈活的MAC形式烟瞧,叫做類型強制(Type Enforcement)和一個非強制的多層安全形式(Multi-Level Security)。
在Android4.2中染簇,SELinux是個可選項参滴,谷歌并沒有直接取消root權限或其他功能。這是一個為企業(yè)級用戶或是對隱私數(shù)據(jù)極為重視的用戶提供的選項锻弓,普通消費者則完全可以關閉它砾赔。
2. SELinux的運行機制
SELinux決策過程如下圖所示:
當一個subject(如: 一個應用)試圖訪問一個object(如:一個文件),Kernel中的策略執(zhí)行服務器將檢查AVC (Access Vector Cache), 在AVC中青灼,subject和object的權限被緩存(cached)暴心。如果基于AVC中的數(shù)據(jù)不能做出決定,則請求安全服務器杂拨,安全服務器在一個矩陣中查找“應用+文件”的安全環(huán)境酷勺。然后根據(jù)查詢結果允許或拒絕訪問,拒絕消息細節(jié)位于/var/log/messages中扳躬。
3. SELinux偽文件系統(tǒng)
/selinux/偽文件系統(tǒng)kernel子系統(tǒng)通常使用的命令脆诉,它類似于/proc/偽文件系統(tǒng)甚亭。系統(tǒng)管理員和用戶不需要操作這部分。/selinux/目錄舉例如下:
-rw-rw-rw- 1 root root 0 Sep 22 13:14 access
dr-xr-xr-x 1 root root 0 Sep 22 13:14 booleans
--w------- 1 root root 0 Sep 22 13:14 commit_pending_bools
-rw-rw-rw- 1 root root 0 Sep 22 13:14 context
-rw-rw-rw- 1 root root 0 Sep 22 13:14 create
--w------- 1 root root 0 Sep 22 13:14 disable
-rw-r--r-- 1 root root 0 Sep 22 13:14 enforce
-rw------- 1 root root 0 Sep 22 13:14 load
-r--r--r-- 1 root root 0 Sep 22 13:14 mls
-r--r--r-- 1 root root 0 Sep 22 13:14 policyvers
-rw-rw-rw- 1 root root 0 Sep 22 13:14 relabel
-rw-rw-rw- 1 root root 0 Sep 22 13:14 user
如cat enforce其值可能如下
1: enforcing mode
0: permissive mode
4. SELinux配置文件
SELinux配置文件(configuration)或策略文件(policy)位于/etc/目錄下击胜。
4.1 /etc/sysconfig/selinux配置文件
/etc/sysconfig/selinux是一個符號鏈接亏狰,真正的配置文件為:/etc/selinux/config
配置SELinux有如下兩種方式:
1-使用配置工具:Security Level Configuration Tool (system-config-selinux)
2-編輯配置文件 (/etc/sysconfig/selinux).
/etc/sysconfig/selinux中包含如下配置選項:
1- 打開或關閉SELinux
2- 設置系統(tǒng)執(zhí)行哪一個策略(policy)
3- 設置系統(tǒng)如何執(zhí)行策略(policy)
4.2 配置文件選項
4.2.1 SELINUX
SELINUX=enforcing|permissive|disabled —定義SELinux的高級狀態(tài)
? enforcing — The SELinux security policy is enforced.
? permissive — The SELinux system prints warnings but does not enforce policy.
? disabled — SELinux is fully disabled. SELinux hooks are disengaged from the kernel and the pseudo-file system is unregistered.
4.2.2 SELINUXTYPE(安全策略)
SELINUXTYPE=targeted|strict — 指定SELinux執(zhí)行哪一個策略
? targeted — 只有目標網(wǎng)絡daemons保護。每個daemon是否執(zhí)行策略偶摔,可通過system-config-selinux進行配置暇唾。保護常見的網(wǎng)絡服務,為SELinux默認值辰斋。 可使用如下工具設置每個daemon的布爾值:
1- getsebool -a: 列出SELinux的所有布爾值
2- setsebool: 設置SELinux布爾值策州,如:setsebool -P dhcpd_disable_trans=0,-P表示即使用reboot之后宫仗,仍然有效够挂。
? strict — 對SELinux執(zhí)行完全的保護。為所有的subjects和objects定義安全環(huán)境藕夫,且每一個Action由策略執(zhí)行服務器處理孽糖。提供符合Role-based-Access Control(RBAC)之policy,具備完整的保護功能毅贮,保護網(wǎng)絡服務办悟、一般指令及應用程序。
4.2.3 SETLOCALDEFS
SETLOCALDEFS=0|1 — 控制如何設置本地定義(users and booleans)滩褥。
? 1:這些定義由load_policy控制病蛉,load_policy來自于文件/etc/selinux/<policyname>
? 0:由semanage控制
4.3 /etc/selinux/目錄
/etc/selinux/是存放所有策略文件和主要配置文件的目錄。其例子如下:
-rw-r--r-- 1 root root 448 Sep 22 17:34 config
drwxr-xr-x 5 root root 4096 Sep 22 17:27 strict
drwxr-xr-x 5 root root 4096 Sep 22 17:28 targeted
5. SELinux工具
- /usr/sbin/setenforce — 修改SELinux運行模式瑰煎,例子如下:
? setenforce 1 — SELinux以強制(enforcing)模式運行
? setenforce 0 — SELinux以警告(permissive)模式運行
為了關閉SELinux铺然,你可以修改配置文件:/etc/selinux/config或/etc/sysconfig/selinux
- /usr/sbin/sestatus -v — 顯示系統(tǒng)的詳細狀態(tài),例子如下:
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 21
Policy from config file: targeted
Process contexts:
Current context: user_u:system_r:unconfined_t:s0
Init context: system_u:system_r:init_t:s0
/sbin/mingetty system_u:system_r:getty_t:s0
==================================================
/usr/bin/newrole — 在一個新的context或role中運行一個新的shell
/sbin/restorecon — 通過為適當?shù)奈募虬踩h(huán)境標記擴展屬性丢间,設置一個或多個文件的安全環(huán)境
/sbin/fixfiles — 檢查或校正文件系統(tǒng)中的安全環(huán)境數(shù)據(jù)庫
getsebool — getsebool -a:查看所有布爾值
setsebool — 參數(shù)-P探熔,永久性設置
chcon 修改文件驹针、目錄的安全上下文
chcon –u[user]
chcon –r[role]
chcon –t[type]
chcon –R 遞歸
6. 類型強制的安全上下文(Type Enforcement Security Context)
安全上下文是一個簡單的烘挫、一致的訪問控制屬性,在SELinux中柬甥,類型標識符是安全上下文的主要組成部分饮六,由于歷史原因,一個進程的類型通常被稱為一個域(domain)苛蒲,"域"和"域類型"意思都一樣卤橄,我們不必苛刻地去區(qū)分或避免使用術語域,通常臂外,我們認為【域】窟扑、【域類型】喇颁、【主體類型】和【進程類型】都是同義的,即都是安全上下文中的“TYPE”嚎货。
SELinux對系統(tǒng)中的許多命令做了修改橘霎,通過添加一個-Z選項顯示客體和主體的安全上下文。
1-系統(tǒng)根據(jù)PAM子系統(tǒng)中的pam_selinux.so模塊設定登錄者運行程序的安全上下文殖属;
2-文件的Security Contex規(guī)則如下:
? rpm包安裝的:會根據(jù)rpm包內(nèi)記錄來生成安全上下文姐叁;
? 手動創(chuàng)建的文件:會根據(jù)policy中規(guī)定的來設置安全上下文;
? cp:會重新生成安全上下文洗显;
? mv:安全上下文則不變外潜。
3-id -Z
顯示了你的shell的安全上下文;
4- ps -Z
檢查進程的安全上下文挠唆;
5- ls -Z
檢查文件处窥、目錄的安全上下文;
6.1 安全上下文格式
所有操作系統(tǒng)訪問控制都是以關聯(lián)的客體和主體的某種類型的訪問控制屬性為基礎的损搬。在SELinux中碧库,訪問控制屬性叫做安全上下文。所有客體(文件巧勤、進程間通訊通道嵌灰、套接字、網(wǎng)絡主機等)和主體(進程)都有與其關聯(lián)的安全上下文颅悉,一個安全上下文由三部分組成:用戶沽瞭、角色和類型標識符。常常用下面的格式指定或顯示安全上下文:
USER:ROLE:TYPE[LEVEL[:CATEGORY]]
安全上下文中的用戶和角色標識符除了對強制有一點約束之外對類型強制訪問控制策略沒什么影響剩瓶,對于進程驹溃,用戶和角色標識符顯得更有意義,因為它們是用于控制類型和用戶標識符的聯(lián)合體延曙,這樣就會與Linux用戶賬號關聯(lián)起來豌鹤;然而,對于客體枝缔,用戶和角色標識符幾乎很少使用布疙,為了規(guī)范管理,客體的角色常常是object_r愿卸,客體的用戶常常是創(chuàng)建客體的進程的用戶標識符灵临,它們在訪問控制上沒什么作用。
標準Linux安全中的用戶ID和安全上下文中的用戶標識符之間的區(qū)別趴荸,就技術而論儒溉,它們是正交標識符,分別用于標準的和安全增強的訪問控制機制发钝,這兩者之間的任一相互關聯(lián)都是通過登陸進程按照規(guī)范嚴格規(guī)定的顿涣,而不是通過SELinux策略直接強制實施的波闹。
6.1.1 USER
1-user identity:類似Linux系統(tǒng)中的UID,提供身份識別涛碑,用來記錄身份舔痪;安全上下文的一部分;
2- 三種常見的 user:
? user_u :普通用戶登錄系統(tǒng)后的預設锌唾;
? system_u :開機過程中系統(tǒng)進程的預設锄码;
? root :root 登錄后的預設
3- 在 targeted policy 中 users 不是很重要;
4-在strict policy 中比較重要晌涕,所有預設的 SELinux Users 都是以 “_u” 結尾的滋捶,root 除外。
6.1.2 ROLE
1-文件余黎、目錄和設備的role:通常是 object_r重窟;
2- 程序的role:通常是 system_r;
3-用戶的role:targeted policy為system_r惧财; strict policy為sysadm_r巡扇、staff_r、user_r垮衷;用戶的role厅翔,類似系統(tǒng)中的GID,不同角色具備不同的的權限搀突;用戶可以具備多個role刀闷;但是同一時間內(nèi)只能使用一個role;
4- 使用基于RBAC(Roles Based Access Control) 的strict和mls策略中,用來存儲角色信息
6.1.3 TYPE
1-type:用來將主體(subject)和客體(object)劃分為不同的組仰迁,給每個主體和系統(tǒng)中的客體定義了一個類型甸昏;為進程運行提供最低的權限環(huán)境;
2- 當一個類型與執(zhí)行中的進程相關聯(lián)時徐许,其type也稱為domain施蜜;
3- type是SElinux security context 中最重要的部位,是 SELinux Type Enforcement 的心臟雌隅,預設值以_t結尾翻默;
LEVEL和CATEGORY:定義層次和分類,只用于mls策略中
? LEVEL:代表安全等級,目前已經(jīng)定義的安全等級為s0-s15,等級越來越高
? CATEGORY:代表分類澄步,目前已經(jīng)定義的分類為c0-c1023
6.2 對比SELinux和標準Linux的訪問控制屬性
在標準Linux中冰蘑,主體的訪問控制屬性是與進程通過在內(nèi)核中的進程結構關聯(lián)的真實有效的用戶和組ID和泌,這些屬性通過內(nèi)核利用大量工具進行保護村缸,包括登陸進程和setuid程序,對于客體(如文件)武氓,文件的inode包括一套訪問模式位梯皿、文件用戶和組ID仇箱。以前的訪問控制基于讀/寫/執(zhí)行這三個控制位,文件所有者东羹、文件所有者所屬組剂桥、其他人各一套。
在SELinux中属提,訪問控制屬性總是安全上下文三人組(用戶:角色:類型)形式权逗,所有客體和主體都有一個關聯(lián)的安全上下文。需要特別指出的是冤议,因為SELinux的主要訪問控制特性是類型強制斟薇,安全上下文中的類型標識符決定了訪問權。
注意:SELinux是在標準Linux基礎上增加了類型強制(TE: Type Enforcement)恕酸,這就意味著標準Linux和SELinux訪問控制都必須滿足先要能訪問一個客體堪滨,例如:如果我們對某個文件有SELinux寫入權限,但我們沒有該文件的w許可蕊温,那么我們也不能寫該文件袱箱。下表總結了標準Linux和SELinux之間訪問控制屬性的對比:
標準Linux
SELInux
進程安全屬性
真實有效的用戶和組ID
安全上下文
客體安全屬性
訪問模式、文件用戶和組ID
安全上下文
訪問控制基礎
進程用戶/組ID和文件的訪問模式义矛,
此訪問模式基于文件的用戶/組ID
在進程類型和文件類型
之間允許的許可
6.3 小結
1- 系統(tǒng)中每個文件发笔、目錄、網(wǎng)絡端口等都被指定一個安全上下文凉翻,policy 則給出各安全上下文之間的作用規(guī)則筐咧。
2-SELinux根據(jù)policy及security context規(guī)則來決定存取行為是否可執(zhí)行;
3-Subject(主體):系統(tǒng)進程噪矛,比如/usr/sbin/httpd量蕊;
4-Object(客體):被存取的項目,比如File艇挨、Directory残炮、IP、Socket等缩滨;
7. 類型強制(TE)訪問控制
在SELinux中势就,所有訪問都必須明確授權,SELinux默認不允許任何訪問脉漏,不管Linux用戶/組ID是什么苞冯。這就意味著在SELinux中,沒有默認的超級用戶了侧巨,與標準Linux中的root不一樣舅锄,通過指定主體類型(即域)和客體類型使用allow規(guī)則授予訪問權限,allow規(guī)則由四部分組成:
? 源類型(Source type(s) ) 通常是嘗試訪問的進程的域類型
? 目標類型(Target type(s) ) 被進程訪問的客體的類型
? 客體類別(Object class(es)) 指定允許訪問的客體的類型
? 許可(Permission(s)) 象征目標類型允許源類型訪問客體類型的訪問種類
舉例如下:
allow user_t bin_t : file {read execute getattr};
這個例子顯示了TE allow規(guī)則的基礎語法司忱,這個規(guī)則包含了兩個類型標識符:源類型(或主體類型或域)user_t皇忿,目標類型(或客體類型)bin_t畴蹭。標識符file是定義在策略中的客體類別名稱(在這里,表示一個普通的文件)鳍烁,大括號中包括的許可是文件客體類別有效許可的一個子集叨襟,這個規(guī)則解釋如下:
擁有域類型user_t的進程可以讀/執(zhí)行或獲取具有bin_t類型的文件客體的屬性。
SELinux allow規(guī)則如之前的例子在SELinux中實際上都是授予訪問權的幔荒,真正的挑戰(zhàn)是如何保證數(shù)以萬計的訪問正確授權糊闽,只授予必須的權限,實現(xiàn)盡可能的安全爹梁。
7.1 標準Linux安全中的setuid程序
精通用戶joe想安全地修改現(xiàn)有的密碼問題墓怀,Linux解決這個問題的方法是通過給passwd賦一個setuid值,使其執(zhí)行時具有root權限卫键,如果你在一個普通Linux系統(tǒng)上列出密碼文件傀履,你看到的會是:
# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 41292 Sep 7 2012 /usr/bin/passwd
這里注意兩件事,第一個是在所有者權限的x位置被設置為s了莉炉,這就是所謂的setuid位钓账,意思是任何執(zhí)行這個文件的進程,它的有效UID(即用戶ID)將會被改為文件所有者絮宁。這里梆暮,root是文件所有者,因此當執(zhí)行密碼程序時實際上將會以root用戶的ID運行绍昂。其執(zhí)行過程如下圖所示
從上面的分析中可以看出啦粹,passwd以root權限的身份運行, 它可以訪問系統(tǒng)的任何資源窘游,這給系統(tǒng)帶來了安全問題唠椭,其實它只需要訪問shadow及其相關的文件就可以了。而且shadow只需要接受passwd的訪問即可忍饰。這在標準Linux中是無法做到的贪嫂,而TE(類型強制)可實現(xiàn)此功能。
8. 基于角色的訪問控制
SELinux也提供了一種基于角色的訪問控制(RBAC)艾蓝,SELinux的RBAC特性是依靠類型強制建立的力崇,SELinux中的訪問控制主要是通過類型實現(xiàn)的,角色基于進程安全上下文中的角色標識符限制進程可以轉(zhuǎn)變的類型赢织,如此亮靴,策略編寫器可以創(chuàng)建一個角色,允許它轉(zhuǎn)變?yōu)橐惶子蝾愋停僭O類型強制規(guī)則允許轉(zhuǎn)變)于置,從而定義角色的限制茧吊。
9. SELinux中的多級安全(Multi-Level Security)
類型強制(Type Enforcement)無疑是SELinux引入的最重要的強制訪問控制(MAC)機制,然而,在某些情況下饱狂,主要是保密控制應用程序的一個子集,傳統(tǒng)的多級安全(MLS)MAC與類型強制一起使用顯得更有價值宪彩,在這些情況下休讳,SELinux總是包括某種格式的MLS功能,MLS特性是可選的尿孔,在SELinux的兩個MAC機制中俊柔,它通常不是最重要的那個,對大多數(shù)安全應用程序而言活合,包括許多非保密數(shù)據(jù)應用程序雏婶,類型強制是最適合的安全增強的機制,盡管如此白指,MLS對部分應用程序還是增強了安全性留晚。
在大多數(shù)SELinux策略中,敏感度(s0告嘲,s1错维,...)和范疇(c0,c1橄唬,...)使用通配名赋焕,將它留給用戶空間程序和程序庫,以指定有意義的用戶名仰楚。(例如:s0可能與UNCLASSIFIED 關聯(lián)隆判,s1可能與SECRET關聯(lián))
為了支持MLS,安全上下文被擴展了僧界,包括了安全級別侨嘀,如:
user:role:type:sensitivity[:category,...] [-sensitivity[:category,...]]
root@luohj-virtual-machine:~# ps -aZ
LABEL PID TTY TIME CMD
unconfined_u:system_r:insmod_t:s0-s0:c0.c255 4940 pts/0 00:00:00 passwd
注意MLS安全上下文至少必須有一個安全級別(它由單個敏感度和0個或多個范疇組成),但可以包括兩個安全級別捂襟,這兩個安全級別分別被叫做低(或進程趨勢)和高(或進程間隙)飒炎,如果高安全級別丟失,它會被認為與低安全級別的值是相同的(最常見的情況)笆豁,實際上郎汪,對于客體和進程而言,低和高安全級別通常都是相同的闯狱,通常用于進程的級別范圍被認為是受信任的主體(即進程信任降級信息)或多層客體煞赢,如一個目錄,它又包括了不同安全級別的客體哄孤。為了使描述簡單照筑,假設所有的進程和客體都只有一個安全級別。
10. 策略分析工具apol
apol(即analyze policy【分析策略】)工具是一個成熟的SELinux策略分析工具,它位于setools工具包中凝危。使用它打開policy.xx文件即可分析所有的相關策略波俄。xx為策略編譯器(checkpolicy)的版本號。
11. 小結
SELinux訪問控制是基于與所有系統(tǒng)資源(包括進程)關聯(lián)的安全上下文的蛾默,安全上下文包括三個組件:用戶懦铺、角色和類型標識符。類型標識符是訪問控制的主要基礎支鸡。
在SELinux中冬念,訪問控制的主要特性是類型強制,在主體(即進程)與客體之間通過指定allow規(guī)則(主體的類型【也叫做域類型】是源牧挣,客體的類型是目標)進行訪問授權急前,訪問被授予特定的客體類別,為每個客體類別設置細粒度的許可瀑构。
類型強制的一個關鍵優(yōu)勢是它可以控制哪個程序可能運行在給定的域類型上裆针,因此,它允許對單個程序進行訪問控制(比起用戶級的安全控制要安全得多了)寺晌,使程序進入另一個域(即以一個給定的進程類型運行)叫做域轉(zhuǎn)變据块,它是通過SELinux的allow規(guī)則緊密控制的,SELinux也允許通過type_transition 文件使域轉(zhuǎn)變自動發(fā)生折剃。
SELinux在訪問控制安全上下文中不直接使用角色標識符另假,相反,所有的訪問都是基于類型的怕犁,角色用于關聯(lián)允許的域類型边篮,這樣可以設置類型強制允許的功能組合到一起,將用戶作為一個角色進行認證奏甫。
SELinux提供了一個可選的MLS訪問控制機制戈轿,它提供了更多的訪問限制,MLS特性依靠TE機制建立起來的阵子,MLS擴展了安全上下文的內(nèi)容思杯,包括了一個當前的(或低)安全級別和一個可選的高安全級別。