Linux SELinux 核心概念與管理
一、SELinux 基本概念
SELinux 即安全增強型 Linux(Security-Enhanced Linux),由美國國家安全局(NSA)開發,是一套基于強制訪問控制(MAC)的安全機制,旨在解決傳統 Linux 權限管理的安全隱患。
1. 與傳統權限模型的區別
- DAC(自主訪問控制):
傳統 Linux 的權限管理方式,主體(用戶)對目標文件的訪問僅由文件的 rwx 權限決定。存在安全隱患:通過 suid/sgid 特殊權限可能被濫用,錯誤配置易引發漏洞。 - MAC(強制訪問控制):
SELinux 采用的權限模型,主體(程序)訪問目標文件時,必須同時滿足 DAC 權限和 SELinux 安全策略,否則訪問被拒絕。
2. DAC 與 MAC 的核心差異
特性 | DAC(自主訪問控制) | MAC(強制訪問控制) |
---|---|---|
主體 | 用戶 | 程序(進程) |
決策依據 | 僅文件本身的 rwx 權限 | 文件權限 + SELinux 安全策略 |
靈活性 | 高(用戶可自主修改權限) | 嚴格(策略由系統管理員統一配置) |
安全級別 | 較低(易因配置錯誤導致漏洞) | 較高(強制限制所有訪問行為) |
二、SELinux 原理與特點
1. 核心原理
基于強制訪問控制機制,在傳統權限基礎上,通過定義 “安全上下文標簽” 和 “類型規則”,限制程序對文件 / 資源的訪問:只有當程序的類型與目標文件的類型匹配(符合策略規則)時,訪問才被允許。
2. 主要特點
- 安全上下文標簽(Context):所有文件、進程、端口等都被分配唯一的標簽,用于標識其安全屬性。
- 雙重權限檢查:訪問行為需同時通過傳統 Unix 權限(DAC)和 SELinux 策略(MAC)檢查。
- 細粒度控制:可針對單個程序、文件或端口制定訪問規則,而非僅依賴用戶身份。
三、SELinux 安全策略與模式
1. 安全策略(Policy)
SELinux 通過預定義的策略文件控制訪問規則,常見策略:
- targeted(默認):僅對關鍵服務(如 httpd、sshd)施加嚴格限制,普通程序不受特殊限制,適用于 RHEL/CentOS 等發行版。
- mls(多級安全):最高級別的安全策略,對所有進程和文件實施嚴格的多級訪問控制,配置復雜,適用于高安全需求場景(如軍事、金融)。
2. 運行模式
SELinux 的配置文件為 /etc/selinux/config
(與 /etc/sysconfig/selinux
軟鏈接一致),支持三種運行模式:
- enforcing(強制模式):
啟用 SELinux,嚴格執行策略,不符合規則的訪問被拒絕并記錄日志。 - permissive(警告模式):
不拒絕訪問,但會記錄違反策略的行為(用于調試:判斷問題是服務配置錯誤還是 SELinux 阻擋)。 - disabled(禁用模式):
完全關閉 SELinux,需重啟系統生效。
3. 模式管理命令
-
查看當前模式:
getenforce # 輸出:Enforcing / Permissive / Disabled
[root@zhang3 /]# getenforce Enforcing
-
臨時切換模式(無需重啟,重啟后失效):
setenforce 0 # 切換為 Permissive 模式 setenforce 1 # 切換為 Enforcing 模式
-
永久切換模式:
編輯
/etc/selinux/config
,修改SELINUX
字段后重啟:SELINUX=enforcing # 或 permissive / disabled
四、安全上下文(Context)詳解
安全上下文是 SELinux 的核心標識,由用戶(u)、角色(r)、類型(t) 三部分組成,格式為:user:role:type
。
例如:unconfined_u:object_r:httpd_sys_content_t:s0
1. 查看安全上下文
-
查看文件 / 目錄的上下文:p
ll -Z /abc/aa # 查看文件 aa 的上下文 ll -ldZ /abc/ # 查看目錄 /abc 的上下文
[root@zhang3 /]# ll -Z
lrwxrwxrwx. root root system_u:object_r:bin_t:s0 bin -> usr/bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot
drwxr-xr-x. root root system_u:object_r:device_t:s0 dev
drwxr-xr-x. root root system_u:object_r:etc_t:s0 etc
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
lrwxrwxrwx. root root system_u:object_r:lib_t:s0 lib -> usr/lib***************************
輸出格式解析(以第一行為例)lrwxrwxrwx. root root system_u:object_r:bin_t:s0 bin -> usr/bin從左到右依次為:文件權限與類型:lrwxrwxrwx.
l 表示這是一個符號鏈接(軟鏈接);
后續 rwxrwxrwx 是權限位;
末尾 . 表示該文件受 SELinux 控制。
所有者:root(文件的擁有者用戶)。
所屬組:root(文件所屬的用戶組)。SELinux 安全上下文:system_u:object_r:bin_t:s0
這是核心信息,由 4 部分組成,用冒號分隔:
system_u:用戶(User),表示 SELinux 上下文的用戶(system_u 是系統用戶)。object_r:角色(Role),表示訪問該對象的角色(object_r 是文件 / 目錄等對象的默認角色)。bin_t:類型(Type),最關鍵的部分,決定了進程能否訪問該文件。例如 bin_t 表示這是二進制程序目錄的類型。s0:級別(Level),用于 MLS(多級安全)策略,默認 s0 表示最低級別。文件名 / 鏈接目標:bin -> usr/bin(表示 bin 是指向 usr/bin 的軟鏈接)。
其他行說明
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot
d 表示 boot 是目錄;
boot_t 是 /boot 目錄的 SELinux 類型(用于系統啟動相關文件)。
drwxr-xr-x. root root system_u:object_r:device_t:s0 dev
d 表示 dev 是目錄;
device_t 是 /dev 目錄的 SELinux 類型(用于設備文件,如 /dev/sda 等)。
-
查看進程的上下文:
ps -Z | grep httpd # 查看 httpd 進程的上下文
2. 修改安全上下文
-
臨時修改(重啟或 relabel 后失效):
chcon -t tmp_t /abc/aa # 將 /abc/aa 的類型改為 tmp_t
-t
:指定類型(最常用的上下文部分)。
-
恢復默認上下文:
當手動修改后需還原時,使用restorecon
:restorecon -v /abc/aa # 恢復 /abc/aa 的默認上下文(-v 顯示詳細信息)
-
永久修改上下文:
通過semanage
工具添加規則(需安裝policycoreutils-python
包):# 永久將 /abc 及其子目錄的類型設為 tmp_t semanage fcontext -a -t tmp_t "/abc(/.*)?" restorecon -RFv /abc/ # 應用規則(-R 遞歸,-F 強制)
3. 標簽混亂的修復
當系統上下文標簽錯亂時,可重打所有標簽:
touch /.autorelabel # 創建觸發文件
reboot # 重啟后自動重新標記所有文件(耗時較長)
五、布爾開關(Boolean)管理
布爾開關是 SELinux 中用于動態調整策略的開關,可臨時或永久開啟 / 關閉特定規則(如允許 httpd 訪問用戶家目錄)。
1. 查看布爾開關
getsebool -a # 列出所有布爾開關及其狀態
getsebool -a | grep http # 篩選與 http 相關的開關
2. 修改布爾開關
-
臨時修改
(重啟后失效):
setsebool ftpd_full_access on # 允許 ftp 服務的完全訪問權限
-
永久修改(需
-P
參數):setsebool -P ftpd_full_access on # 永久生效
六、端口標簽管理
SELinux 對端口也有標簽限制,只有當端口標簽與服務類型匹配時,服務才能正常監聽該端口(如 httpd 默認僅允許監聽 http_port_t
類型的端口)。
1. 常用端口標簽操作
-
添加端口標簽:
# 允許 httpd 監聽 8910/tcp 端口(將 8910 標記為 http_port_t) semanage port -a -t http_port_t -p tcp 8910
-
查詢端口標簽:
semanage port -l | grep 8910 # 查看 8910 端口的標簽 semanage port -l | grep http # 查看 http 服務允許的端口
-
修改端口標簽:
semanage port -m -t pegasus_http_port_t -p tcp 8910 # 改為 pegasus 類型
-
刪除端口標簽:
semanage port -d -t pegasus_http_port_t -p tcp 8910
總結
SELinux 通過強制訪問控制(MAC)機制為 Linux 系統提供了額外的安全保障,其核心要素包括:
- 安全上下文(Context):標識文件、進程的安全屬性;
- 布爾開關:動態調整策略規則;
- 端口標簽:限制服務可監聽的端口。
在實際使用中,建議保持 enforcing
模式,通過 setenforce 0
臨時排查問題,再通過 semanage
或布爾開關調整策略,而非直接禁用 SELinux。掌握 SELinux 管理是保障 Linux 系統安全的重要技能。