SElinux的前身是NSA(美國國家安全域)發起的一個項目。它的目的是將系統加固到可以達到軍方層級。
為什麼NSA選擇Linux呢?
在目前市面上大多數作業系統都是商用閉源的,只有Linux是開源的,這樣修改並加入這項功能就方便許多,而且沒有著作權糾紛。所以,現在selinux就成為了Linux核心的一部分。
在瞭解selinux之間,我們需要知道DAC和CS的概念,它們是linux系統本身的安全機制。
DAC:自主存取控制
每一個使用者為了能夠實現和其他使用者共用檔案,在使用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 規定目錄屬於哪個進程的範圍
啟動使用selinux
1.啟用selinux
vim /etc/sysconfig/selinuxSELINUX=enforcing #任何進程都受selinux控制 permissive #仍然受控制,但是進程進入了別的目錄會記錄到日誌 disable #乾淨徹底的關閉setenforcegenenforce
2.顯示標籤
ls -Z 顯示檔案的標籤 一共五段 角色:selinux裡另外定義的使用者 object_r: 有點類似於組 user_home_t: 域或者類型(最重要)通過改變它可以控制訪問。類型強制的機制就是通過它實現的ps -Z 顯示進程的標籤所有顯示unconfined_t都表示不受selinux控制ps auxZ | grep httpdls -dZ
在不同的目錄建立的檔案類型是不一樣的,歸不同的進程管理。
3.改變一個類型的標籤
chcon chage contex 改變上下文chcon -t 改類型,指定為特定類型 -u -R 遞迴修改,可以改變目錄下所有目錄 --reference= 以某個檔案的標籤為參照改變成一樣的標籤chcon -R --reference=/var/www/html /wwwchcon -t default_t /www/index.html
4.恢複預設安全上下文及修改
restorecon -R 遞迴 -F 強制 -v 顯示詳細資料 restorecon -R -v -F /www # 顯示/www目錄的詳細CS資訊 semange -d 刪除 -m 修改 -r -a 附加 -t 類型
6.開啟布爾類型
getsebool -a | grep httpd #查看某個對應的布爾類型的值setsebool httpd_enable_cgi=on # 加上-p選項永久有效
下面通過添加一個samba目錄來測試selinux控制
1.添加tools檔案夾
vim /etc/samba/smb.conf[tools] path = /share #沒有的話事前建立一個 public = yes write list = @mygrp #只允許mygrp組具有建立檔案的許可權 browseable = yesservice smb start
2.添加使用者gentoo,並設定samba密碼,允許器登陸samba伺服器在tools下建立檔案
groupadd mygrpuseradd gentoo -g mygrp[root@station32 var]# smbpasswd -a gentooNew SMB password:Retype new SMB password:Added user gentoo.smbclient -L 192.168.0.32 -U gentoo # 查看samba伺服器的內容
3.我們查看下/shared目錄的CS,並且開啟selinux
ls -dZ /share/drwxrwxr-x root mygrp root:object_r:default_t /share/setenforce 1
4.開啟selinux後,再使用smbclient命令就會報錯,我們看下設定檔裡面有這樣一行 # To set a label use the following: chcon-t samba_share_t /path ,所以我們必須把/shared檔案夾的CS修改後才能正常使用samba
chcon -t samba_share_t /share
5.我們關閉samba裡關於訪問家目錄的布爾類型
setsebool samba_enable_home_dirs off
這個時候使用win近端分享,以使用者gentoo登陸後,就不能進入gentoo家目錄了
6.我們將它開啟就又能訪問了,命令如下:
setsebool samba_enable_home_dirs on