1. 程式人生 > >Linux學習25-SELinux

Linux學習25-SELinux

SELinux介紹

需要掌握

啟用禁用SELinux 更改標籤 更改布林值

1. 簡介

SELinux: Secure Enhanced Linux, 是美國國家安全域性(NSA=The National Security Agency)和SCC(Secure Computing Corporation)開發的 Linux的一個強制訪問控制的安全模組。2000年以GNU GPL釋出,Linux核心2.6版本後集成在核心中

  • DAC與MAC

    • 早期沒有SELinux時叫 DAC:Discretionary Access Control自由訪問控制
      • DAC環境下程序是無束縛的
    • 加入SELinux後叫 MAC:Mandatory Access Control 強制訪問控制,即使是root賬號也會受到一定的限制
      • MAC環境下策略的規則決定控制的嚴格程度
      • MAC環境下程序可以被限制的
      • 策略被用來定義被限制的程序能夠使用那些資源(檔案和埠)
      • 預設情況下,沒有被明確允許的行為將被拒絕,例如SELinux不允許上傳檔案
      • 優點:配置複雜,讓系統處於比較安全的狀態
      • 缺點:配置複雜,與很多應用不相容,在國內用的比較少
  • 工作流程 Subject(比如程序)發起請求,例如讀寫某檔案 ,需要通過中間的SELinux安全伺服器,上面記錄了 SELinux策略的各種資料設定(相當於規則庫),根據庫的規則來決定是否允許Subject的請求:

    • 如果允許,就可以根據訪問許可權取執行請求
    • 不允許,就會以AVC的訊息釋出出來,記錄在日誌中
  • SELinux工作型別 targeted為預設型別,minimum和mls穩定性不足,未加以應用,strict已不再使用

    • strict: centos5以後的版本沒有,每個程序都受到selinux的控制,包括未知的程序
    • targeted: 用來保護常見的網路服務,僅有限程序受到selinux控制,只監控容易被入侵的程序,centos4只保護13個服務,centos5保護88個服務。只監控系統已知的服務,會不斷完善。
    • minimum:centos7,修改的targeted,只對選擇的網路服務
    • mls:提供MLS(多級安全)機制的安全性
  • SELinux安全上下文(security context)

    • 概述
      1. 在傳統Linux中,一切皆檔案,由使用者,組,許可權控制訪問,而在SELinux中,一切皆物件(object),由存放在inode的擴充套件屬性域的安全元素所控制其訪問
      2. 每個檔案都定義了SELinux的擴充套件屬性,這個擴充套件屬性叫做安全上下文。所有檔案和埠資源和程序都具備安全標籤:安全上下文
    • 檢視安全上下文

      1. 實際上下文:存放在檔案系統中 檢視命令ls –Z;ps –Z
      2. 期望(預設)上下文:存放在二進位制的SELinux策略庫(對映目錄和期望安全上下文)中,策略庫嚴格規定了什麼目錄,擁有什麼標籤型別 檢視命令semanage fcontext –l
      3. 資料庫配置檔案在/etc/selinux/targeted/contexts
    • 格式 安全上下文有五個元素組成: user:role:type:sensitivity:category

      1. User:指示登入系統的使用者型別,程序:如system_u為系統服務程序,是受到管制的,unconfined_u為不管制的程序,使用者自己開啟的,如 bash
      2. Role:定義檔案,程序和使用者的用途:程序:system_r為系統服務程序,受到管制。unconfined_r 為不管制程序,通常都是使用者自己開啟的,如 bash,檔案:object_r
      3. Type:指定資料型別,規則中定義何種程序型別訪問何種檔案Target策略基於type實現,多服務共用:public_content_t
      4. Sensitivity:限制訪問的需要,由組織定義的分層安全級別,如unclassified,secret,top,secret, 一個物件有且只有一個sensitivity,分0-15級,s0最低,Target策略預設使用s0
      5. Category:對於特定組織劃分不分層的分類,如FBI Secret,NSA secret, 一個物件可以有多個categroy, c0-c1023共1024個分類, Target 策略不使用category
  • SELinux策略 定義主體讀取物件的規則資料庫,規則中記錄了哪個型別的主體使用哪個方法讀取哪一個物件是允許還是拒絕的,並且定義了哪種行為是充許或拒絕

    • 涉及的名詞
      • 物件(object) 所有可以讀取的物件,包括檔案、目錄和程序,埠等
      • 主體(subject) 程序稱為主體
    • 安全策略實現
      • 打標籤 SELinux中對所有的檔案都賦予一個type的檔案型別標籤,對於所有的程序也賦予各自的一個domain的標籤。domain標籤能夠執行的操作由安全策略裡定義
      • 按規則執行 當一個subject試圖訪問一個object,Kernel中的策略執行伺服器將檢查AVC (訪問向量快取Access Vector Cache), 在AVC中,subject和object的許可權被快取(cached),查詢“應用+檔案”的安全環境。然後根據查詢結果允許或拒絕訪問

