作者 主題: SELinux初探心得  (閱讀 3472 次)

0 會員 與 1 訪客 正在閱讀本文。

billy3321

  • 活潑的大學生
  • ***
  • 文章數: 269
  • 性別: 男
    • 檢視個人資料
    • 雨蒼的筆記本
SELinux初探心得
« 於: 2008-10-23 18:40 »
星期六聽了小州大哥講的SELinux後,發現SELinux真是個不錯的東西。
不過只要去Google一下SELinux,卻會出現這些東西:selinux關閉、turn off selinux 、stop selinux ...

因此小弟就在這邊將小州老師上課提到的重點,加上cdchen老師所寫的RHEL5系統管理寶典中的重點整合在底下。

之前Linux中關於檔案存取的權限處理,有幾種方法:

基礎的權限:

引用
[billy3321@localhost practice]$ ls -l
total 32
drwxrwxr-x  2 billy3321 billy3321 4096 Oct 13 15:33 directory
-rw-rw-r--  1 billy3321 billy3321   16 Oct 13 15:32 file
-rw-rw-r--+ 1 billy3321 billy3321   25 Oct 13 15:53 file_with_acl
-rwxrwxr-x  1 billy3321 billy3321   35 Oct 13 15:24 script
相關指令:
更改擁有者

引用
chown [OPTION]... [OWNER][:[GROUP]] FILE...

更改rwx設定

引用
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...

判斷方法:
首先判斷檔案的擁有者(user),擁有群組(group),以及其他人(other)。以這個方式來判別讀(r),寫(w),執行的權限(x)。在目錄上面則是讀取(r),修改(w),進入目錄(x)等方式。

附帶一提,檔案的刪除或更名是看目錄的w權限。在檔案系統中,目錄事實上只是一個文件,裡面列出了目錄含有的檔案名稱,以及該檔案的inode為何。因此刪除檔案,實際上就是去移除"目錄"文件裡面關於該檔案的資訊;更名檔案,則是更改該檔案的"檔案名稱"欄位。因此刪除與更名就是編輯並修改"目錄"這個文 件。而要可以編輯修改,就要擁有w屬性,因此檔案的刪除與更名,是看目錄的w權限。

延伸的權限:
Access control lists(ACL)

引用
[billy3321@localhost practice]$ getfacl file_with_acl
# file: file_with_acl
# owner: billy3321
# group: billy3321
user::rw-
user:sonnet77:rw-
group::rw-
group:users:r--
mask::rw-
other::r--

相關指令:
設定ACL

引用
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...

檢視ACL設定

引用
getfacl [-dRLPvh] file ...

判斷方式:
讀取檔案時,權限判斷會由上往下依序讀取。因此判斷方式就會更改預設的判斷流程。
原本判斷順序是user > group > other ,這邊判斷順序就改為 user > user:sonnet77 > group > group:users > other 。

以上這兩種權限在判斷上,各位都可以發現,這種判斷方式幾乎都是以擁有者,擁有群組等來判斷存取與否。在行程擁有的權限上,則會看執行者身分或是該程式的擁有者與群組。

這種判斷方式是稱為Discretionary Access Comtrol(DAC)的方式,只要你是檔案擁有者,就擁有至高無上的權力;若你還是root的話,更可以任意存取任何檔案。

舉一個之前的例子,之前OuTian大大在HITCON有揭露一個Tomcat的漏洞。由於Tomcat須以root身分執行,並bind上80 port去listen,經由這個漏洞,Tomcat可以以root身分對檔案系統為所欲為,甚至去觀看/etc/shadow密碼檔案。這就是DAC機制很大的問題,只要入侵任何Deamon行程並獲取控制權,cracker就可以觀看/etc/passwd檔案進行下一步的入侵,甚至去尋找一些設定檔案。

後來有發展出一個機制,可以將deamon行程關在一個特定目錄中,稱為chroot。若是cracker入侵該行程,也只能在該目錄中活動而無法看到重要的系統檔案。不過chroot只針對某些行程有效果,不能防範來自其他行程的攻擊。

chroot執行方式:

引用
chroot NEWROOT [COMMAND...]
chroot OPTION


