SELinux帶給Linux的主要價值是:提供了一個靈活的,可配置的MAC機制。node
Security-Enhanced Linux (SELinux)由如下兩部分組成:linux
1) Kernel SELinux模塊(/kernel/security/selinux)shell
2) 用戶態工具數據庫
SELinux是一個安全體系結構,它經過LSM(Linux Security Modules)框架被集成到Linux Kernel 2.6.x中。它是NSA (United States National Security Agency)和SELinux社區的聯合項目。緩存
SELinux提供了一種靈活的強制訪問控制(MAC)系統,且內嵌於Linux Kernel中。SELinux定義了系統中每一個【用戶】、【進程】、【應用】和【文件】的訪問和轉變的權限,而後它使用一個安全策略來控制這些實體(用戶、進程、應用和文件)之間的交互,安全策略指定如何嚴格或寬鬆地進行檢查。安全
SELinux對系統用戶(system users)是透明的,只有系統管理員須要考慮在他的服務器中如何制定嚴格的策略。策略能夠根據須要是嚴格的或寬鬆的。服務器
只有同時知足了【標準Linux訪問控制】和【SELinux訪問控制】時,主體才能訪問客體。網絡
安 全加強型Linux(SELinux)開始是由NSA(國家安全局)啓動並加入到Linux系統中的一套核心組件及用戶工具,可讓應用程序運行在其所需的最低權限上。未 經修改過的Linux系統是使用自主訪問控制的,用戶能夠本身請求更高的權限,由此惡意軟件幾乎能夠訪問任何它想訪問的文件,而若是你授予其root權 限,那它就無所不能了。框架
在SELinux中沒有root這個概念,安全策略是由管理員來定義的,任何軟件都沒法取代它。這意味着那些潛在的惡意軟件所能形成的損害能夠被控制在最小。通常狀況下只有很是注重數據安全的企業級用戶纔會使用SELinux。 dom
操做系統有兩類訪問控制:自主訪問控制(DAC)和強制訪問控制(MAC)。標準Linux安全是一種DAC,SELinux爲Linux增長了一個靈活的和可配置的的MAC。
全部DAC機制都有一個共同的弱點,就是它們不能識別天然人與計算機程序之間最基本的區別。簡單點說就是,若是一個用戶被受權容許訪問,意味着程序也被受權訪問,若是程序被受權訪問,那麼惡意程序也將有一樣的訪問權。 DAC最根本的弱點是主體容易受到多種多樣的惡意軟件的攻擊,MAC就是避免這些攻擊的出路,大多數MAC特性組成了多層安全模型。
SELinux實現了一個更靈活的MAC形式,叫作類型強制(Type Enforcement)和一個非強制的多層安全形式(Multi-Level Security)。
在Android4.2中,SELinux是個可選項,谷歌並無直接取消root權限或其餘功能。這是一個爲企業級用戶或是對隱私數據極爲重視的用戶提供的選項,普通消費者則徹底能夠關閉它。
SELinux決策過程以下圖所示:
當一個subject(如: 一個應用)試圖訪問一個object(如:一個文件),Kernel中的策略執行服務器將檢查AVC (Access Vector Cache), 在AVC中,subject和object的權限被緩存(cached)。若是基於AVC中的數據不能作出決定,則請求安全服務器,安全服務器在一個矩陣中查找「應用+文件」的安全環境。而後根據查詢結果容許或拒絕訪問,拒絕消息細節位於/var/log/messages中。
/selinux/僞文件系統kernel子系統一般使用的命令,它相似於/proc/僞文件系統。系統管理員和用戶不須要操做這部分。/selinux/目錄舉例以下:
[cpp] view plaincopy
如cat enforce其值可能以下:
1: enforcing mode
0: permissive mode
SELinux配置文件(configuration)或策略文件(policy)位於/etc/目錄下。
/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) 設置系統執行哪個策略(policy)
3) 設置系統如何執行策略(policy)
SELINUX=enforcing|permissive|disabled —定義SELinux的高級狀態
• 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.
SELINUXTYPE=targeted|strict — 指定SELinux執行哪個策略
• targeted — 只有目標網絡daemons保護。每一個daemon是否執行策略,可經過system-config-selinux進行配置。保護常見的網絡服務,爲SELinux默認值。
可以使用以下工具設置每一個daemon的布爾值:
1) getsebool -a: 列出SELinux的全部布爾值
2) setsebool: 設置SELinux布爾值,如:setsebool -P dhcpd_disable_trans=0,-P表示即便用reboot以後,仍然有效。
• strict — 對SELinux執行徹底的保護。爲全部的subjects和objects定義安全環境,且每個Action由策略執行服務器處理。提供符合Role-based-Access Control(RBAC)之policy,具有完整的保護功能,保護網絡服務、通常指令及應用程序。
• 1:這些定義由load_policy控制,load_policy來自於文件/etc/selinux/<policyname>
• 0:由semanage控制
[cpp] view plaincopy
1) /usr/sbin/setenforce — 修改SELinux運行模式,例子以下:
• setenforce 1 — SELinux以強制(enforcing)模式運行
• setenforce 0 — SELinux以警告(permissive)模式運行
爲了關閉SELinux,你能夠修改配置文件:/etc/selinux/config或/etc/sysconfig/selinux
2) /usr/sbin/sestatus -v — 顯示系統的詳細狀態,例子以下:
[cpp] view plaincopy
3) /usr/bin/newrole — 在一個新的context或role中運行一個新的shell
4) /sbin/restorecon — 經過爲適當的文件或安全環境標記擴展屬性,設置一個或多個文件的安全環境
5) /sbin/fixfiles — 檢查或校訂文件系統中的安全環境數據庫
6) getsebool — getsebool -a:查看全部布爾值
7) setsebool — 參數-P,永久性設置
8) chcon 修改文件、目錄的安全上下文
chcon –u[user]
chcon –r[role]
chcon –t[type]
chcon –R 遞歸
安全上下文是一個簡單的、一致的訪問控制屬性,在SELinux中,類型標識符是安全上下文的主要組成部分,因爲歷史緣由,一個進程的類型一般被稱爲一個域(domain),"域"和"域類型"意思都同樣,咱們沒必要苛刻地去區分或避免使用術語域,一般,咱們認爲【域】、【域類型】、【主體類型】和【進程類型】都是同義的,即都是安全上下文中的「TYPE」。
SELinux對系統中的許多命令作了修改,經過添加一個-Z選項顯示客體和主體的安全上下文。
1) 系統根據PAM子系統中的pam_selinux.so模塊設定登陸者運行程序的安全上下文;
2) 文件的Security Contex規則以下:
• rpm包安裝的:會根據rpm包內記錄來生成安全上下文;
• 手動建立的文件:會根據policy中規定的來設置安全上下文;
• cp:會從新生成安全上下文;
• mv:安全上下文則不變。
3) id -Z
顯示了你的shell的安全上下文;
4) ps -Z
檢查進程的安全上下文;
5) ls -Z
檢查文件、目錄的安全上下文;
全部操做系統訪問控制都是以關聯的客體和主體的某種類型的訪問控制屬性爲基礎的。在SELinux中,訪問控制屬性叫作安全上下文。全部客體(文件、進程間通信通道、套接字、網絡主機等)和主體(進程)都有與其關聯的安全上下文,一個安全上下文由三部分組成:用戶、角色和類型標識符。經常用下面的格式指定或顯示安全上下文:
USER:ROLE:TYPE[LEVEL[:CATEGORY]]
安全上下文中的用戶和角色標識符除了對強制有一點約束以外對類型強制訪問控制策略沒什麼影響,對於進程,用戶和角色標識符顯得更有意義,由於它們是用於控制類型和用戶標識符的聯合體,這樣就會與Linux用戶帳號關聯起來;然而,對於客體,用戶和角色標識符幾乎不多使用,爲了規範管理,客體的角色經常是object_r,客體的用戶經常是建立客體的進程的用戶標識符,它們在訪問控制上沒什麼做用。
標準Linux安全中的用戶ID和安全上下文中的用戶標識符之間的區別,就技術而論,它們是正交標識符,分別用於標準的和安全加強的訪問控制機制,這二者之間的任一相互關聯都是經過登錄進程按照規範嚴格規定的,而不是經過SELinux策略直接強制實施的。
1) user identity:相似Linux系統中的UID,提供身份識別,用來記錄身份;安全上下文的一部分;
2) 三種常見的 user:
• user_u :普通用戶登陸系統後的預設;
• system_u :開機過程當中系統進程的預設;
• root :root 登陸後的預設;
3) 在 targeted policy 中 users 不是很重要;
4) 在strict policy 中比較重要,全部預設的 SELinux Users 都是以 「_u」 結尾的,root 除外。
1) 文件、目錄和設備的role:一般是 object_r;
2) 程序的role:一般是 system_r;
3) 用戶的role:targeted policy爲system_r; strict policy爲sysadm_r、staff_r、user_r;用戶的role,相似系統中的GID,不一樣角色具有不一樣的的權限;用戶能夠具有多個role;可是同一時間內只能使用一個role;
4) 使用基於RBAC(Roles Based Access Control) 的strict和mls策略中,用來存儲角色信息
1) type:用來將主體(subject)和客體(object)劃分爲不一樣的組,給每一個主體和系統中的客體定義了一個類型;爲進程運行提供最低的權限環境;
2) 當一個類型與執行中的進程相關聯時,其type也稱爲domain;
3) type是SElinux security context 中最重要的部位,是 SELinux Type Enforcement 的心臟,預設值以_t結尾;
LEVEL和CATEGORY:定義層次和分類,只用於mls策略中
• LEVEL:表明安全等級,目前已經定義的安全等級爲s0-s15,等級愈來愈高
• CATEGORY:表明分類,目前已經定義的分類爲c0-c1023
在標準Linux中,主體的訪問控制屬性是與進程經過在內核中的進程結構關聯的真實有效的用戶和組ID,這些屬性經過內核利用大量工具進行保護,包括登錄進程和setuid程序,對於客體(如文件),文件的inode包括一套訪問模式位、文件用戶和組ID。之前的訪問控制基於讀/寫/執行這三個控制位,文件全部者、文件全部者所屬組、其餘人各一套。
在SELinux中,訪問控制屬性老是安全上下文三人組(用戶:角色:類型)形式,全部客體和主體都有一個關聯的安全上下文。須要特別指出的是,由於SELinux的主要訪問控制特性是類型強制,安全上下文中的類型標識符決定了訪問權。
注意:SELinux是在標準Linux基礎上增長了類型強制(TE: Type Enforcement),這就意味着標準Linux和SELinux訪問控制都必須知足先要能訪問一個客體,例如:若是咱們對某個文件有SELinux寫入權限,但咱們沒有該文件的w許可,那麼咱們也不能寫該文件。下表總結了標準Linux和SELinux之間訪問控制屬性的對比:
標準Linux
SELInux
進程安全屬性
真實有效的用戶和組ID
安全上下文
客體安全屬性
訪問模式、文件用戶和組ID
安全上下文
訪問控制基礎
進程用戶/組ID和文件的訪問模式,
此訪問模式基於文件的用戶/組ID
在進程類型和文件類型
之間容許的許可
1) 系統中每一個文件、目錄、網絡端口等都被指定一個安全上下文,policy 則給出各安全上下文之間的做用規則。
2) SELinux根據policy及security context規則來決定存取行爲是否可執行;
3) Subject(主體):系統進程,好比/usr/sbin/httpd;
4) Object(客體):被存取的項目,好比File、Directory、IP、Socket等;
• 源類型(Source type(s) ) 一般是嘗試訪問的進程的域類型
• 目標類型(Target type(s) ) 被進程訪問的客體的類型
• 客體類別(Object class(es)) 指定容許訪問的客體的類型
• 許可(Permission(s)) 象徵目標類型容許源類型訪問客體類型的訪問種類
舉例以下:
[cpp] view plaincopy
這個例子顯示了TE allow規則的基礎語法,這個規則包含了兩個類型標識符:源類型(或主體類型或域)user_t,目標類型(或客體類型)bin_t。標識符file是定義在策略中的客體類別名稱(在這裏,表示一個普通的文件),大括號中包括的許但是文件客體類別有效許可的一個子集,這個規則解釋以下:
擁有域類型user_t的進程能夠讀/執行或獲取具備bin_t類型的文件客體的屬性。
SELinux allow規則如以前的例子在SELinux中實際上都是授予訪問權的,真正的挑戰是如何保證數以萬計的訪問正確受權,只授予必須的權限,實現儘量的安全。
精通用戶joe想安全地修改現有的密碼問題,Linux解決這個問題的方法是經過給passwd賦一個setuid值,使其執行時具備root權限,若是你在一個普通Linux系統上列出密碼文件,你看到的會是:
[cpp] view plaincopy
這裏注意兩件事,第一個是在全部者權限的x位置被設置爲s了,這就是所謂的setuid位,意思是任何執行這個文件的進程,它的有效UID(即用戶ID)將會被改成文件全部者。這裏,root是文件全部者,所以當執行密碼程序時實際上將會以root用戶的ID運行。其執行過程以下圖所示:
從上面的分析中能夠看出,passwd以root權限的身份運行, 它能夠訪問系統的任何資源,這給系統帶來了安全問題,其實它只須要訪問shadow及其相關的文件就能夠了。並且shadow只須要接受passwd的訪問便可。這在標準Linux中是沒法作到的,而TE(類型強制)可實現此功能。
類型強制(Type Enforcement)無疑是SELinux引入的最重要的強制訪問控制(MAC)機制,然而,在某些狀況下,主要是保密控制應用程序的一個子集,傳統的多級安全(MLS)MAC與類型強制一塊兒使用顯得更有價值,在這些狀況下,SELinux老是包括某種格式的MLS功能,MLS特性是可選的,在SELinux的兩個MAC機制中,它一般不是最重要的那個,對大多數安全應用程序而言,包括許多非保密數據應用程序,類型強制是最適合的安全加強的機制,儘管如此,MLS對部分應用程序仍是加強了安全性。
在大多數SELinux策略中,敏感度(s0,s1,...)和範疇(c0,c1,...)使用通配名,將它留給用戶空間程序和程序庫,以指定有意義的用戶名。(例如:s0可能與UNCLASSIFIED 關聯,s1可能與SECRET關聯)
爲了支持MLS,安全上下文被擴展了,包括了安全級別,如:
[cpp] view plaincopy
例子以下所示:
[cpp] view plaincopy
注意MLS安全上下文至少必須有一個安全級別(它由單個敏感度和0個或多個範疇組成),但能夠包括兩個安全級別,這兩個安全級別分別被叫作低(或進程趨勢)和高(或進程間隙),若是高安全級別丟失,它會被認爲與低安全級別的值是相同的(最多見的狀況),實際上,對於客體和進程而言,低和高安全級別一般都是相同的,一般用於進程的級別範圍被認爲是受信任的主體(即進程信任降級信息)或多層客體,如一個目錄,它又包括了不一樣安全級別的客體。爲了使描述簡單,假設全部的進程和客體都只有一個安全級別。
apol(即analyze policy【分析策略】)工具是一個成熟的SELinux策略分析工具,它位於setools工具包中。使用它打開policy.xx文件便可分析全部的相關策略。xx爲策略編譯器(checkpolicy)的版本號。
SELinux訪問控制是基於與全部系統資源(包括進程)關聯的安全上下文的,安全上下文包括三個組件:用戶、角色和類型標識符。類型標識符是訪問控制的主要基礎。
在SELinux中,訪問控制的主要特性是類型強制,在主體(即進程)與客體之間經過指定allow規則(主體的類型【也叫作域類型】是源,客體的類型是目標)進行訪問受權,訪問被授予特定的客體類別,爲每一個客體類別設置細粒度的許可。
類型強制的一個關鍵優點是它能夠控制哪一個程序可能運行在給定的域類型上,所以,它容許對單個程序進行訪問控制(比起用戶級的安全控制要安全得多了),使程序進入另外一個域(即以一個給定的進程類型運行)叫作域轉變,它是經過SELinux的allow規則緊密控制的,SELinux也容許經過type_transition 文件使域轉變自動發生。
SELinux在訪問控制安全上下文中不直接使用角色標識符,相反,全部的訪問都是基於類型的,角色用於關聯容許的域類型,這樣能夠設置類型強制容許的功能組合到一塊兒,將用戶做爲一個角色進行認證。
SELinux提供了一個可選的MLS訪問控制機制,它提供了更多的訪問限制,MLS特性依靠TE機制創建起來的,MLS擴展了安全上下文的內容,包括了一個當前的(或低)安全級別和一個可選的高安全級別。