Linux SELinux 核心概念與管理

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 軟鏈接一致),支持三種運行模式:

  1. enforcing(強制模式)
    啟用 SELinux,嚴格執行策略,不符合規則的訪問被拒絕并記錄日志。
  2. permissive(警告模式)
    不拒絕訪問,但會記錄違反策略的行為(用于調試:判斷問題是服務配置錯誤還是 SELinux 阻擋)。
  3. 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 系統安全的重要技能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917907.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917907.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git 中**未暫存**和**未跟蹤**的區別:

文件狀態分類 Git 中的文件有以下幾種狀態: 工作區文件狀態: ├── 未跟蹤 (Untracked) ├── 已跟蹤 (Tracked)├── 未修改 (Unmodified) ├── 已修改未暫存 (Modified/Unstaged)└── 已暫存 (Staged)1. 未跟蹤 (Untracked) 定義:Gi…

前端1.0

目錄 一、 什么是前端 二、 HTML 1.0 概述 2.0 注釋 三、開發環境的搭建 1.0 插件 2.0 筆記 四、 常見標簽(重點) 四、案例展示(圖片代碼) 五、CSS引入 一、 什么是前端 web前端 用來直接給用戶呈現一個一個的網頁 …

Flutter鏡像替換

一、核心鏡像替換(針對 Maven 倉庫) Flutter 依賴的 Google Maven 倉庫(https://maven.google.com 或 https://dl.google.com/dl/android/maven2)可替換為國內鏡像,常見的有:阿里云鏡像(推薦&am…

MATLAB實現的改進遺傳算法用于有約束優化問題

基于MATLAB實現的改進遺傳算法(GA)用于有約束優化問題的代碼,包括處理非線性約束。此代碼通過引入懲罰函數和修復機制,有效處理約束條件,提高算法的魯棒性和收斂速度。 1. 定義優化問題 % 定義目標函數 function f ob…

Qt子類化QWidget后,使用setStyleSheet設置樣式無效的解決方案

關鍵代碼&#xff1a; #include <QPainter> #include <QStyleOption>void paintEvent(QPaintEvent *e) {QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(e); }定義…

【python中級】關于Flask服務在同一系統里如何只被運行一次

【python中級】關于Flask服務在同一系統里如何只被運行一次 1.背景 2.方案1 2.方案2 1.背景 python Flask實現的一個http服務,打包成應用程序exe后在windows10系統運行; 由于我會不斷的更新這個http服務,我希望運行這個http服務的時候之前的http服務被停掉; 即實現 Pytho…

git配置公鑰/密鑰

遇到 “gitgithub.com: Permission denied (publickey)” 錯誤通常意味著你嘗試通過 SSH 連接到 GitHub 時&#xff0c;SSH 密鑰沒有被正確設置或者 GitHub 無法識別你的公鑰。這里有幾個步驟可以幫助你解決這個問題&#xff1a; 檢查 SSH 密鑰 首先&#xff0c;確保你已經在本…

【機器學習】“回歸“算法模型的三個評估指標:MAE(衡量預測準確性)、MSE(放大大誤差)、R2(說明模型解釋能力)

文章目錄一、MAE、MSE、r概念說明二、MAE&#xff08;平均絕對誤差&#xff09;&#xff1a;用"房價預測"理解誤差測量三、MSE&#xff08;均方誤差&#xff09;&#xff1a;誤差的"放大鏡"1、概念說明2、 sklearn代碼實踐3、流程總結四、R&#xff1a;理解…

智慧城市SaaS平臺|市容環衛管理系統

【生活垃圾中轉設施監管】1) 設施信息管理a) 設施基本信息支持記錄中轉設施的名稱、位置、類型、容量、負責人等基本信息。b) 設施分布地圖支持通過GIS地圖展示中轉設施的分布情況&#xff0c;支持地圖查詢和導航。2) 垃圾收運監控a) 垃圾收運記錄支持記錄垃圾收運的時間、車輛…

JAVA-13常用類(2025.08.02學習記錄)

