天天看點

SELinux

SELinux

SELinux 是 2.6 版本的 Linux 核心中提供的強制通路控制 (MAC)系統。對于目前可用的 Linux 安全子產品來說,SELinux 是功能最全面,而且測試最充分的,它是在 20 年的 MAC 研究基礎上建立的。SELinux 在類型強制伺服器中合并了多級安全性或一種可選的多類政策,并采用了基于角色的通路控制概念。

大部分使用 SELinux 的人使用的都是 SELinux 就緒的發行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian 或 Gentoo。它們都是在核心中啟用 SELinux 的,并且提供一個可定制的安全政策,還提供很多使用者層的庫和工具,它們都可以使用 SELinux 的功能。

SELinux是一種基于 域-類型 模型(domain-type)的強制通路控制(MAC)安全系統,它由NSA編寫并設計成核心子產品包含到核心中,相應的某些安全相關的應用也被打了SELinux的更新檔,最後還有一個相應的安全政策。

衆所周知,标準的UNIX安全模型是"任意的通路控制"DAC。就是說,任何程式對其資源享有完全的控制權。假設某個程式打算把含有潛在重要資訊的檔案扔到/tmp目錄下,那麼在DAC情況下沒人能阻止他!

而MAC情況下的安全政策完全控制着對所有資源的通路。這是MAC和DAC本質的差別。

SELinux提供了比傳統的UNIX權限更好的通路控制。 

1.背景

SELinux是「Security-Enhanced Linux」的簡稱,是美國國家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)開發的 Linux的一個擴張強制通路控制安全子產品。原先是在Fluke上開發的,2000年以 GNU GPL 釋出。

現在以Linux作為網際網路伺服器是越來越普遍的事了。在我這幾年作過的項目裡,WEB的開發基本都是基于Linux的,這裡有給大公司做的,也給政府部門做的,當然更多的是中小企業做的。這其中給政府做的,我們把SELinux作為一個賣點,接受了不少項目。

2.我們需要安全作業系統的理由

現在不論是政府還是民間企業,大家對資訊安全問題是越來越關心了,因為企業的業務平台的伺服器上存儲着大量的商務機密,個人資料,個人資料它直接關系到個人的隐私問題。特别是我們政府的網站,作為資訊公開的平台,它的安全就更顯得重要了。這些連到網際網路的伺服器,不可避免的要受到來自世界各地的各種威脅。最壞的時候我們的伺服器被入侵,首頁檔案被替換,機密檔案被盜走。除了來自外部的威脅外,内部人員的不法通路,攻擊也是不可忽視的。對于這些攻擊或者說是威脅,當然有很多的辦法,有防火牆,入侵檢測系統,打更新檔等等。因為Linux也和其他的商用UNIX一樣,不斷有各類的安全漏洞被發現。我們對付這些漏洞不得不花很多的人力來堵住它。在這些手段之中,提高OS系統自身的牢固性就顯得非常的重要。

2.1傳統的Linux OS的不足之處

雖然Linux 比起 Windows 來說,它的可靠性,穩定定要好得多,但是他也是和其他的UNIX 一樣,有以下這些不足之處。

1)存在特權使用者root

任何人隻要得到root的權限,對于整個系統都可以為所欲為。這一點Windows也一樣。

2)對于檔案的通路權的劃分不夠細

在linux系統裡,對于檔案的操作,隻有「所有者」,「所有組」,「其他」這3類的劃分。

對于「其他」這一類裡的使用者再細細的劃分的話就沒有辦法了。

3)SUID程式的權限更新

如果設定了SUID權限的程式有了漏洞的話,很容易被攻擊者所利用。

4)DAC(Discretionary Access Control)問題

檔案目錄的所有者可以對檔案進行所有的操作,這給系統整體的管理帶來不便。

對于以上這些的不足,防火牆,入侵檢測系統都是無能為力的。

在這種背景下,對于通路權限大幅強化的OS SELinux來說,它的魅力的無窮的。

2.2 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也是可以遷移的,但是也隻能安政策規定的遷移。

3. 控制切換

從fedora core 2開始, 2.6核心的版本都支援selinux.我們看看 Fedora core 5 裡的/etc/sysconfig/selinux标準設定吧。

# 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 - SELinux is fully disabled.

SELINUX=enforcing

#SELINUX=disabled

# SELINUXTYPE= type of policy in use. Possible values are:

# targeted - Only targeted network daemons are protected.

# strict - Full SELinux protection.

SELINUXTYPE=targeted

SELINUX有「disabled」「permissive」,「enforcing」3種選擇。

Disabled就不用說了,permissive就是Selinux有效,但是即使你違反了政策的話它讓你繼續操作,但是把你的違反的内容記錄下來。在我們開發政策的時候非常的有用。

相當于Debug模式。

Enforcing就是你違反了政策,你就無法繼續操作下去。

SELINUXTYPE呢,現在主要有2大類,一類就是紅帽子開發的targeted,它隻是對于,主要的網絡服務進行保護,比如 apache ,sendmail, bind,postgresql等,不屬于那些domain的就都讓他們在unconfined_t裡,可導入性高,可用性好但是不能對整體進行保護。

