1. 程式人生 > >SELinux——概述及基本操作命令

SELinux——概述及基本操作命令

SELinux Sandbox

SELinux

基本概述:
SELinux(Security-Enhanced Linux) 是美國國家安全局(NSA)對於強制訪問控制的實現,是 Linux歷史上最傑出的新安全子系統。NSA是在Linux社區的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,進程只能訪問那些在他的任務中所需要文件。SELinux 默認安裝在 Fedora 和 Red Hat Enterprise Linux 上,也可以作為其他發行版上容易安裝的包得到。
SELinux 是 2.6 版本的 Linux 內核中提供的強制訪問控制(MAC)系統。對於目前可用的 Linux安全模塊來說,SELinux 是功能最全面,而且測試最充分的,它是在 20 年的 MAC 研究基礎上建立的。SELinux 在類型強制服務器中合並了多級安全性或一種可選的多類策略,並采用了基於角色的訪問控制概念。 [1]

大部分使用 SELinux 的人使用的都是 SELinux 就緒的發行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian或 Centos。它們都是在內核中啟用 SELinux 的,並且提供一個可定制的安全策略,還提供很多用戶層的庫和工具,它們都可以使用 SELinux 的功能。
SELinux是一種基於 域-類型 模型(domain-type)的強制訪問控制(MAC)安全系統,它由NSA編寫並設計成內核模塊包含到內核中,相應的某些安全相關的應用也被打了SELinux的補丁,最後還有一個相應的安全策略。任何程序對其資源享有完全的控制權。假設某個程序打算把含有潛在重要信息的文件扔到/tmp目錄下,那麽在DAC情況下沒人能阻止他。SELinux提供了比傳統的UNIX權限更好的訪問控制。

SELinux中的訪問控制機制:
DAC:Discretionary Access Control,自主訪問控制:
基於文件或數據被文件系統賦予的訪問權限(r,w,x)的方式實現的訪問控制機制;

MAC:Mandatory Access Control,強制訪問控制:
對於文件或數據的訪問權限不是針對用戶身份來設定,當某個用戶發起某個進程之後,該進程是否能夠操縱或處理此文件或數據,取決於進程和文件是否具備可以匹配的domain和type;SELinux就是MAC訪問控制機制在Linux系統中的實現;

SELinux在Linux內核中的組件功能:
RHEL 4.0:測試性的加入了SELinux安全組件;

RHEL 5.0:在安全操作系統時強制安裝此組件,但可以在安裝時選擇關閉相應功能;
RHEL 6.0+:在安裝操作系統時強制安裝此組件,且在系統啟動之後自動啟動其功能;
SELinux依賴於安全策略結果進行相應的訪問控制管理,策略結果已知的有三種:
strict:對於每個文件都有嚴格的規定其類型,對於每個進程都要設定特定的域,進程的域和文件的類型必須嚴格匹配,才能允許進程訪問此文件;
mls:multi-level security,多級安全策略結果集;
targeted:僅對有限個進程進行SELinux的強制訪問控制管控;只要進程的域和文件的類型屬於某同一大類,就可以匹配,就可以允許進程訪問文件;在RHEL系操作系統中為此策略結果;
所有有限個進程,指的是那些容易被入侵並且會對系統造成安全隱患的進程;

Sandbox:
概述:
在計算機安全領域,沙盒(英語:sandbox,又譯為沙箱)是一種安全機制,為執行中的程式提供的隔離環境。通常是作為一些來源不可信、具破壞力或無法判定程序意圖的程序提供實驗之用。
沙盒通常嚴格控制其中的程序所能訪問的資源,比如,沙盒可以提供用後即回收的磁盤及內存空間。在沙盒中,網絡訪問、對真實系統的訪問、對輸入設備的讀取通常被禁止或是嚴格限制。從這個角度來說,沙盒屬於虛擬化的一種。
沙盒中的所有改動對操作系統不會造成任何損失。通常,這種技術被計算機技術人員廣泛用於測試可能帶毒的程序或是其他的惡意代碼。
具體實現
沙盒將軟件運行於一個受限的系統環境中,控制程序可使用的資源(如文件描述符、內存、磁盤空間等)。
以下是一些沙盒的具體實現:
軟件監獄(Jail):限制網絡訪問、受限的文件系統命名空間。軟件監獄最常用於虛擬主機上[4]。基於規則的執行:通過系統安全機制,按照一系列預設規則給用戶及程序分配一定的訪問權限,完全控制程序的啟動、代碼註入及網絡訪問[5]。也可控制程序對於文件、註冊表的訪問。在這樣的環境中,病毒木馬感染系統的幾率將會減小。Linux中,安全增強式Linux和AppArmor正使用了這種策略。虛擬機:模擬一個完整的宿主系統,可以如運行於真實硬件一般運行虛擬的操作系統(客戶系統)。客戶系統只能通過模擬器訪問宿主的資源,因此可算作一種沙盒。主機本地沙盒:安全研究人員十分依賴沙盒技術來分析惡意軟件的行為。通過創建一個模擬真實桌面的環境,研究人員就能夠觀察惡意軟件是如何感染一臺主機的。若幹惡意軟件分析服務使用了沙盒技術[6]。在線判題系統:用於編程競賽中的程序測試。安全計算模式(seccomp)(英語:seccomp):Linux內核內置的一個沙盒。啟用後,seccomp僅允許write()、read()、exit()和sigreturn()這幾個系統調用。

