Linux中的SELinux原理與應用

SElinux的前身是NSA(美國國家安全局)發起的一個項目。它的目的是將系統加固到可以達到軍方級別。secutity enhanced linux
 
爲什麼NSA選擇Linux呢?
在目前市面上大多數操作系統都是商用閉源的,只有Linux是開源的,這樣修改並加入這項功能就方便許多,而且沒有版權糾紛。所以,現在selinux就成爲了Linux內核的一部分。 
 
 
在瞭解selinux之間,我們需要知道DAC和CS的概念,它們是linux系統本身的安全機制。
DAC:Discretionary Access Control  自主(任意)訪問控制
每一個用戶爲了能夠實現和其他用戶共享文件,在使用ACL之前,只能通過改變這個文件其他用戶的權限,但是這中方法給系統安全帶來了無窮的隱患。 
CS(安全上下文):取決於發起用戶的權限和文本本身的權限  
CS+DAC給系統的安全機制帶來了漏洞,事想apache用戶可以查看/etc/passwd,如果它有寫權限,就可能被利用進而就修改passwd文件,危害系統安全。 
所有才又了MAC強制訪問控制的概念
MAC: Mandatory Access Control  強制訪問控制,它是selinux實現訪問控制的基礎
還通過httpd服務來說明它的原理:
SELINUX通過type enforce (TE)強制類型策略將httpd的工作目錄定義在一個特定的目錄/var/www用戶如果在定義其他目錄,將不允許訪問,從而實現mac的強制訪問控制。 
selinux是怎麼工作的
它通過operation (操作)的主和賓打一個“標籤”,在一個“類型”裏只能由特定的目錄或用戶執行。這樣可以限定一個進程的執行範圍只能在一個“沙箱”(sandbox)內了(最小權限法則) 
###operation: 讀,寫,執行,等。其實是一個主謂賓的結構 Subject Operation Object
###最小權限法則:例如定義Sbjiect httpd   的目錄/var/www 爲public_content_t類型,這樣,httpd只能訪問有這個特定類型的文件或目錄,這些文件就叫沙箱“sendbox”
使用selinx,必須精心設計一套訪問法則 
給不同的進程打上不同的“域”,給不同的目錄打上不同的”類型“通過定義“類型”和“域”的對應規則,來實現。selinx需要域和標籤的對應關係,一對一對應     。但是系統上有上千個進程,實現起來很麻煩,所以一般情況下,並不是用selinx作爲安全防範。                  
selinux的實現機制有兩種
    strict:       任何進程都受selinux的控制,一般不用,太難設定
    targeted:   紅帽開發,指定選定的進程來受SELINUX,這種機制使得selinx更加容易受到控制  
以上規則組合起來就叫策略policy
規則通常是以二進制文件存在的(編輯完轉換成二進制),這樣可以降低系統資源佔用
#ll /etc/selinxu/policy
MLS  muiti level scurity

 
selinxu把一些規則裏面可以方便控制的功能設定爲on或者off,這些都成爲布爾類型
#getsebool -a   可以顯示這些布爾型的內容 
fcontext 規定目錄屬於哪個進程的範圍 
 
《《《《《《《《《《《《
進程的執行本來是取決於用戶所擁有的權限rwx,我們只想讓gentoo對a.txt具有寫權限,進行修改。對其他任何文件都不能修改。
 
那麼我們就需要對他進行一些限制,將他能執行的操作僅限於a.txt這個文件。
 
我們就藉助sandbox:沙盒 將他的權限限定在某個特定目標
 
我們定義一個進程類型爲t1,在定義一個目標爲t2
我們制定一個策略表,t1只能對t2執行什麼操作,把活動範圍限制在沙盒。
 
就是提供了一個域,將活動範圍限定在這個域之內。
subject:domain(type)
 
例如:一個web網站,linux系統上需要用戶發起httpd進程來訪問。這個用戶擁有rx權限。我們只需要用戶查看網頁就行了,不能讓他訪問我們的系統,那麼只要將他限定在一個域內就行了。比如我們建一個目錄
/var/www,我們把用戶的httpd進程活動範圍限制在這個目錄。他就算搞破壞,也只是針對這個目錄,無法搞壞我們整個系統。
 
MAC做進了內核,-->SELinux
 
selinux的模型:
 
        strict模型:安全級別太高,每一個進程都需要嚴格設定,五角大樓才用 - -!!
 
        target模型:只對可能有風險的進行限定,web,ftp,http等
 
在/etc/selinux/config定義了類型
SELINUXTYPE=target在最後一行
可以關閉,只要修改SELINUX=enforcing
              enforcing-狀態爲生效
              permissive-狀態爲生效,但不強制,只警告不阻止。發送郵件至日誌
              disabled-不開啓