另一類是Strict,是NAS開發的,能對整個系統進行保護,但是設定複雜,我認為雖然它複雜,但是一些基本的會了,還是可以玩得動的。

我們除了在/etc/sysconfig/selinux設它有效無效外,在啟動的時候,也可以通過傳遞參數selinux給核心來控制它。(Fedora 5預設是有效)

kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet selinux=0

上面的變更可以讓它無效。

[root@python sysconfig]# /usr/sbin/getenforce

Enforcing

确認有效後重新對檔案系統賦予标簽:

[root@python sysconfig]# /sbin/fixfiles relabel

或者

[root@python /]# touch /.autorelabel

然後 reboot ,你就在secure的Linux環境下工作了。

4. SELinux的基本操作

SELinux是個經過安全強化的Linux作業系統,實際上,基本上原來的運用軟體沒有必要修改就能在它上面運作。真正做了特别修改的RPM包隻要50 多個。像檔案系統EXT3都是經過了擴充。對于一些原有的指令也進行了擴充,另外還增加了一些新的指令,接下來我們就來看看這些指令。

4.1 檔案操作

1)ls指令

在指令後加個 -Z 或者加 –context

[root@python azureus]# ls -Z

-rwxr-xr-x fu fu user_u:object_r:user_home_t azureus

-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar

-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus.png

2)chcon

更改檔案的标簽

[root@python tmp]# ls --context test.txt

-rw-r--r-- root root root:object_r:staff_tmp_t test.txt

[root@python tmp]# chcon -t etc_t test.txt

[root@python tmp]# ls -lZ test.txt

-rw-r--r-- root root root:object_r:etc_t test.txt

3)restorecon

當這個檔案在政策裡有定義是,可以恢複原來的 檔案标簽。

4)setfiles

跟chcon一樣可以更改一部分檔案的标簽,不需要對整個檔案系統重新設定标簽。

5)fixfiles

一般是對整個檔案系統的, 後面一般跟 relabel,對整個系統 relabel後,一般我們都重新啟動。如果,在根目錄下有.autorelabel空檔案的話,每次重新啟動時都調用 fixfiles relabel

6)star

就是tar在SELinux下的互換指令,能把檔案的标簽也一起備份起來。

7)cp

可以跟 -Z, --context=CONTEXT 在拷貝的時候指定目的地檔案的security context

8)find

可以跟 –context 查特定的type的檔案。

例子:

find /home/fu/ --context fu:fu_r:amule_t -exec ls -Z {} \:

9)run_init

在sysadm_t裡手動啟動一些如Apache之類的程式,也可以讓它正常進行,domain遷移。

4.2程序domain的确認

程式現在在那個domain裡運作,我們可以在ps 指令後加 -Z

[root@python /]# ps -eZ

LABEL PID TTY TIME CMD

system_u:system_r:init_t 1 ? 00:00:00 init

system_u:system_r:kernel_t 2 ? 00:00:00 ksoftirqd/0

system_u:system_r:kernel_t 3 ? 00:00:00 watchdog/0

4.3ROLE的确認和變更

指令id能用來确認自己的 security context

[root@python ~]# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:staff_r:staff_t

這裡,雖然是ROOT使用者,但也隻是在一般的ROLE和staff_t裡運作,如果在enforcing模式下,這時的ROOT對于系統管理工作來說,是什麼也幹不了。

[root@python ~]# newrole -r sysadm_r

Authenticating root.

密碼:

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:sysadm_r:sysadm_t

4.4模式切換

1)getenforce

得到目前的SELINUX值

[root@python bin]# getenforce

Permissive

2)setenforce

更改目前的SELINUX值 ,後面可以跟 enforcing,permissive 或者 1, 0。

[root@python bin]# setenforce permissive

3)sestatus

顯示目前的 SELinux的資訊

[root@python bin]# sestatus -v

SELinux status: enabled

SELinuxfs mount: /selinux

Current mode: permissive

Mode from config file: permissive

Policy version: 20

Policy from config file: refpolicy

Process contexts:

Current context: user_u:user_r:user_t

Init context: system_u:system_r:init_t

/sbin/mingetty system_u:system_r:getty_t

/usr/sbin/sshd system_u:system_r:sshd_t

File contexts:

Controlling term: user_u:object_r:user_devpts_t

/etc/passwd system_u:object_r:etc_t

/etc/shadow system_u:object_r:shadow_t

/bin/bash system_u:object_r:shell_exec_t

/bin/login system_u:object_r:login_exec_t

/bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t

/sbin/agetty system_u:object_r:getty_exec_t

/sbin/init system_u:object_r:init_exec_t

/sbin/mingetty system_u:object_r:getty_exec_t

4.5其他重要指令

1)Audit2allow

很重要的一個以python寫的指令,主要用來處理日志,把日志中的違反政策的動作的記錄,轉換成 access vector,對開發安全政策非常有用。在refpolicy裡,它的功能比以前有了很大的擴充。

[root@python log]# cat dmesg | audit2allow -m local > local.te

