Linux SELinux(Security-Enhanced Linux)

權限管理

為了加強系統安全性,SELinux 採用強制存取控制(MAC, Mandatory Access Control),不再讓檔案擁有者擁有完全的授權權力。
在 SELinux 中,每個物件(檔案、程式等)都有一個安全標籤(Security Context),記載該物件能夠被什麼主體(subject)以什麼方式操作。

安全標籤查看

ll -Z

範例輸出:

-rw-------.  user user system_u:object_r:admin_home_t:s0  somefile
  • user_u:SELinux 用戶(user)
  • object_r:角色(role)
  • admin_home_t:類型(type)
  • s0:敏感度(level),主要用於 MLS(多層級安全)策略

常見標籤結尾代表意義:

  • _u 結尾:user
  • _r 結尾:role
  • _t 結尾:type

SELinux 設定檔與狀態查詢

SELinux 所有設定都集中於 /etc/selinux/ 目錄下。

查詢 SELinux 狀態與模式

# 查看目前狀態(啟用與否)
sestatus

# 查看當前運行模式
getenforce

常見模式:

  1. Enforcing:強制模式,完全執行 SELinux 安全策略
  2. Permissive:寬鬆模式,僅記錄違規行為,不會阻止操作
  3. Disabled:關閉模式,不執行 SELinux 機制

暫時切換模式(不重開機)

# 切換為 Permissive 模式
setenforce 0

# 切換為 Enforcing 模式
setenforce 1

永久關閉 SELinux(需重開機)

編輯 /etc/selinux/config

# 將下列行修改
SELINUX=disabled   # 完全關閉
# 或
SELINUX=permissive # 僅警告,不阻擋
# 預設是 enforcing

SELinux 布林值設定 setsebool

使用布林參數可微調 SELinux 對特定服務的限制:

基本指令

# 查詢布林設定
getsebool -a

# 啟用某個布林選項
setsebool <布林名> on

# 永久啟用布林選項(加 -P)
setsebool -P <布林名> on

DHCPD

# 允許 dhcpd 使用 LDAP 後端
setsebool -P dhcpd_use_ldap on

# 允許 dhcpc 用戶端執行 iptables
setsebool -P dhcpc_exec_iptables on

BIND(DNS)

# 允許 named 可寫主區域檔
setsebool -P named_write_master_zones on

# 允許 named 綁定 HTTP port(非標準行為)
setsebool -P named_tcp_bind_http_port on

HTTPD

# 允許 httpd 執行 CGI script
setsebool -P httpd_enable_cgi on

# 允許 httpd 存取使用者家目錄
setsebool -P httpd_enable_homedirs on

# 手動設定標籤(非永久)
chcon -R -t httpd_sys_content_t /home/user/public_html

VSFTPD

# 允許使用者 FTP 家目錄
setsebool -P ftp_home_dir on

# 允許匿名用戶寫入
setsebool -P ftpd_anon_write on

SAMBA

# 允許 Samba 存取家目錄
setsebool -P samba_enable_home_dirs on

# 允許掛接遠端 Samba 家目錄
setsebool -P use_samba_home_dirs on

NFS

# 允許 NFS 分享唯讀資料
setsebool -P nfs_export_all_ro on

# 允許 NFS 分享可寫資料
setsebool -P nfs_export_all_rw on

# 允許 NFS 掛載使用者家目錄
setsebool -P use_nfs_home_dirs on

semanage 指令(進階設定)

安裝必要套件

# 確保 semanage 可用
dnf install -y policycoreutils-python-utils

# 查詢套件來源
dnf provides '*/semanage'

設定 Web 路徑標籤(永久)

# 將目錄加入 SELinux 的 context 設定中
semanage fcontext -a -t httpd_sys_content_t "/data/wwwroot(/.*)?"

# 套用標籤(恢復預設或自訂標籤)
restorecon -Rv /data/wwwroot

手動設定 Web 安全標籤

暫時設定(執行 chcon,重開機後會失效)

chcon -R -t httpd_sys_content_t /path/to/your/directory

永久設定

編輯 /etc/selinux/targeted/contexts/files/file_contexts.local

/var/www/html(/.*)?    system_u:object_r:httpd_sys_content_t:s0

接著套用設定:

restorecon -R -v /var/www/html

補充參考資源