在 Linux 上用 SELinux 或 AppArmor 實現強制訪
為了解決標準的“使用者-組-其他/讀-寫-執行”許可權以及的限制以及加強安全機制,美國國家安全域性(NSA)設計出一個靈活的強制訪問控制(Mandatory Access Control:MAC)方法 SELinux(Security Enhanced Linux 的縮寫),來限制標準的許可權之外的種種許可權,在仍然允許對這個控制模型後續修改的情況下,讓程式儘可能以最小許可權訪問或在系統物件(如檔案,資料夾,網路埠等)上執行其他操作。
SELinux 和 AppArmor 加固 Linux 安全
另一個流行並且被廣泛使用的 MAC 是 AppArmor,相比於 SELinux 它提供更多的特性,包括一個學習模式,可以讓系統“學習”一個特定應用的行為,以及透過配置檔案設定限制實現安全的應用使用。
在 CentOS 7 中,SELinux 合併進了核心並且預設啟用強制(Enforcing)模式(下一節會介紹這方面更多的內容),與之不同的是,openSUSE 和 Ubuntu 使用的是 AppArmor 。
在這篇文章中我們會解釋 SELinux 和 AppArmor 的本質,以及如何在你選擇的發行版上使用這兩個工具之一併從中獲益。
Security Enhanced Linux 可以以兩種不同模式執行:
強制(Enforcing):這種情況下,SELinux 基於 SELinux 策略規則拒絕訪問,策略規則是一套控制安全引擎的規則。
寬容(Permissive):這種情況下,SELinux 不拒絕訪問,但如果在強制模式下會被拒絕的操作會被記錄下來。
SELinux 也能被禁用。儘管這不是它的一個操作模式,不過也是一種選擇。但學習如何使用這個工具強過只是忽略它。時刻牢記這一點!
使用 getenforce
命令來顯示 SELinux 的當前模式。如果你想要更改模式,使用 setenforce 0
(設定為寬容模式)或 setenforce 1
(強制模式)。
因為這些設定重啟後就失效了,你需要編輯 /etc/selinux/config
配置檔案並設定 SELINUX
變數為 enforcing
、permissive
或 disabled
,儲存設定讓其重啟後也有效:
如何啟用和禁用 SELinux 模式
還有一點要注意,如果 getenforce
返回 Disabled,你得編輯 /etc/selinux/config
配置檔案為你想要的操作模式並重啟。否則你無法利用 setenforce
設定(或切換)操作模式。
setenforce
的典型用法之一包括在 SELinux 模式之間切換(從強制到寬容或相反)來定位一個應用是否行為不端或沒有像預期一樣工作。如果它在你將 SELinux 設定為寬容模式正常工作,你就可以確定你遇到的是 SELinux 許可權問題。
有兩種我們使用 SELinux 可能需要解決的典型案例:
改變一個守護程式監聽的預設埠。
給一個虛擬主機設定 /var/www/html 以外的文件根路徑值。
讓我們用以下例子來看看這兩種情況。
大部分系統管理員為了加強伺服器安全首先要做的事情之一就是更改 SSH 守護程式監聽的埠,主要是為了阻止埠掃描和外部攻擊。要達到這個目的,我們要更改 /etc/ssh/sshd_config
中的 Port 值為以下值(我們在這裡使用埠 9999 為例):
Port 9999
在嘗試重啟服務並檢查它的狀態之後,我們會看到它啟動失敗:
# systemctl restart sshd# systemctl status sshd
檢查 SSH 服務狀態
如果我們看看 /var/log/audit/audit.log
,就會看到 sshd 被 SELinux 阻止在埠 9999 上啟動,因為它是 JBoss 管理服務的保留埠(SELinux 日誌資訊包含了詞語“AVC”,所以應該很容易把它同其他資訊區分開來):
# cat /var/log/audit/audit.log | grep AVC | tail -1
檢查 Linux 審計日誌
在這種情況下大部分人可能會禁用 SELinux,但我們不這麼做。我們會看到有個讓 SELinux 和監聽其他埠的 sshd 和諧共處的方法。首先確保你有 policycoreutils-python
這個包,執行:
# yum install policycoreutils-python
檢視 SELinux 允許 sshd 監聽的埠列表。在接下來的圖片中我們還能看到埠 9999 是為其他服務保留的,所以我們暫時無法用它來執行其他服務:
# semanage port -l | grep ssh
當然我們可以給 SSH 選擇其他埠,但如果我們確定我們不會使用這臺機器跑任何 JBoss 相關的服務,我們就可以修改 SELinux 已存在的規則,轉而給 SSH 分配那個埠:
# semanage port -m -t ssh_port_t -p tcp 9999
這之後,我們就可以用前一個 semanage
命令檢查埠是否正確分配了,即使用 -lC
引數(list custom 的簡稱):
# semanage port -lC# semanage port -l | grep ssh
給 SSH 分配埠
我們現在可以重啟 SSH 服務並透過埠 9999 連線了。注意這個更改重啟之後依然有效。
例 2:給一個虛擬主機設定 /var/www/html 以外的文件根路徑(DocumentRoot)
如果你需要用除 /var/www/html
以外目錄作為文件根目錄(DocumentRoot)(也就是說,比如 /websrv/sites/gabriel/public_html
):
DocumentRoot “/websrv/sites/gabriel/public_html”
Apache 會拒絕提供內容,因為 index.html
已經被標記為了 default_t SELinux
型別,Apache 無法訪問它:
# wget ls -lZ /websrv/sites/gabriel/public_html/index.html
_被標記為 default_t SELinux 型別_
和之前的例子一樣,你可以用以下命令驗證這是不是 SELinux 相關的問題:
# cat /var/log/audit/audit.log | grep AVC | tail -1
檢查日誌確定是不是 SELinux 的問題
要將 /websrv/sites/gabriel/public_html
整個目錄內容標記為 httpd_sys_content_t
,執行:
# semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"
上面這個命令會賦予 Apache 對那個目錄以及其內容的讀取許可權。
最後,要應用這條策略(並讓更改的標記立即生效),執行:
# restorecon -R -v /websrv/sites/gabriel/public_html
現在你應該可以訪問這個目錄了:
# wget
訪問 Apache 目錄
要獲取關於 SELinux 的更多資訊,參閱 Fedora 22 中的 。
AppArmor 的操作是基於寫在純文字檔案中的規則定義,該檔案中含有允許許可權和訪問控制規則。安全配置檔案用來限制應用程式如何與系統中的程式和檔案進行互動。
系統初始就提供了一系列的配置檔案,但其它的也可以由應用程式在安裝的時候設定或由系統管理員手動設定。
像 SELinux 一樣,AppArmor 以兩種模式執行。在 enforce 模式下,應用被賦予它們執行所需要的最小許可權,但在 complain 模式下 AppArmor 允許一個應用執行受限的操作並將操作造成的“抱怨”記錄到日誌裡(/var/log/kern.log
,/var/log/audit/audit.log
,和其它放在 /var/log/apparmor
中的日誌)。
日誌中會顯示配置檔案在強制模式下執行時會產生錯誤的記錄,它們中帶有 audit
這個詞。因此,你可以在 AppArmor 的 enforce 模式下執行之前,先在 complain 模式下嘗試執行一個應用並調整它的行為。
可以用這個命令顯示 AppArmor 的當前狀態:
$ sudo apparmor_status
檢視 AppArmor 的狀態
上面的圖片指明配置 /sbin/dhclient
,/usr/sbin/
,和 /usr/sbin/tcpdump
等處在 enforce 模式下(在 Ubuntu 下預設就是這樣的)。
因為不是所有的應用都包含相關的 AppArmor 配置,apparmor-profiles 包給其它沒有提供限制的包提供了配置。預設它們配置在 complain 模式下執行,以便系統管理員能夠測試並選擇一個所需要的配置。
我們將會利用 apparmor-profiles,因為寫一份我們自己的配置已經超出了 LFCS 的範圍了。但是,由於配置都是純文字檔案,你可以檢視並學習它們,為以後建立自己的配置做準備。
AppArmor 配置儲存在 /etc/apparmor.d
中。讓我們來看看這個資料夾在安裝 apparmor-profiles 之前和之後有什麼不同:
$ ls /etc/apparmor.d
檢視 AppArmor 資料夾內容
如果你再次執行 sudo apparmor_status
,你會在 complain 模式看到更長的配置檔案列表。你現在可以執行下列操作。
將當前在 enforce 模式下的配置檔案切換到 complain 模式:
$ sudo aa-complain /path/to/file
以及相反的操作(complain –> enforce):
$ sudo aa-enforce /path/to/file
上面這些例子是允許使用萬用字元的。舉個例子:
$ sudo aa-complain /etc/apparmor.d/*
會將 /etc/apparmor.d
中的所有配置檔案設定為 complain 模式,反之
$ sudo aa-enforce /etc/apparmor.d/*
會將所有配置檔案設定為 enforce 模式。
要完全禁用一個配置,在 /etc/apparmor.d/disabled
目錄中建立一個符號連結:
$ sudo ln -s /etc/apparmor.d/profile.name /etc/apparmor.d/disable/
要獲取關於 AppArmor 的更多資訊,參閱 以及 文件。
在這篇文章中我們學習了一些 SELinux 和 AppArmor 這兩個著名的強制訪問控制系統的基本知識。什麼時候使用兩者中的一個或是另一個?為了避擴音高難度,你可能需要考慮專注於你選擇的發行版自帶的那一個。不管怎樣,它們會幫助你限制程式和系統資源的訪問,以提高你伺服器的安全性。
關於本文你有任何的問題,評論,或建議,歡迎在下方發表。不要猶豫,讓我們知道你是否有疑問或評論。
譯文出處:
via:
作者: 譯者: 校對:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2334/viewspace-2818339/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於linux下的selinux強制訪問控制Linux
- Linux系統開啟或關閉SELinux。Linux
- Linux 或 Windows 上實現埠對映LinuxWindows
- switch_selinux.sh | 開啟或禁用SELinuxLinux
- 在Linux中,SELinux工作原理是什麼?如何啟用/禁用?Linux
- 在kubernetes裡使用AppArmor限制容器對資源的訪問APP
- 在 Linux 上用 DNS 實現簡單的負載均衡LinuxDNS負載
- 線上直播系統原始碼,強制應用全域性橫屏或豎屏原始碼
- 用WebRTC在Firefox上實現YouTube直播WebFirefox
- Linux上Nginx中開啟SSL模組,實現Https訪問LinuxNginxHTTP
- Docker Desktop 現在可以在 Linux 上使用DockerLinux
- 《Linux-SVN實現http訪問》LinuxHTTP
- css實現強制不換行/自動換行/強制換行CSS
- Linux——防火牆、SELinux規則Linux防火牆
- 在 Linux 上覆制和重新命名檔案Linux
- 什麼是seLinux?Linux關閉seLinux有什麼影響?Linux
- Linux中selinux是什麼意思?SELinux的主要作用有哪些?Linux
- 如何在 Alpine Linux 上啟用或禁用防火牆?Linux防火牆
- 用Abp實現找回密碼和密碼強制過期策略密碼
- css中實現強制不換行/自動換行/強制換行CSS
- 在Linux上實現將檔案隱藏到影像中Linux
- 在 RHEL 或 CentOS 上使用 Patroni 部署 PostgreSQL 以實現高可用性CentOSSQL
- Linux伺服器---關閉selinuxLinux伺服器
- 用windows或ubuntu訪問apfs或mac分割槽WindowsUbuntuMac
- 在 HarmonyOS 上使用 ArkUI 實現計步器應用UI
- 應用程式無響應?如何在Mac上強制退出應用Mac
- 在 Linux 上用 dust 代替 du更直觀Linux
- Linux 臨時和永久關閉 SelinuxLinux
- apparmor 原始碼分析APP原始碼
- Holer實現外網ssh訪問內網linux內網Linux
- 在 Linux 上用 strace 來理解系統呼叫Linux
- Linux在實際中的應用Linux
- 虛擬主機php程式碼實現強制httpsPHPHTTP
- 在英特爾至強 CPU 上使用 🤗 Optimum Intel 實現超快 SetFit 推理Intel
- 盤點最強最實用的Linux命令!Linux
- 短視訊開發app,Android 強制應用全域性橫屏或豎屏APPAndroid
- 開源OA系統搭建教程:在服務或代理中實現sftp的上傳FTP
- Linux系統下安全控制策略SELinux解析Linux