有鑒於這些設定已經無法因應目前的資訊安全要求,因此美國國家安全局(NAS)就在Linux中實作一個機制,稱為SELinux,利用資料庫查詢的方式來維護作業系統的安全。SELinux採用Mandatory Access Control(MAC)機制,會對所有的檔案、行程、用戶給予一個Security content,用戶端通過傳統DAC認證後,SELinux會進一步的去檢視Security content,並決定是否授與權限。SELinux後來在RedHat的支持下,得到了長足的進步,且收錄於2.6的核心之中。可再編譯時選擇是否將SELinux功能編入kernel之中。

下面就來簡介SELinux的運作機制及各項指令。

SELinux是由核心實作的功能,因此若是需要SELinux功能,要先確定核心中是否已將SELinux編譯進去。SELinux的啟動與否可由開機參數加以指定(selinux = [0|1])

SELinux的設定檔案可編輯/etc/sysconfig/selinux這個檔案,這是/etc/selinux/config之Symbolic Link。其中含有兩種主要的設定:

1.SELinux執行模式(SELINUX=STATUS),可分為強制(enforce)、寬容(permissive)、以及停用(disable)。除了停用、啟用需重開機外,強制與寬容模式的切換可以setenforce來設定。要觀看目前執行模式則可以用getenforc以及較為廣域的sestatus來觀看。在強制模式中,只要SELinux不允許,就會無法執行;但在寬容模式中,只會將事件紀錄下來,依然允許執行。因此若是懷疑是SELinux造成的問題,可以將SELinux切換為寬容模式,若是依然無法執行,那麼問題就不是在SELinux上。

切換強制與寬容模式

引用
setenforce [ Enforcing | Permissive | 1 | 0 ]

觀看目前SELinux執行模式

引用
getenforce
sestatus [-v] [-b]

2.所使用的安全原則名稱(SELINUXTYPE=POLICY),可概分為targeted、strict、與mls。targeted保護常見的網路服務,為預設的policy。strict提供符合Role-based-Access Control(RBAC)之policy,而mls則提供符合Multi-Level Security(MLS)的policy。這些policy放置於/etc/selinux/以policy為名的資料夾中,只有在開機時會載入。

如果想要改變policy,就得要重開機,才能重新載入policy。如果更換policy,物件的security context也要重新產生,因此在重開機前一定要記得在根目錄下放置.autorelabel檔案,這樣所有的security context才會重新產生。為了避免在開機期間因為錯誤的security context導致開機失敗,請先將selinux的執行模式更改為permissive。如果忘記更改導致開機時的kernel panic,開機時對核心參數加上selinux=0的選項暫時性的關閉SELinux系統,待其產生完畢後,再一次的重開機以打開SELinux。

對於policy的檢視,有以下方法
檢視policy規則

引用
seinfo [OPTIONS] [POLICY_FILE]

搜尋policy規則

引用
sesearch [OPTIONS] [POLICY_FILE]

3.但是如果SELinux只有policy可以選擇,不是太沒彈性了?因此在決定好policy後,可以使用SELinux Boolean來變更一些細項。
比如說,大家最容易為SELinux困擾的一樣設定就是Apache的home_dir設定。
只要更改httpd_enable_homedirs這項SELinux Boolean,就可以允許Apache顯示各使用者的public_html資料夾了。

以下是一些設定管理SELinux Boolean的方式

顯示指定或全部的SELinux Boolean

引用
getsebool [-a] [boolean]

設定指定的SELinux Boolean

引用
setsebool [ -P ] boolean value | bool1=val1 bool2=val2 ...

4.在SELinux中,每個登入的使用者根據登入的方式不同,會由PAM子系統中的pam_selinux.so模組設定該使用者執行行程的security context。此後,除非特別要求,否則子行程預設會繼承父行程的security context。在檔案的部分,由rpm所安裝的檔案會依照儲存於rpm中的紀錄來設定security context,若是手動建立,則依照policy中所制定的security context來設定。另外,如果是cp(複製),會以新建檔案的方式重新配置security context,若是mv(搬移),則會保留。

針對security context的操作,有以下幾種方法

檢視帳號的security context

引用
id -Z

檢視行程的security context

引用
ps -Z

檢視檔案的security context

引用
ls -Z

變更security context

引用
chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... --reference=RFILE FILE...

修復security context,可修復來自套件的檔案