String類String類equals方法String類compareTo方法String類valueOf方法boolean參數內存分析_字符串拼接只會在內存中開辟一個對象內存分析_字符串new創建對象內存分析_變量和字符串拼接字節碼執行過程String類內存分析package com.cn;public class test01 {public static void …

QT----簡單的htttp服務器與客戶端

HTTP協議學習 協議的相關學習可以參考這篇 csdn學習連接 總體流程如下 HTTP服務器 監聽ip和端口,有連接時接收請求,發送回復 server.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_httpServer.h" #include <QTcpServer> #include &l…

飛 算 JavaAI 解 析:有 了 它,麻 麻 再 也 不 用 擔 心 我 不 會 寫 代 碼 了!

聲 明&#xff1a;本 篇 博 客 為 測 評 體 驗 非 廣 告。 文 章 目 錄一、產 品 簡 介二、注 冊 與 上 手方 法 一 - - - 從 IDEA 插 件 市 場 安 裝方 法 二產 品 使 用三、產 品 體 驗智 能 引 導 功 能理 解 需 求設 計 接 口表 結 構 設 計處 理 邏 輯生 成 源 碼Java ch…

iOS混淆工具有哪些?在集成第三方 SDK 時的混淆策略與工具建議

許多 iOS 項目中&#xff0c;不可避免地會集成各種第三方 SDK&#xff0c;比如支付、統計、廣告、社交登錄等。這些 SDK 常常存在逆向被 Hook 或提取業務邏輯的風險&#xff0c;尤其是在流程敏感或要求合規的行業中。 當你無法對第三方源碼進行控制或重新編譯時&#xff0c;混淆…

【學習筆記之redis】刪除緩存

有一串這個代碼&#xff0c;staffEmailList這個key值里面的數據是錯誤的我需要刪除它&#xff0c;把數據新的數據加載到redis緩存中。 public EmailAddressRespDTO getAllEmailAddress() { List<EmailAddressRespDTO> staffEmailList redisCache.getCacheList("s…

Redis 持久化機制淺析

1. 持久化機制的作用 Redis 是基于內存的數據結構數據庫&#xff0c;雖然讀寫性能非常高&#xff0c;但所有數據默認保存在內存中。一旦服務器宕機、進程意外崩潰或容器重啟&#xff0c;內存中的數據將全部丟失。這對于生產環境的可用性與可靠性是極其危險的。因此&#xff0c;…

使用MatterJs物理2D引擎實現重力和鼠標交互等功能,有點擊事件(盒子堆疊效果)

使用MatterJs物理2D引擎實現重力和鼠標交互等功能&#xff0c;有點擊事件&#xff08;盒子堆疊效果&#xff09; 效果圖&#xff1a;直接上代碼&#xff0c;我是用的是html&#xff0c;使用了MatterJs的cdn&#xff0c;直接復制到html文件中然后在瀏覽器打開即可 <!DOCTYPE …

如何玩轉 Kubernetes K8S

在容器化時代&#xff0c;雖然Docker已經很強大了&#xff0c;但是在實際使用上還是有諸多不便&#xff0c;比如集群管理、資源調度、文件管理等等。 不過目前也涌現了很多解決方案&#xff0c;比如 Mesos、Swarm、Kubernetes 等等&#xff0c;其中谷歌開源的 Kubernetes就是其…

論文閱讀筆記:Dataset Condensation with Gradient Matching

論文閱讀筆記&#xff1a;Dataset Condensation with Gradient Matching1. 解決了什么問題&#xff1f;(Motivation)2. 關鍵方法與創新點 (Key Method & Innovation)2.1 核心思路的演進&#xff1a;從參數匹配到梯度匹配2.2 算法實現細節 (Implementation Details)3. 實驗結…

網安學習no.22

一、基礎系統信息命令&#xff08;簡單入門&#xff09;uname作用&#xff1a;查看系統內核信息示例&#xff1a;uname -a&#xff08;顯示完整內核版本、主機名、硬件架構等&#xff09;hostname作用&#xff1a;查看或設置主機名示例&#xff1a;hostname&#xff08;顯示當前…

AJAX的引入

是的&#xff0c;AJAX 的一個主要特點就是通過 局部刷新 來實現與服務器的交互&#xff0c;而不需要重新加載整個頁面。通過 AJAX&#xff0c;JavaScript 可以發送異步的 HTTP 請求&#xff0c;接收到響應數據后&#xff0c;更新頁面的某個部分&#xff08;DOM&#xff09;。這…