在Linux系統中,進程是能夠完成真實操作的實體:
subject, action(operation), object
subject:進程
action(operation):open, close, read, write, modify, delete, chmod, chown, ...
object:文件,進程,套接字,鏈接,...
SELinux為每個文件提供了一套安全標簽,也為每個進程提供了一套安全標簽,這些安全標簽可以稱為SELinux的安全上下文(security context);
user-identify:role:domain|type:sencitivity

user-identify:SELinux的用戶身份標識,通常指用戶的類型;

role:角色

domain|type:進程的域或文件的類型;

sencitivity:敏感度;

註意:在targeted策略結果集中,僅關心進程的domain和文件的type能否匹配,與其他的安全上下文標識沒有關系;

SELinux的策略庫:
規則庫:存放規則
規則:進程的哪個域可以以哪種方式訪問或操縱哪些類型的文件;存放於/etc/selinux/targeted/policy目錄中;
/etc/sysconfig/selinux文件中定義了SELinux的工作模式和使用的策略結果集;
SELINUX=enforcing
SELINUXTYPE=targeted

SELinux的工作模式:
enforcing - SELinux security policy is enforced.
permissive - SELinux prints warnings instead of enforcing.
disabled - No SELinux policy is loaded.

註意:
1.凡是從enforcing或permissive模式切換至disabled模式,或者從disabled模式切換至enforcing或permissive模式,都必須經過操作系統的重新引導才能生效;
2.從enforcing模式到permissive模式的切換,可以直接使用命令行工具完成且立即生效;

轉換命令:
setenforce命令:
setenforce - modify the mode SELinux is running in.

setenforce [ Enforcing | Permissive | 1 | 0 ]
                        1:Enforcing
                        0:Permissive

getenforce命令:
    getenforce - get the current mode of SELinux

註意:使用setenforce命令修改的SELinux的工作模式會立即生效,但並非永久有效;如果想要使被修改的SELinux的工作模式永久有效,則需要修改/etc/sysconfig/selinux文件中的SELINUX參數的值,並重新引導操作系統;

基本命令:
查看進程或文件的SELinux的安全上下文:
文件安全上下文查看:
ls -Z|--context [file]

    進程安全上下文查看:
        ps auxZ
        ps -efZ

修改文件的安全上下文:
    chcon命令:
        chcon - change file SELinux security context

        -t, --type=TYPE:直接設置目標文件的類型;
        -R, --recursive:遞歸地修改目錄中所有文件,包括子目錄中的文件;
        --reference=RFILE:參考RFILE所代表的文件的安全上下文,為目標文件設置完全相同的安全上下文;

        使用場景:
            通常在進程的安全上下文與文件的安全上下文類型不相符合或不能匹配的時候使用;

            如:設置httpd虛擬主機對應的文檔根目錄的安全上下文;

    restorcon命令:
        restorecon - restore file(s) default SELinux security contexts.

        -R, -r:遞歸修改指定目錄及其子目錄的安全上下文為默認值;

查看或修改策略中的內容:
    getsebool命令:
        getsebool - get SELinux boolean value(s)

        -a:Show all SELinux booleans.

    setsebool命令:
        setsebool - set SELinux boolean value

        -P:If the -P option is given, all pending values are written to the policy file  on disk. So they will be persistent across reboots.

    使用場景:支持二進制策略修改的系統服務;
        vsftpd的匿名用戶的上傳功能被SELinux限制的場景:
            ~]# setsebool -P ftpd_anon_write on
            ~]# setsebool -P ftpd_full_access=1

samba服務中samba用戶訪問自己的家目錄的共享結果被SELinux限制的場景:
            ~]# setsebool -P samba_enable_home_dirs on

