?SELinux

?SELinux

概述

SELinux(Secure Enhanced Linux)是美國國家安全局(NSA)和SCC開發的Linux的一個強制訪問控制的安全模塊。2000年以GNU GPL發布,Linux內核2.6版本后集成在內核中。它能夠限制權限,進程只能訪問那些在他的任務中所需要文件。

Selinux是根據最小權限模型去限制進程在對象(如文件,目錄,端口,網絡接口等)上的訪問或執行其他的操作的權限,這些限制可以在之后根據需要進行修改。簡單來說,系統只給主體的基本功能所需要的權限。

舉例來說:如果系統上的Apache被發現存在一個漏洞,使得攻擊者可以訪問系統上的敏感文件(比如 /etc/passwd 來獲得系統已存在用戶) ,而修復該安全漏洞的 Apache 更新補丁尚未出現。此時 SELinux 可以起到安全效果,因為 /etc/passwd 文件不具有 Apache 的訪問標簽,所以 Apache 對于 /etc/passwd 的訪問會被 SELinux 阻止。因此Selinux能有效的防范0day類的攻擊。 
Tips:0day漏洞,是已經被發現(有可能未被公開),而官方還沒有相關補丁的漏洞。

【注意】:SELinux是在標準Linux基礎上增加了類型強制(TE: Type Enforcement),這就意味著標準Linux和SELinux訪問控制都必須滿足才能能訪問一個對象,例如:如果我們對某個文件有SELinux寫入權限,但沒有該文件的w許可,那么也不能寫該文件

標準Linux SELinux
進程 真實有效的用戶和組ID 安全上下文
文件 訪問列表、文件用戶和組ID 安全上下文
訪問控制基礎 進程用戶/組ID和文件的訪問模式,此訪問模式基于文件的用戶/組ID 在進程類型和文件類型之間允許的許可

了解SELinux

  • DAC、MAC 

    • Linux 上傳統的訪問控制標準是自主訪問控制(DAC),如果一個用戶被授權允許訪問,意味著程序也被授權訪問,那么惡意程序也將有同樣的訪問權。 DAC最根本的弱點是主體容易受到多種多樣的惡意軟件的攻擊,使得惡意程序控制系統。

    • 強制訪問控制(MAC)是基于策略規則決定控制的嚴格程度,策略被用來定義被限制的進程能夠使用哪些資源,默認情況下,沒有被明確允許的行為將被拒絕。

    • 只有同時滿足了【標準Linux訪問控制】和【SELinux訪問控制】時,主體才能訪問對象

  • 安全上下文 

    • 存放在Inode的擴展屬性域的安全元素控制對象的訪問

    • 所有文件和端口資源和進程都具備安全標簽即安全上下文(security context)

    • USER:ROLE:TYPE[LEVEL[:CATEGORY]] 
      USER:類似Linux系統中的UID,提供身份識別,用來記錄身份 
      ? user_u :普通用戶登錄系統后的預設,在targeted policy中users不是很重要 
      ? system_u :開機過程中系統進程的預設 
      ? root :root 登錄后的預設 
      ROLE:對象的角色 
      ? 文件、目錄和設備的role:通常是 object_r; 
      ? 程序的role:通常是 system_r; 
      ? 用戶的role:targeted policy為system_r 
      ? ? 用戶role類似系統中的GID,不同角色具備不同的的權限 
      ? ? 用戶可以具備多個role,但是同一時間內只能使用一個role 
      TYPE:給subject和object劃分為不同的組,給每個主體和系統中的客體定義一個類型;為進程運行提供最低的權限環境; 
      ? type是SElinux security context 中最重要的信息,是 SELinux Type Enforcement的核心,預設值以 _t 結尾 
      ? 當一個TYPE與執行中的
      進程相關聯時,其type也稱為domain,Domain標簽能夠執行的操作由安全策略里定義。 
      ? 當一個文件為多服務共用時,其type為public_content_t 
      LEVEL:定義層次和分類,只用于mls策略中 
      ? LEVEL:代表安全等級,默認為s0目前已經定義的安全等級為s0-s15,等級越來越高 
      ? CATEGORY:代表分類,如FBI Secret,NSA secret,目前已經定義的分類為c0-c1023

    • 實際上下文 
      存放在文件系統中 
      ls -Z #檢查文件、目錄的安全上下文 
      ps -Z #檢查進程的安全上下文,如 ps -eo user,label,pid,comm 或 ps axo … 
      id -Z #顯示了你的shell的安全上下文

    • 期望上下文(默認):存放在二進制的SELinux策略庫中 
      semanage fcontext -l

    • 文件的Security Contex規則 
      ? rpm包安裝的:會根據rpm包內記錄來生成安全上下文; 
      ? 手動創建的文件:會根據policy中規定的來設置安全上下文,如default_t; 
      cp:會重新生成安全上下文; 
      mv:安全上下文則不變;

  • SELinux工作流程 
    當一個subject(進程)試圖訪問一個object(文件),Kernel中的策略執行服務器將檢查AVC (訪問矢量緩存Access Vector Cache), 在AVC中,subject和object的權限被緩存(cached),如果基于AVC中的數據不能做出決定,則請求安全服務器,安全服務器查找“應用+文件”的安全環境。然后根據查詢結果允許或拒絕訪問,拒絕日志在
    /var/log/messages中 

  • ?SELinux

  • SElinux 的狀態 

    • Enforcing(強制模式):越權行為會被記錄并且會被強制拒絕。

    • Permissive(寬容模式):越權行為只會被記錄,不會被拒絕。

    • Disabled(關閉):禁用Selinux,訪問不受控制;

  • 工作模式 

    • strict: centos5,每個進程都受到selinux的控制

    • targeted: 用來保護常見的網絡服務,僅有限進程受到selinux控制,只監控容易被入侵的進程,rhel4只保護13個服務,rhel5保護88個服務

    • minimum:centos7,修改過的targeted,只對選擇的網絡服務

    • mls:提供MLS(多級安全)機制的安全性

    • minimum和mls穩定性不足,未加以應用