2)checkmodule -m -o local.mod local.te

編譯子產品

[root@python log]# checkmodule -m -o local.mod local.te

checkmodule: loading policy configuration from local.te

checkmodule: policy configuration loaded

checkmodule: writing binary representation (version 5) to local.mod

3)semodule_package

建立新的子產品

[root@python log]# semodule_package -o local.pp -m local.mod

4)semodule

可以顯示,加載,删除 子產品

加載的例子:

[root@python log]# semodule -i local.pp

5)semanage

這是一個功能強大的政策管理工具,有了它即使沒有政策的源代碼,也是可以管理安全政策的。因為我主要是介紹用源代碼來修改政策的,詳細用法大家可以參考它的man頁。

5. 定制政策

FC4,RHEL4等都是采用政策1.X版本的,并且是提供政策源代碼的RPM包。從FC5開始政策的版本從1.X 更新到2.X。2.X版本的refpolicy(reference policy)最大的一個變化就是引進子產品(module)這個概念, 同一套政策源代碼就可以支援Multi-LevelSecurity(MLS)和non-MLS。

http://serefpolicy.sf.net/

标準的FC5裡不提供源代碼的RPM包。FC5提供的audit2allow,semanage,semodule也是可以開發一些簡單的政策子產品的。但是,要是作政策子產品的開發,增加一個ROLE之類的,最好還是下載下傳refpolicy的源代碼。

5.1政策源檔案的安裝

從CVS伺服器下載下傳的源代碼是最新的,如果遇到象make的時候出錯,那麼最好就是把你系統裡和SELinux有關的那些包更新到最新的狀态。

從source Forge的CVS伺服器下載下傳源代碼

[root@python src]# cd /usr/local/src

[root@python src]# cvs -d:pserver:[email protected]:/cvsroot/serefpolicy login

[root@python src]# cvs -z3 -d:pserver:[email protected]:/cvsroot/serefpolicy co -P refpolicy

[root@python src]# cd refpolicy/

[root@python src]# make install-src

安裝好了的源代碼目錄結構如下圖所示:

每一個子產品有3個檔案構成,比如上圖的sudo.fc 就是和 指令sudo相關的檔案的定義标簽,(file context rabel),sudo.te是Type Enforcement定義,包括TE通路規則等,sudo.if是一個外部子產品調用這個子產品的接口定義。

[root@python src]# cd /etc/selinux/refpolicy/src/policy

[root@python policy]# cp build.conf build.conf.org

[root@python policy]# vi build.conf

[root@python policy]# diff build.conf build.conf.org

32c32

< DISTRO = redhat

---

> #DISTRO = redhat

43c43

< MONOLITHIC=n

> MONOLITHIC=y

[root@python src]# make conf

[root@python src]# make

這樣,在/etc/selinux/refpolicy/src/policy下生成很多的以pp為字尾的檔案,這些就是SELinux子產品。接下來我們修改/etc/sysconfig/selinux,設成SELINUXTYPE=refpolicy,然後reboot.

啟動後,确認政策的适用情況, 現在的版本是20。

[fu@python ~]$ /usr/sbin/sestatus

5.2給程式定制domain

開發程式政策的一般步驟

1.給檔案,端口之類的object賦予type 标簽

2.設定 Type Enforcement (Domain 遷移,通路許可)

3.政策加載

4.permissive模式下運作程式

5.确認日志,用audit2allow生成通路許可

6.重複1,2,3,4,5動作,直到沒有違反的日志出現

7.切換到enforcing模式,正式運用

因為我們所常用的那些服務的政策子產品都已經有了,修改的時候也比較簡單。在這裡我就舉個一般的例子。用點對點下載下傳的朋友估計都跟我一樣,在Linux上用 azureus,Amule來下載下傳東西吧。

接下來以azureus為例,介召如何在FC5裡追加一個azureus.pp子產品。我們在追加azureus.pp子產品之前,azureus是在系統給使用者設好的user_t domain裡運作。

[fu@python azureus]$ ps -efZ|grep azureus

user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus

接下來我們在追加3個檔案。

1)azureus.fc

在這裡我隻定義一個檔案,實際要是真的用的,還要定義azureus_t能寫的目錄等。

[root@python apps]# more azureus.fc

/home/fu/azureus -- gen_context(user_u:object_r:azureus_exec_t,s0)

2)azureus.te

[root@python apps]# more azureus.te

policy_module(azureus,1.0.0)

type azureus_t;

type azureus_exec_t;

role user_r types azureus_t;

require {

type user_t;

};

domain_type(azureus_t)

domain_entry_file(azureus_t, azureus_exec_t)

domain_auto_trans(user_t, azureus_exec_t, azureus_t)

3)azureus.if

實際上沒有别的子產品要調用azureus,是以這個檔案就是空檔案也不要緊。

[root@python apps]# more azureus.if

# policy/modules/apps/azureus.if

## Myapp example policy

##

## Execute a domain transition to run azureus.

本文轉自 makewong 51CTO部落格,原文連結:http://blog.51cto.com/makewong/215208,如需轉載請自行聯系原作者