2. 設定SELinux

  • 配置SELinux: 1. SELinux是否啟用 2. 給檔案重新打安全標籤 3. 給埠設定安全標籤 4. 設定某些操作的布林型開關

  • 配置SELinux命令

    • 檢視當前SELinux狀態 getenforce: 獲取selinux當前狀態 sestatus :檢視selinux狀態

    • SELinux的狀態:

      • enforcing: 強制,每個受限的程序都必然受限
      • permissive: 允許,每個受限的程序違規操作不會被禁止,只會警告,記錄於審計日誌
      • disabled: 禁用
    • 狀態切換
      • permissive與enforcing切換可以使用命令setenforce 0|1 0: 設定為permissive 1: 設定為enforcing
      • enforcing與disable切換要修改配置檔案,並重啟
  • 配置檔案:

    • /boot/grub/grub.conf優先順序更高

      • CentOS6中/boot/grub/grub.conf CentOS7中/boot/grub2/grub.cfg CentOS6中找到,在kernel行尾新增selinux=0,禁用SELinux

        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=bc5e1202-11ed-42d4-bbec-16c1d408f809 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        

        CentOS7中找到如下行,在後面新增selinux=0禁用SELinux

         linux16 /vmlinuz-0-rescue-e2c96d58ccbf4eb796063f25db8f0029 root=UUID=f5362972-e8db-456e-b3e3-88436aa6b865 ro crashkernel=auto rhgb quiet net.ifnames=0
        
    • /etc/selinux/config 如圖中所示行,修改對應狀態 這裡寫圖片描述

3. 修改SELinux安全標籤

  • 修改全部標籤 touch /.autorelabel為所有檔案重新打標籤,在系統啟動因為標籤不對時使用
  • 檔案重新打安全標籤 注意,打標籤之前要知道這個檔案的標籤型別,不然會破壞檔案,一般文件主

    • 破壞檔案的標籤 方法:將檔案複製出來,再複製回去

      1:#ll  -Z /var/log/messages   
      -rw-r--r--. root root  system_u:object_r_r:var_log_t:s0      /var/log/messages
      檢視messages檔案標籤型別
      2:#cp  /var/log/messages  /root/
      將檔案複製到root下
      3:ll -Z /root/messages  
      -rw-r--r--. root root unconfined_u:unconfined_r:admin_home_t:s0      /root/messages
      檔案型別已經改變
      4:mv  /root/messages    /var/log/ 覆蓋原資料夾檔案
      -rw-r--r--. root root unconfined_u:unconfined_r:admin_home_t:s0      /root/messages
      移動回去,覆蓋原有檔案
      5:logger  "this ia a log" 
      觸發一條日誌,日誌檔案不做記錄,說明檔案已經不起作用
      6:chcon  -t  var_log_t  /var/log/messages
      重新打安全標籤
      7:systenctl restart rsyslog 
      重啟日誌服務
      
    • 重新打安全標籤:

      • 指定型別為檔案修改安全標籤
        • 格式 chcon [OPTION]… [-u USER] [-r ROLE] [-t TYPE] FILE…
        • 選項 -R:遞迴打標
        • 示例 chcon -t var_log_t /var/log/messages
      • 參考其他檔案來修改安全標籤
        • 格式 chcon [OPTION]… –reference=RFILE FILE…
        • 選項 -R:遞迴打標
        • 示例 參考messages檔案為f1.txt檔案重新打安全標籤 chcon --reference /var/log/messages /data/f1.txt
      • 恢復目錄或檔案預設的安全上下文: restorecon [-R] /path/to/somewhere