配置SELinux

  • Selinux偽文件系統 

    • /selinux目錄,這是一個偽文件系統,存放策略文件,類似于/proc 目錄,我們不需要操作它

  • Selinux的配置文件 

    • /boot/grub/grub.conf 
      使用參數selinux=0禁用SELinux

    • /etc/sysconfig/selinux = /etc/selinux/config 
      SELINUX={enforcing|permissive|disabled} 
      SELINUXTYPE={targeted|mls}

  • ?SELinux

  • 如果需要修改文件和目錄的 SELinux 類型屬性時可以使用三個命令:chcon、semanage fcontext 和 restorecon 命令 。說明:使用 chcon 對文件的類型進行重新標識,重啟系統時將不保留標識。對于文件類型的永久性改變,需要采用 semanage 命令。

  • 查看當前SELinux信息 

    • getenforce #查看Current mode

    • setenforce 0|1 #0: 設置為permissive,1: 設置為enforcing

    • sestatus -v #查看status、Current mode、file mode、關鍵進程Process context(Init,mingetty,sshd)、關鍵文件File contexts(passwd,shadow,login,bash,agetty)

  • chcon – change file SELinux security context 

    • chcon [OPTION]… [-u USER] [-r ROLE] [-t TYPE] FILE…

    • chcon [OPTION]… –reference=RFILE FILE…

    • -R:遞歸

    • CentOS系統自帶的chcon工具只能修改文件、目錄的安全標簽,不能修改端口進行修改

  • restorecon – restore file(s) default SELinux security contexts. 

    • restorecon[-R] /path/file #根據現有的策略庫進行還原,通過chcon修改的type將被還原

  • semanage – SELinux Policy Management tool 

    • yum -y install policycoreutils-python

    • 管理文件的安全上下文(主要是Type) 
      【查看】semanage fcontext -l 
      ? semanage fcontext -l | grep ‘/var/www’ 查看 /var/www 目錄的上下文 
      【增加】semanage fcontext -a -t httpd_sys_content_t ‘/website(/.*)?’
      【刪除】semanage fcontext -d -t Type ‘target’ 
      ? semanage fcontext -d -t httpd_sys_content_t ‘/website(/.*)?’

    • 管理端口的安全上下文 
      【查看】semanage port -l 
      ? semanage port -l | grep -w ‘22’ 
      ? semanage port -l | grep ‘http’ 
      【增加】semanage port -a -t port_label-p tcp|udp PORT 
      ? semanage port -a -t http_port_t -p tcp 8520 
      【刪除】semanageport -d -t port_label-p tcp|udp PORT 
      ? semanage port -d -t http_port_t -p tcp 8520 
      【修改】semanageport -m -t port_label-p tcp|udp PORT 
      ? semanageport -m -t http_port_t-p tcp 8520 #把已經存在的端口給http

  • 管理boolean值 

    • 【查看】getsebool [-a] [boolean] #off還是on 
      ? semanage boolean -l #(current , default),有一句簡單的描述 
      ? semanage boolean -l | grep httpd_enable_homedirs 
      ? semanage boollean -l -C #修改過的布爾值 
      ? getsebool -a | grep httpd_enable_homedirs 
      ? getsebool httpd_enable_homedirs

    • 【設置】setsebool[-P] BOOLEAN [on|off] 
      ? setsebool httpd_enable_homedirs on #重啟丟失 
      ? setsebool -P httpd_enable_homedirs on #永久生效,修改default

  • 日志管理 

    • 通過分析日志找到問題,并根據提示修改SELinux的設置

    • 安全審計日志 /var/log/audit/audit.log #包含了SELinux的錯誤信息

    • 系統整體日志 /var/log/messages

    • 日志分析工具安裝 
      yum install setroublesshoot*(重啟生效)

    • 圖形化的分析工具 
      ?SELinux

    • 命令行分析工具 
      ? grep ‘setroubleshoot’ /var/log/messages 
      ? sealert-l UUID #復制messages中的run 后面的sealert -l xxxx到shell執行 
      ? sealert-a /var/log/audit/audit.log #掃描分析審計日志中的SELinux信息,列出問題和解決辦法

  • SELinux的常見警告類型和解決辦法 

    • 標簽錯誤 
      SELinux 的核心概念就是
      label,無論是文件系統、目錄、文件、文件描述符、端口、消息接口還是網絡接口,一切對象都被貼上了標簽,主體只能訪問功能所需的對象。如 apache 進程被黑客入侵且取得了 uid=0 的管理員權限,但是SELinux策略限制了apache 所能訪問的對象。 
      SELinux 彈出標簽類型的警告可以使用圖形化的 sealert 工具查看,根據提示解決問題。也可以在系統日志中過濾 setroubleshoot 找到問題,根據執行 sealert -l UUID獲得解決辦法,或者sealert -a 掃描 audit.log 審計日志,也可以找到解決辦法。

    • 布爾值錯誤 
      SELinux 策略中記錄了許多程序的默認運行范圍,并且只賦予了基本功能所需的權限。當我們開啟了程序的其他功能時,如打開 apache 訪問私人網站的功能,SELinux會限制 boolen 為 off 的越權行為。 
      Apache 能夠進入用戶的網站目錄,但是無法訪問文件內容,SELinux 會在系統日志中記錄相應的問題,并給出解決辦法。

    • SELinux 策略或引用程序配置有問題 
      如果你沒有修改過程序的配置卻 SELinux 的警告,原因可能是 SELinux 策略有問題,這時可以查看系統日志或審計日志,使用 sealert 工具進行分析。 
      萬般無奈之下可以 setenforce 0 停止 SELinux 
      也可以只對某個進程不啟用 SELinux ,執行 semanage permissive -a httpd_t 則對httpd進程不啟用 SELinux

    • 程序被入侵 
      SELinux 并非入侵檢測系統,所以目前 SELinux 除錯工具無法主動的甄別出入侵企圖,不過當您發現警告內容包含有如下特征時,很有可能對應進程已被黑客攻破了: 
      嘗試關閉 SELinux (/etc/selinux) 或者設定某個 SELinux 布爾值; 
      嘗試載入內核模塊、寫入內核目錄或者引導器鏡像; 
      嘗試讀取 shadow_t 標簽的文件,如 /etc/passwd 那里通常包含了用戶信息; 
      嘗試覆蓋寫入日志文件; 
      嘗試連接不需要的隨機端口或者郵件端口;