下次開機生效
#getenforce    查看當前生效的模型
#setenforce 0 或1改變狀態,在enforcing與permissive之間切換
 
/etc/sysconfig/selinux鏈接/etc/selinux/config
 
類型強制:selinux爲每一個進程分配了一個標籤
 
label:標籤
user:用戶
role:組
type:類型
 
#ls -Z  字段user:role:type 查看文件標籤
#ps -axZ                      查看進程標籤
定義規則,策略在/etc/selinux/targeted/policy/policy.21
它是二進制格式,不可直接制定,需要文本文件,在進行轉換
 
改變文件的類型# chcon -t 類型 文件名
 
我們可以通過修改文件標籤來限制進程訪問文件
 
#restorecon -vvF 恢復文件類型
如果是目錄,只改目錄本身。要想對其子目錄及其文件生效,使用-R
如果ftp被selinux限制,就不能上傳了。
 
使用getsebool -a | less 查看進程功能的開啓與關閉
修改方法:setsebool 功能名 no或off
當前生效,永久有效要加-P選項
》》》》》》》》》》》》》》》》
 
啓動使用selinux
1.啓用selinux
  1. vim /etc/sysconfig/selinux  
  2. SELINUX=enforcing      #任何進程都受selinux控制  
  3.  permissive    #仍然受控制,但是進程進入了別的目錄會記錄到日誌  
  4.  disable           #乾淨徹底的關閉  
  5. setenforce  
  6. genenforce  
2.顯示標籤
  1. ls -Z           顯示文件的標籤  
  2.  一共五段     角色:selinux裏另外定義的用戶  
  3.                                     object_r: 有點類似於組  
  4.                                      user_home_t: 域或者類型(最重要)通過改變它可以控制訪問。類型強制的機制就是通過它實現的  
  5. ps -Z          顯示進程的標籤  
  6. 所有顯示unconfined_t都表示不受selinux控制  
  7. ps auxZ | grep httpd  
  8. ls -dZ  
在不同的目錄建立的文件類型是不一樣的,歸不同的進程管理。 
3.改變一個類型的標籤
  1. chcon     chage contex  改變上下文  
  2. chcon -t    改類型,指定爲特定類型  
  3.                 -u     
  4.                 -R   遞歸修改,可以改變目錄下所有目錄  
  5.                       --reference=   以某個文件的標籤爲參照改變成一樣的標籤  
  6. chcon -R --reference=/var/www/html /www  
  7. chcon -t default_t /www/index.html  
4.恢復默認安全上下文及修改
  1. restorecon  
  2.                    -R                   遞歸  
  3.                    -F                      強制  
  4.                    -v                      顯示詳細信息     
  5. restorecon -R -v -F /www             # 顯示/www目錄的詳細CS信息                       
  6. semange  
  7.                    -d                  刪除  
  8.                    -m                 修改  
  9.                    -r  
  10.                   -a                   附加  
  11.                    -t                    類型  
  12.    
 
6.開啓布爾類型
  1. getsebool -a  | grep httpd                   #查看某個對應的布爾類型的值  
  2. setsebool httpd_enable_cgi=on          # 加上-p選項永久有效  
下面通過添加一個samba目錄來測試selinux控制

 
1.添加tools文件夾
  1. vim /etc/samba/smb.conf  
  2. [tools]  
  3.        path = /share                        #沒有的話事前創建一個  
  4.        public = yes  
  5.         write list = @mygrp                 #只允許mygrp組具有創建文件的權限  
  6.        browseable = yes  
  7. service smb start  
2.添加用戶gentoo,並設置samba密碼,允許器登陸samba服務器在tools下創建文件
  1. </pre><pre class="cpp" name="code">groupadd mygrp  
  2. useradd gentoo -g mygrp  
  3. [root@station32 var]# smbpasswd -a gentoo  
  4. New SMB password:  
  5. Retype new SMB password:  
  6. Added user gentoo.  
  7. smbclient -L 192.168.0.32 -U gentoo          # 查看samba服務器的內容  
3.我們查看下/shared目錄的CS,並且開啓selinux
  1. ls -dZ /share/  
  2. drwxrwxr-x root mygrp root:object_r:default_t          /share/  
  3. setenforce 1  
4.開啓selinux後,再使用smbclient命令就會報錯,我們看下配置文件裏面有這樣一行 # To set a label use the following: chcon-t samba_share_t /path ,所以我們必須把/shared文件夾的CS修改後才能正常使用samba
  1. chcon -t samba_share_t  /share  
 
 
 
5.我們關閉samba裏關於訪問家目錄的布爾類型
  1. setsebool samba_enable_home_dirs off   
這個時候使用win網絡鄰居,以用戶gentoo登陸後,就不能進入gentoo家目錄了

 
6.我們將它開啓就又能訪問了,命令如下:
  1. setsebool samba_enable_home_dirs on 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章