samba服務中共享的目錄是由管理員自行創建並指定的:
            chcon -t samba_share_t /path/to/directory

    semanage命令:
        semanage - SELinux Policy Management tool
            註意:如果沒有此命令,需要安裝policycoreutils-python程序包即可;

    semanage port命令:
        -a, --add
                    Add a record of the specified object type

        -d, --delete
                    Delete a record of the specified object type

        -m, --modify
                    Modify a record of the specified object type

        -l, --list
    List records of the specified object type

示例:
~]# semanage port -a -t http_port_t -p tcp 8088

SELinux的優缺點:

缺點:
雖然Linux比起 Windows來說,它的可靠性,穩定性要好得多,但是他也是和其他的UNIX 一樣,有以下這些不足之處。
存在特權用戶root
任何人只要得到root的權限,對於整個系統都可以為所欲為。這一點Windows也一樣。
對於文件的訪問權的劃分不夠細
在linux系統裏,對於文件的操作,只有「所有者」,「所有組」,「其他」這3類的劃分。
對於「其他」這一類裏的用戶再細細的劃分的話就沒有辦法了。
SUID程序的權限升級
如果設置了SUID權限的程序有了漏洞的話,很容易被攻擊者所利用。
DAC(Discretionary Access Control)問題
文件目錄的所有者可以對文件進行所有的操作,這給系統整體的管理帶來不便。
對於以上這些的不足,防火墻,入侵檢測系統都是無能為力的。
在這種背景下,對於訪問權限大幅度強化的SELinux來說,它的魅力
SELinux系統比起通常的Linux系統來,安全性能要高的多,它通過對於用戶,進程權限的最小化,即使受到攻擊,進程或者用戶權限被奪去,也不會對整個系統造成重大影響。
SELinux的一些優點。
對訪問的控制徹底化
特點1:MAC(Mandatory Access Control)―――對訪問的控制徹底化
對於所有的文件,目錄,端口這類的資源的訪問,都可以是基於策略設定的,這些策略是由管理員定制的、一般用戶是沒有權限更改的。
對於進程只賦予最小的權限
特點2:TE (Type Enforcement)――― 對於進程只賦予最小的權限
Te概念在 SELinux裏非常的重要。它的特點是對所有的文件都賦予一個叫type的文件類型標簽,對於所有的進程也賦予各自的一個叫 domain的 標簽。Domain標簽能夠執行的操作也是由access vector在策略裏定好的。
我們熟悉的apache服務器,httpd進程只能在httpd_t 裏運行,這個httpd_t 的domain能執行的操作,比如能讀網頁內容文件賦予httpd_sys_content_t,密碼文件賦予shadow_t,TCP的80端口賦予 http_port_t等等。如果在access vector裏我們不允許 http_t來對http_port_t進行操作的話,Apache啟動都啟動不了。反過來說,我們只允許80端口,只允許讀取被標為 httpd_sys_content_t的文件,httpd_t就不能用別的端口,也不能更改那些被標為httpd_sys_content_t的文件(read only)。
防止權限升級
特點3:domain遷移 ―― 防止權限升級
在用戶環境裏運行點對點下載軟件azureus,你當前的domain是fu_t,但是,你考慮到安全問題,你打算讓他在azureus_t裏運行,你要是在terminal裏用命令啟動azureus的話,它的進程的domain就會默認繼承你實行的shell的fu_t。
有了domain遷移的話,我們就可以讓azureus在我們指定的azureus_t裏運行,在安全上面,這種做法更可取,它不會影響到你的fu_t。
下面是domain遷移指示的例子:
domain_auto_trans(fu_t,azureus_exec_t,azureus_t)
意思就是,當在 fu_t domain裏,實行了 被標為 azureus_exec_t的文件時,domain 從fu_t遷移到 azureus_t。下面是Apache啟動的遷移圖。註意了,因為從哪一個domain能遷移到httpd_t是在策略裏定好了,所以要是我們手動 (/etc/init.d/httpd start)啟動apache的話,可能仍然留在sysadm_t裏,這樣就不能完成正確的遷移。要用run_init命令來手動啟動。
對於用戶只賦予最小的權限
特點4:RBAC(role base access control) ――――― 對於用戶只賦予最小的權限
對於用戶來說,被劃分成一些ROLE,即使是ROOT用戶,你要是不在sysadm_r裏,也還是不能實行sysadm_t管理操作的。因為,那些ROLE可以執行那些domain也是在策略裏設定的。ROLE也是可以遷移的,但是也只能按策略規定的遷移。

SELinux——概述及基本操作命令