SELinux下配置Apache服務

  • SELiniux給httpd定義的文件Type 

    • httpd_sys_content_t 定義http主體可以訪問/var/www(/.*)? 目錄及其文件,創建的文件或復制到的 /var/www/html的文件都有httpd_sys_content_t 類型的標記

    • httpd_sys_script_exec_t 主要用于設置 /var/www/cgi-bin/ 目錄下的 cgi 腳本

    • httpd_sys_content_rw_t 使用 httpd_sys_content_rw_t 的類型標簽讀取和寫腳本標記文件 httpd_sys_script_exec_t 的類型

    • httpd_sys_content_ra_t 使用 httpd_sys_content_ra_t 的類型標簽將讀取和附加標記的腳本文件 httpd_sys_script_exec_t 類型

  • 修改 DocumentRoot 到 /website 

    1. 查看默認的上下文 
      semanage fcontext -l | grep '/var/www' 
      顯示/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0

    2. 修改配置文件 /website 作為DocumentRoot 
      vi /etc/httpd/conf/httpd.conf 
      編輯DocumentRoot “/website” 
      【測試】:訪問顯示錯誤頁面
      ?SELinux

    3. 給 /website 目錄增加httpd進程可訪問的安全標簽 
      chcon -Rv -t httpd_sys_content_t '/website' #一次性生效,立即生效 
      chcon -Rv --reference /var/www/html /website #參考原來的設置,一次性生效,在這種情況下,執行restorecon -R 命令將恢復為default_t 的標簽 
      semanage fcontext -a -t httpd_sys_content_t '/website(/.*)?' 
      restorecon -Rv /website/ #此時 http 的標簽已經是默認標簽了,無需重啟就生效了,訪問也能正常顯示

    4. 小結:SELinux限制了httpd進程可以訪問的靜態頁面路徑必須包含 httpd_sys_content_t 標簽,否則修改了DocumentRoot設置將導致httpd不可訪問

  • 讓 Apache 偵聽非標準端口 

    1. 查看允許的端口 
      semanage prot -l | grep http 
      顯示http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000

    2. 修改conf文件默認偵聽的端口 
      vim /etc/httpd/conf/httpd.conf 
      修改Listen 8520 
      【測試】httpd服務啟動失敗,錯誤提示沒有權限使用該端口,如果是圖形界面也會有相應的SELinux警報顯示
      ?SELinux

    3. SELinux策略添加httpd可訪問的端口 
      semanage port -a -t http_port_t -p tcp 8520 #增加httpd的端口 
      查看
      semanage prot -l | grep http 
      顯示http_port_t tcp 8520, 80, 81, 443, 488, 8008, 8009, 8443, 9000

    4. 再次啟動httpd服務并測試能否訪問:?SELinux

  • 允許 Apache 訪問創建私人網站 
    若是希望用戶可以通過在 ~user/public_html/ 放置文件的方式創建自己的個人網站的話,那么需要在 Apache 策略中允許該操作執行 

    1. 用戶自己創建 ~/public_html 目錄 
      alice] echo “alice’s test page” > ~/public_html/index.html

    2. 修改conf文件,打開UserDir的訪問 
      vi /etc/httpd/conf/httpd.conf 
      注釋掉UserDir disabled 
      打開#UserDir public_html 
      【測試1】不給 apache 賬戶public_html 目錄的訪問權限,即不滿足 DAC的條件
      ?SELinux

    3. 增加 ~alice 訪問控制權限,或 other 的 x 權限 
      setfacl -m u:apache:x ~alice 
      【測試2】給apache用戶 ~alice 目錄的訪問權限,根據umask值public_html是可以被訪問的。此時的結果表明httpd進程已經能夠進入 ~alice/public_html/ 目錄,但是訪問不了網頁文件,SELinux也有相應的報警,此時只滿足DAC的條件
      ?SELinux

    4. 修改SELinux的httpd_enable_homedirs布爾值 
      查看當前開關getsebool -a | grep httpd_enable_h 
      打開開關setsebool httpd_enable_homedirs on 
      【測試3】此時同時滿足DAC和MAC條件,即apache用戶可以訪問 public_html 目錄且SELinux允許httpd訪問pbulic_html
      ?SELinux

    5. 小結:httpd只有同時滿足【標準Linux訪問控制】【SELinux訪問控制】的條件才能訪問一個對象。

    6. Apache 的其他SELinux布爾量 
      ? allow_httpd_anon_write 禁用時這個布爾變量允許的 httpd 到只有標記文件 public_content_rw_t 類型的讀取訪問。啟用此布爾變量將允許的 httpd 寫入到文件標記與一個公共文件目錄包  含一個公共文件傳輸服務,如 public_content_rw_t 類型。 
      ? allow_httpd_mod_auth_pam 啟用此布爾變量允許 mod_auth_pam 模塊訪問 httpd。 
      ? allow_httpd_sys_script_anon_write 這個布爾變量定義 HTTP 腳本是否允許寫訪問到文件標記在一個公共文件傳輸服務 public_content_rw_t 類型。 
      ? httpd_builtin_scripting 這個布爾變量定義 httpd 的腳本的訪問。在這個布爾變量啟用,往往需要為 PHP 內容。 
      ? httpd_can_network_connect 禁用時這個布爾變量防止從網絡或遠程端口發起連接的 HTTP 腳本和模塊。打開這個布爾變量允許這種訪問。 
      ? httpd_can_network_connect_db 禁用時這個布爾變量防止發起一個連接到數據庫服務器的 HTTP 腳本和模塊。打開這個布爾變量允許這種訪問。 
      ? httpd_can_network_relay 打開這個當布爾變量的 httpd 正在使用正向或反向代理。 
      ? httpd_can_sendmail 禁用時這個布爾變量防止發送郵件的 HTTP 模塊。這可以防止垃圾郵件的攻擊漏洞中發現的 httpd。打開這個布爾變量允許 HTTP 模塊發送郵件。 
      ? httpd_dbus_avahi 關閉時這個布爾變量拒絕服務的 avahi 通過 D-BUS 的 httpd 訪問。打開這個布爾變量允許這種訪問。 
      ? httpd_enable_cgi 禁用時這個布爾變量防止 httpd 的執行 CGI 腳本。打開這個布爾變量讓 httpd 的執行 CGI 腳本。 
      ? httpd_enable_ftp_server 開放這個布爾變量會容許的 httpd 作為 FTP 服務器的 FTP 端口和行為。 
      ? httpd_enable_homedirs 禁用時這個布爾變量阻止訪問用戶主目錄的 httpd。打開這個布爾變量允許 httpd 訪問用戶主目錄。 
      ? httpd_execmem 啟用時這個布爾變量允許 httpd 的執行程序需要的內存地址。建議不要啟用這個布爾變量從安全角度來看,因為它減少了對緩沖區溢出,但是某些模塊和應用程序(如 Java 和 Mono 應用)的保護需要這種特權。 
      ? httpd_ssi_exec 這個布爾變量定義服務器端包含(SSI)的網頁中的元素是否可以執行。 
      ? httpd_tty_comm 這個布爾變量定義的 httpd 是否被允許訪問的控制終端。這種訪問通常是不需要的,但是,如配置 SSL 證書文件的情況下,終端訪問所需的顯示和處理一個密碼提示。 
      ? httpd_use_cifs 打開這個布爾變量允許 httpd 訪問 CIFS 文件系統上標記的文件,如通過 Samba 掛載的文件系統,cifs_t 類型。 
      ? httpd_use_nfs 打開這個布爾變量允許 httpd 訪問 NFS 文件系統上的標記文件 nfs_t 類型,如文件系統,通過 NFS 掛載。

