介紹
SELinux(Security-Enhanced Linux)是美國國家安全局(NAS)對于強制訪問控制的實現,是Linux®上最傑出的新安全子系統。NSA是在Linux社區的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,進程隻能訪問那些在他的任務中所需要文件。SELinux默認安裝在Fedora 和 Red Hat Enterprise Linux上,也可以作為其他發行版上容易安裝的包得到。
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權限更好的訪問控制。
模式
SELinux有三個模式(可以由用戶設置)。這些模式将規定SELinux在主體請求時如何應對。這些模式是:n1.Enforcing強制—SELinux策略強制執行,基于SELinux策略規則授予或拒絕主體對目标的訪問。n2.Permissive寬容—SELinux策略不強制執行,不實際拒絕訪問,但會有拒絕信息寫入日志。n3.Disabled禁用—完全禁用SELinux。
控制切換
從fedora core2開始,2.6内核的版本都支持selinux.我們看看Fedora core5裡的/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環境下工作了。
基本操作
SELinux是個經過安全強化的Linux操作系統,實際上,基本上原來的運用軟件沒有必要修改就能在它上面運行。真正做了特别修改的RPM包隻要50多個。像文件系統EXT3都是經過了擴展。對于一些原有的命令也進行了擴展,另外還增加了一些新的命令,接下來我們就來看看這些命令。
文件操作
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-execls-Z{}:
9)run_init
在sysadm_t裡手動啟動一些如Apache之類的程序,也可以讓它正常進行,domain遷移。
進程domain的确認
程序現在在那個domain裡運行,我們可以在ps命令後加-Z
[root@python/]#ps-eZ
LABEL PID TTY TIME CMD
system_u:system_r:init_t 1 00:00:00init
system_u:system_r:kernel_t 2 00:00:00 ksoftirqd/0
system_u:system_r:kernel_t 3 00:00:00 watchdog/0
ROLE的确認和變更
命令id能用來确認自己的securitycontext
[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-rsysadm_r
Authenticating root.
口令:
[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:sysadm_r:sysadm_t
模式切換
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
其他重要命令
1)Audit2allow
很重要的一個以python寫的命令,主要用來處理日志,把日志中的違反策略的動作的記錄,轉換成access vector,對開發安全策略非常有用。在refpolicy裡,它的功能比以前有了很大的擴展。
[root@python log]#catdmesg | 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 (version5) 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頁。
定制策略
FC4,RHEL4等都是采用策略1.X版本的,并且是提供策略源代碼的RPM包。從FC5開始策略的版本從1.X 升級到2.X。2.X版本的refpolicy(reference policy)最大的一個變化就是引進模塊(module)這個概念,同一套策略源代碼就可以支持Multi-LevelSecurity(MLS)和non-MLS。
标準的FC5裡不提供源代碼的RPM包。FC5提供的audit2allow,semanage,semodule也是可以開發一些簡單的策略模塊的。但是,要是作策略模塊的開發,增加一個ROLE之類的,最好還是下載refpolicy的源代碼。
⒌1策略源文件的安裝
從CVS服務器下載的源代碼是最新的,如果遇到象make的時候出錯,那麼最好就是把你系統裡和SELinux有關的那些包更新到最新的狀态。
安裝好了的源代碼目錄結構如下圖所示:
每一個模塊有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.
[root@python policy]#vi build.conf
[root@python policy]#diff build.conf build.
32c32
---
>#DISTRO=redhat
43c43
---
>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
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: permissive
Policyversion: 20
Policyfrom config file:refpolicy
⒌2給程序定制domain
開發程序策略的一般步驟
⒈給文件,端口之類的object賦予type标簽
⒉設置Type Enforcement(Domain遷移,訪問許可)
⒊策略加載
⒋permissive模式下運行程序
⒌确認日志,用audit2allow生成訪問許可
⒍重複1,2,3,4,5動作,直到沒有違反的日志出現
⒎切換到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]#moreazureus.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.
##
##
理由
2.我們需要安全操作系統的理由
現在不論是政府還是民間企業,大家對信息安全問題是越來越關心了,因為企業的業務平台的服務器上存儲着大量的商務機密,個人資料,個人資料它直接關系到個人的隐私問題。特别是我們政府的網站,作為信息公開的平台,它的安全就更顯得重要了。這些連到互聯網的服務器,不可避免的要受到來自世界各地的各種威脅。最壞的時候我們的服務器被入侵,主頁文件被替換,機密文件被盜走。除了來自外部的威脅外,内部人員的不法訪問,攻擊也是不可忽視的。對于這些攻擊或者說是威脅,當然有很多的辦法,有防火牆,入侵檢測系統,打補丁等等。因為Linux也和其他的商用UNIX一樣,不斷有各類的安全漏洞被發現。我們對付這些漏洞不得不花很多的人力來堵住它。在這些手段之中,提高OS系統自身的牢固性就顯得非常的重要。
2.1傳統的LinuxOS的不足之處
雖然Linux比起Windows來說,它的可靠性,穩定定要好得多,但是他也是和其他的UNIX一樣,有以下這些不足之處。
1)存在特權用戶root
任何人隻要得到root的權限,對于整個系統都可以為所欲為。這一點Windows也一樣。
2)對于文件的訪問權的劃分不夠細
在linux系統裡,對于文件的操作,隻有「所有者」,「所有組」,「其他」這3類的劃分。
對于「其他」這一類裡的用戶再細細的劃分的話就沒有辦法了。
3)SUID程序的權限升級
如果設置了SUID權限的程序有了漏洞的話,很容易被攻擊者所利用。
4)DAC(Discretionary Access Control)問題
文件目錄的所有者可以對文件進行所有的操作,這給系統整體的管理帶來不便。
對于以上這些的不足,防火牆,入侵檢測系統都是無能為力的。
在這種背景下,對于訪問權限大幅強化的OS SELinux來說,它的魅力的無窮的。
2.2SELinux的優點
SELinux系統比起通常的Linux系統來,安全性能要高的多,它通過對于用戶,進程權限的最小化,即使受到攻擊,進程或者用戶權限被奪去,也不會對整個系統造成重大影響。
優點
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也是可以遷移的,但是也隻能按策略規定的遷移。



