4. 預設安全上下文查詢與修改

有些時候使用者可能會自建服務目錄,這些目錄沒有在預設上下策略庫中,這時候就可以使用預設安全上下文修改 使用命令semanage,來自policycoreutils-python包

  • 檢視預設的安全上下文 semanage fcontext –l
  • 新增安全上下文

    1. 檢視預設安全上下文相關寫法作為參考

      $semanage fcontext -l|grep data
      /var/lib/stickshift/.*/data(/.*)? 
      
    2. 將目錄/data改為httpd程序可訪問目錄 semanage fcontext -a –t httpd_sys_content_t "/data(/.*)?"
    3. 定義了目錄標籤後,更改其下的檔案標籤,直接恢復目錄的預設上下文 restorecon –R /data
  • 刪除安全上下文 semanage fcontext -d ‘/testdir(/.*)?’

5. SElinux埠標籤

定義了在SElinux策略裡,各種服務可以使用的埠

  • 檢視埠標籤 semanage port –l

  • 新增埠 semanage port -a -t port_label -p tcp|udp PORT semanage port -a -t http_port_t -p tcp 9527

  • 刪除埠 semanage port -d -t port_label -p tcp|udp PORT semanage port -d -t http_port_t -p tcp 9527
  • 修改現有埠為新標籤,將現在管理中的埠,更改到別的服務身上 semanage port -m -t port_label -p tcp|udp PORT semanage port -m -t http_port_t -p tcp 9527
  • 示例:
例如:在http_port_t這樣的標籤裡面再增加一個9527$semanage port -l |grep http
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
$semanage port -a   -t http_port_t  -p  tcp 9527
-t  表示給服務用的標籤
-p  指定使用的協議
-m  表示修改
-d  表示刪除

6. SELinux布林值

嚴格的限定了使用者的某些行為是否被允許,值為on|off或者0|1

  • 檢視bool命令:
    • 格式 getsebool [-a] [boolean] getsebool -a 顯示所有布林值 semanage boolean –l 顯示所有布林值,可以看到描述
$semanage boolean -l 
SELinux boolean         State   Default   Description 
    State 表示當前狀態值 
    Default表示資料庫中的策略期望值
    Description表示描述資訊
  • 檢視修改過的布林值 semanage boolean -l –C
  • 設定bool值命令
    • 格式: setsebool [-P] boolean value(on,off) setsebool [-P] Boolean=value(0,1)
    • 選項 -P表示連同資料庫一起更改,不加只修改當前
    • 示例 setsebool -P samba_enable_home_dirs=1

7. SELinux日誌管理

安裝工具setroubleshoot,可以只搜尋setroubleshoot來查找出錯日誌 yum install setroubleshoot(重啟生效)

  • 篩選錯誤資訊 預設情況下,錯誤資訊會寫入到/var/log/message 詳細日誌放在/var/log/audit/audit.log grep setroubleshoot /var/log/messages

    • 示例: 在配置檔案中修改埠 為9527時,錯誤資訊 grep 9527 /var/log/messages
  • 檢視安全事件日誌說明 篩選出來的錯誤訊息,會有一個編號就是UUID sealert -l UUID

  • 掃描並分析日誌 直接檢視/var/log/audit/audit.log的話,不直觀,沒有格式 加上-a選項可以編排 sealert -a /var/log/audit/audit.log

8. SELinux幫助

  1. 安裝一下兩個文件 yum –y install selinux-policy-devel ( centos7.2) 開發文件 yum –y install selinux-policy-doc man 幫助文件
  2. 安裝好後,更新資料庫 mandb
  3. 將開發文件和幫助文件結合起來看 man -k _selinux
  4. 示例: 例如想要檢視ftp的幫助文件
1:$man -k _selinux|grep ftp
    anon_sftpd_selinux (8) - Security Enhanced Linux Policy for the anon_sftpd processes
    ftpd_selinux (8)     - Security Enhanced Linux Policy for the ftpd processes
    ftpdctl_selinux (8)  - Security Enhanced Linux Policy for the ftpdctl processes
    sftpd_selinux (8)    - Security Enhanced Linux Policy for the sftpd processes
    tftpd_selinux (8)    - Security Enhanced Linux Policy for the tftpd processes
2:$man 8 ftpd_selinux