獲取幫助

[root@cent6]~>yum install selinux-policy-doc
[root@cent6]~>makewhatis

[root@cent7]~>yum install selinux-policy-devel 
[root@cent7]~>mandb

[root@cent7]~>man -k _selinux

httpd_php_selinux (8) - Security Enhanced Linux Policy for the httpd_ph...
httpd_rotatelogs_selinux (8) - Security Enhanced Linux Policy for the h...
httpd_selinux (8)    - Security Enhanced Linux Policy for the httpd pro...
httpd_suexec_selinux (8) - Security Enhanced Linux Policy for the httpd...
httpd_sys_script_selinux (8) - Security Enhanced Linux Policy for the h...

[root@cent7]~>man 8 httpd_selinux

以上是對 SELinux 功能和基本配置的介紹,對于 Linux 系統的網絡服務,如 Apache 、Smaba、NFS、vsftp、MySQL、Bind DNS 服務等都受到SELinux 策略的嚴格限制,SELinux 僅開放了最基本的運行需求,當這些服務進程需要訪問更多的對象時需要配置 SELinux 策略。至于連接外部網絡、運行腳本、訪問用戶目錄、共享文件等,必須經過一定的 SELinux 策略調整才能充分發揮網絡服務器的作用。 
很多用戶一直覺得 SELinux 的安全級別設置十分麻煩,因此有人裝完系統就禁用 SELinux 但這是不安全的行為。因此系統管理員要權衡易用性和安全性的關系,在不同應用場景達到二者的平衡。