引用
fixfiles  [-F]  [  -R  rpmpackagename[,rpmpackagename...] ] [ -C PREVI-
       OUS_FILECONTEXT ] [-l logfile ] [-o outputfile ] { check  |  restore  |
       [-F] relabel | verify }"
fixfiles  [-F]  [-l  logfile  ] [-o outputfile ] { check | restore|[-f]
       relabel | verify } [[dir/file] ... ]

還原security context,可還原原先設定的security context。

引用
restorecon [-o outfilename ] [-R] [-n] [-v] [-e directory ] pathname...
restorecon -f infilename [-o outfilename ] [-e directory  ]  [-R]  [-n]
       [-v] [-F]

在開機時重新產生所有的security context

引用
# touch /.autorelabel

其他設定工具
圖形化的SELinux設定工具:

引用
system-config-selinux


了解了security context以及policy以後,我們就可以重新看SELinux究竟是怎麼運作。

當一個行程(object)去存取檔案(subject)時,Linux核心會先判斷先前提到的權限判定,若是通過了,就會進入到SELinux的判斷流程中。
1.以object與subject之security context,判斷policy中是否已有符合之規則。
2.若不符合任何規則,則傳回禁止;若符合規則,則查看規則為允許(Allow)或拒絕(Deny)。
3.若規則為拒絕(Deny),則存取失敗;若規則為允許(Allow),則存取成功。

以上狀況如果在enforce模式下,只有規則為允許者才可存取;若為permissive模式,所有被SELinux所拒絕的依然可以存取,只是會顯示錯誤訊息到log檔案中。

如果要檢視SELinux的錯誤訊息,可以看以下兩個檔案

引用
/var/log/messages
/var/log/audit/audit.log

由於audit.log較不易閱讀,因此SELinux有提供工具來轉換為適合人類閱讀的模式

引用
# audit2why < /var/log/audit/audit.log

另外也有圖形化的工具setroubleshoot,除了顯示deny的message以外,還會給予不少實用的建議。

引用
# sealert -b


如果好好的使用,SELinux將是個強大的工具,捍衛伺服器的安全。
以後大家不要在安裝完系統就關閉SELinux啦!

參考資料:
小州老師上課講義:
http://kenduest.sayya.org/blog/kenduest-data/2008/10/selinux_sa.pdf
http://kenduest.sayya.org/blog/kenduest-data/2008/5/kenduest-UNIX-selinux-2008-05-15.pdf
RHEL5系統管理寶典:
http://www.cdchen.idv.tw/mybooks/slbubooks/slbu202v1

=================
本文同步發表於雨蒼的筆記本
http://billy3321.blogspot.com/
http://www.dotblogs.com.tw/billy3321/
« 上次編輯: 2008-10-24 10:57 由 billy3321 »

Acoju

  • 懷疑的國中生
  • **
  • 文章數: 50
    • 檢視個人資料
回覆: SELinux初探心得
« 回覆 #1 於: 2008-10-23 19:08 »
selinux是不錯!
但是進入伺服器整合的時候才是痛苦的開始,就像postfix,php mail指令問題。
在google找不到答案,會想是不是........。
想要disable的時候,恢復原來設定,又是一個痛苦的經驗,重裝系統,用硬碟對copy算了。

pippeng

  • 活潑的大學生
  • ***
  • 文章數: 329
  • 性別: 男
    • 檢視個人資料
    • IT Ranger
回覆: SELinux初探心得
« 回覆 #2 於: 2008-10-23 19:25 »
找根吸管開始吸收大腦內的資料
好豐富的整理資料都是精華
用心用心再用心

billy3321

  • 活潑的大學生
  • ***
  • 文章數: 269
  • 性別: 男
    • 檢視個人資料
    • 雨蒼的筆記本
回覆: SELinux初探心得
« 回覆 #3 於: 2008-10-24 10:44 »
selinux是不錯!
但是進入伺服器整合的時候才是痛苦的開始,就像postfix,php mail指令問題。
在google找不到答案,會想是不是........。
想要disable的時候,恢復原來設定,又是一個痛苦的經驗,重裝系統,用硬碟對copy算了。

小州老師上課說過,將SELinux設為寬容模式,基本上他就不會拒絕了,都會讓你過去,原先拒絕的會出現在log檔裡面而已。
若有困擾可以先設為寬容模式,搭配setroubleshoot的建議以及出現的一些message來設定SELinux

搞定後再打開即可:)