selinux(security-enhanced linux)簡介:(參考http://blog.csdn.net/flaght/article/details/2973910)
普通的linux采用自由通路控制政策(Discretionary Acces Control ,DAC)政策來限制資源通路。這種政策比較簡單薄弱,隻要滿足規定的權限(檔案所有者和檔案屬性等)就可以使用資源,這很容易引起安全隐患,而且很難支援很多安全特性。
例如,管理者可以隻允許一個應用程式添加記錄到一個日志檔案但不允許其重寫或者删除該日志檔案的内容。雖然ext2和ext3檔案系統有一個append-only标簽(使用chattr設定),但是這屬性不區分某一個程序(不能在為一個通路 append-only的同時,又允許另一個程序據有完全可寫的權利);另一方面,一個應用程式可以被允許在一個檔案夾中建立檔案和向其寫入資料,但不能删除檔案,這種特性是DAC做不到的,此時selinux派上用場了
selinux基于強制通路政策(Mandatory Access Control ,MAC)限制資源通路的,應用程式必須同時滿足DAC政策和MAC政策才能使用資源。DAC先于MAC生效,如果DAC本身不通過,那麼MAC在這個過程沒有參與,如果DAC通過,則selinux将對其進行進一步通路控制檢查。
selinux的配置檔案是/etc/selinux/config,管理selinux的包由libselinux-utils和policycoreutils提供
SELINUX=permissive|enforcing|disabled
permissive:在發現違反mac政策時候發出警告,但是并不阻止
disabled:完全關閉selinux
enforcing:禁止違反selinux的行為
SELINUXTYPE=targeted|mls
targeted:目标程序保護政策
mls:多級安全保護政策
setenforce
1:開啟selinux功能
0:關閉selinux功能
getenforce:檢視selinux功能是否開啟
sestatus:擷取運作selinux的狀态,比getenforce輸出資訊更詳細
setsebool:設定selinux政策中配置項的布爾值
chcon:改變檔案或目錄的selinux安全上下文
-t [type]:設定安全上下文類型
-R:表示遞歸地更改所有子目錄和檔案的安全上下文
-u [user]:修改安全上下文的使用者
-r [role]:修改安全上下文的角色
安全上下文由使用者id、角色、類型三部分組成,使用者id提供身份識别功能,一個使用者可以具有多個角色,每個角色具有不同的權限,類型則是對程式主體和資源的分類,當類型相比對時,程式才能正常使用資源
安全上下文的類型有三種:
賬号的安全上下文,id -Z 檢視
程序的安全上下文,ps -Z 檢視
檔案或目錄的安全上下文,ls -Z檢視
sVirt簡介:
在隻使用dac政策虛拟化環境中,因為運作客戶機的程序運作身份都是一樣的,而且每個客戶機都是使用相同的實體裝置,當一台客戶機被攻陷後,攻擊者很可能利用它發起對主控端的攻擊。當然,我們也可以讓每台客戶機使用不同的運作身份來堤防這個安全隐患,但是這也會帶來額外的問題,當客戶機數量很多的時候,我們就需要為其提供很多使用者賬号,在linux中,一個賬号要附加很多資訊的(bashrc、profile等就是記錄這些資訊),這會帶來很多開銷。是以,根據折中的哲學思想,人們并不為每個客戶機建立不同使用者運作程序,而是借鑒這種思想,為客戶機和資源打上唯一的标簽,隻有資源和客戶機标簽相比對的時候,才允許其使用資源,這個思想在linux中的具體實作就是svirt(selinux和虛拟化的結合)。
svir使用基于程序的機制和限制為客戶機提供了一個額外的安全保護層,它的一般的工作方式是這樣的:在rhel系統中使用libvirt的守護程序(libvirtd)在後頭管理客戶機,在啟動客戶機之前,libvirt動态選擇一個帶有兩個分類标志的随機mcs标簽如(s0:c1,c2),将客戶機使用的所有存儲資源都打上相應的标簽(svirt_image_t:s0:c1,c2),然後用該标簽啟動客戶機。當客戶機試圖使用磁盤資源而标簽不一緻的時候,則禁止通路,傳回錯誤提示
<a href="http://s1.51cto.com/wyfs02/M01/8C/0A/wKioL1hgmUSjqEZUAAKOIvYJDmM290.png" target="_blank"></a>
例子:
<code>setenforce 1 </code><code>#svirt是基于selinux的,是以要開啟來</code>
<code> </code><code>cp</code> <code>/bin/bash</code> <code>/bin/svirt_bash</code> <code>#防錯哲學..實驗前必備份</code>
<code> </code><code>chcon -t qemu_exec_t </code><code>/bin/svirt_bash</code> <code>#指定svirt_bash類型</code>
<code> </code><code>runcon -t svirt_t -l s0:c1,c2 </code><code>/bin/svirt_bash</code> <code>#以svirt_t類型和s0:c1,c2标簽運作svirt_bash</code>
<code> </code><code>svirt_bash: </code><code>/root/</code><code>.bashrc: Permission denied </code><code>#類型改變後,程序會沒有權限讀取.bashrc這個檔案,不影響本次實驗,但是如果實在不喜歡報錯的話,可以使用:</code>
<code> </code><code>chcon -t svirt_t -l s0:c1,c2 </code><code>/root/</code><code>.bashrc改變bashrc标簽,這樣,再次運作就不會報錯,改之前要關閉selinux,否則提示無權限修改,這樣改後也有問題就是執行其他指令也會報錯,因為svirt_t的權限很小,不如預設的admin_home_t</code>
<code> </code><code>id</code> <code>-Z </code><code>#檢視目前程序标簽</code>
<code> </code><code>unconfined_u:unconfined_r:svirt_t:s0:c1,c2</code>
<code> </code><code>svirt_bash-4.1</code><code># echo "it just a test" > /tmp/1.txt</code>
<code> </code><code>svirt_bash-4.1</code><code># ls -Z /tmp/1.txt #發現跟svirt_bash 程序一樣</code>
<code> </code><code>-rw-r--r--. root root unconfined_u:object_r:svirt_tmp_t:s0:c1,c2 </code><code>/tmp/1</code><code>.txt</code>
<code> </code>
<code> </code><code>[root@cqhdtest ~]</code><code># runcon -t svirt_t -l s0:c1,c3 /bin/svirt_bash #換個标簽運作</code>
<code> </code><code>svirt_bash: </code><code>/root/</code><code>.bashrc: Permission denied</code>
<code> </code><code>svirt_bash-4.1</code><code># id -Z</code>
<code> </code><code>unconfined_u:unconfined_r:svirt_t:s0:c1,c3</code>
<code> </code><code>svirt_bash-4.1</code><code># cat /tmp/1.txt #提示沒有權限</code>
<code> </code><code>cat</code><code>: </code><code>/tmp/1</code><code>.txt: Permission denied</code>
<code> </code><code>[root@cqhdtest ~]</code><code># setenforce 0</code>
<code> </code><code>[root@cqhdtest ~]</code><code># chcon -t svirt_t -l s0:c1,c3 /tmp/1.txt </code>
<code> </code><code>[root@cqhdtest ~]</code><code># setenforce 1</code>
<code> </code><code>[root@cqhdtest ~]</code><code># runcon -t svirt_t -l s0:c1,c3 /bin/svirt_bash </code>
<code> </code><code>svirt_bash-4.1</code><code># cat /tmp/1.txt </code>
<code> </code><code>it just a </code><code>test</code>
<code> </code><code>#修改1.txt标簽再通路,發現可以,實驗成功,注意,我修改參數時的bash不一樣</code>
本文轉自biao007h51CTO部落格,原文連結: http://blog.51cto.com/linzb/1886149,如需轉載請自行聯系原作者