原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/47463

(0)
hellochelloc
上一篇 2016-09-18 13:52
下一篇 2016-09-18 15:48

相關推薦

  • raid各級別簡介

    一. raid 是什么       RAID:(Redundant Array of indenpensive Disk) 獨立磁盤冗余陣列: 磁盤陣列是把多個磁盤組成一個陣列,當作單一磁盤使用,它將數據以分段(striping)的方式儲存在不同的磁盤中,存取數據時,陣列中的相關磁盤一起動作,大幅減低數據的存…

    Linux干貨 2016-02-14
  • bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容

    bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容 bash的基礎特性:命令的執行狀態結果 bash通過狀態返回值來輸出此結果: 成功:0 失?。?-255 命令執行完成之后,其狀態返回值保存于bash的特殊變量$?中。 [root@localhost ~]# ls anaconda-ks.cfg [root@localhost ~]# echo…

    Linux干貨 2018-03-11
  • python 10第一周博客作業

    1. 修改提示符格式 PS1=”\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\]” 2.命令別名:alias NAME=’VALUE’ ? 如果想永久有效,要定義在配置文件中 僅對當前用戶:~/.bashrc ? 對所有用戶有效:/etc/bashrc 3.日期和時間:相關命令 d…

    Linux干貨 2018-03-17
  • 9月9日,系統啟動文件恢復與內核編譯

    1、破解root口令,并為grub設置保護功能 進入grub界面,輸入a鍵,在輸入1,進入單用戶界面,進入系統后修改密碼。 2、破壞本機grub stage1,而后在救援模式下修復之 3、刪除vmlinuz和initramfs文件,無法啟動,恢復之 (1)安裝kernel內核 (2)光盤尋找內核,在復制到/boot目錄下,在修改成對應的,系統會重啟兩次 (3…

    Linux干貨 2016-09-13
  • 用戶 組

    用戶 組    在linux系統中,用戶管理是基于用戶名和密碼的方式進行資源的分配,linux上用戶Username/UID分為以下類別:    管理員: root,0    普通用戶: 1-65535 普通用戶分為:系統用戶和登錄用戶兩種 系統用戶:1-499(cen…

    系統運維 2016-08-04
  • N_28 linux基礎知識

    1.計算機的組成
    2.linux的各發行版
    3.linux的哲學思想
    4.一些linux的基本命令
    5.幫助信息
    6.FHS

    2017-12-01

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-09-23 10:36

    寫的不錯,贊一個。

欧美性久久久久