深入理解 Linux 文件權限:從 ACL 到擴展屬性,解剖底層技術細節與命令應用

Linux 以其強大而精密的文件權限和屬性管理機制著稱,這一體系不僅是系統安全的關鍵基石,還為靈活性和擴展性提供了堅實支撐。從傳統的九位權限模型到訪問控制列表(ACL)、擴展文件屬性(Extended Attributes)以及文件屬性,Linux 在內核與文件系統層面的協同設計,構建了一個層次分明且功能豐富的權限管理框架。本文將深入剖析這些機制的底層實現原理,詳細闡述相關查看與設置命令的使用方法,幫助讀者全面理解其技術本質與操作細節。


一、傳統文件權限的原理與命令應用

1.1 底層原理

Linux 的傳統文件權限遵循 POSIX 標準,通過九位權限位(rwxrwxrwx)定義訪問控制:

  • 讀(r):允許讀取文件內容或列出目錄條目。
  • 寫(w):允許修改文件內容或增刪目錄中的條目。
  • 執行(x):允許運行可執行文件或進入目錄。

這些權限信息存儲在文件系統的 inode(索引節點)中。每個文件或目錄關聯一個唯一的 inode,其中的 mode 字段(16 位)承載權限數據,低 12 位具體劃分為:

  • 9 位常規權限:按屬主(owner)、屬組(group)、其他人(others)分組,每組三位(rwx)。
  • 3 位特殊權限:包括 SUID(Set User ID)、SGID(Set Group ID)和 Sticky 位,用于擴展權限行為。

權限與用戶身份(UID)和組身份(GID)綁定,分別存儲在 inode 的 i_uidi_gid 字段中。內核通過虛擬文件系統(VFS)層執行權限檢查,流程如下:

  1. 獲取調用進程的 有效 UID 和 GID,可能因 SUID 或 SGID 被調整。
  2. 從目標文件的 inode 中提取 mode 字段。
  3. 依次比對屬主、屬組和其他人的權限位,判斷是否滿足操作要求。
  4. 若權限不足,返回 EACCES(權限拒絕)錯誤。

特殊權限的實現依賴內核對進程上下文的動態調整:

  • SUID:執行時,進程的權限以文件屬主的 UID 運行,而非調用者的 UID。
  • SGID:對目錄應用時,新建文件繼承目錄的 GID;對文件應用時,以屬組權限執行。
  • Sticky:限制非屬主用戶刪除目錄中的文件,即使有寫權限。

1.2 查看與設置命令

  • 查看權限:ls -l
    顯示文件的權限、屬主和屬組信息:

    ls -l script.sh
    -rwxr-xr-x 1 alice users 1024 Mar 1 14:30 script.sh
    
    • -rwxr-xr-x:屬主 rwx(7),屬組 r-x(5),其他 r-x(5),八進制為 0755
    • aliceusers 分別對應 UID 和 GID 的符號表示。
  • 查看詳細信息:stat
    提供 inode 的完整元數據:

    stat script.sh
    # 輸出(部分):
    Access: (0755/-rwxr-xr-x)  Uid: (1000/alice)   Gid: (100/users)
    
  • 設置權限:chmod

    • 符號模式:針對特定用戶組調整權限:
      chmod u+x script.sh        # 屬主添加執行權限
      chmod g-w,o-r script.sh    # 組移除寫權限,其他移除讀權限
      
    • 八進制模式:一次性設定所有權限:
      chmod 644 report.txt       # 屬主讀寫(6),組和其他只讀(4)
      ls -l report.txt
      -rw-r--r-- 1 alice users 0 Mar 1 14:30 report.txt
      
  • 設置特殊權限:chmod

    • SUID
      chmod u+s script.sh
      ls -l script.sh
      -rwsr-xr-x 1 alice users 1024 Mar 1 14:30 script.sh
      
    • SGID
      chmod g+s /shared
      ls -ld /shared
      drwxr-sr-x 2 alice users 4096 Mar 1 14:30 /shared
      
    • Sticky
      chmod +t /tmp
      ls -ld /tmp
      drwxrwxrwt 10 root root 4096 Mar 1 14:30 /tmp
      
  • 設置屬主與組:chownchgrp

    • 修改屬主:
      chown bob script.sh
      
    • 修改屬組:
      chgrp dev script.sh
      
    • 同時修改:
      chown bob:dev script.sh
      ls -l script.sh
      -rwxr-xr-x 1 bob dev 1024 Mar 1 14:30 script.sh
      

1.3 局限性

傳統權限模型的靜態設計和粒度不足限制了其在復雜場景下的應用。例如,無法為特定用戶單獨授權,需依賴組管理,多人協作需頻繁調整組,這些局限性增加了操作復雜性和誤操作風險。


二、訪問控制列表(ACL)的原理與命令應用

2.1 底層原理

訪問控制列表(ACL)是對傳統權限的擴展,旨在實現更精細的權限控制。其核心數據存儲在文件系統的 擴展屬性 中,分為兩種類型:

  • 訪問 ACL:存儲于 system.posix_acl_access,定義文件的當前訪問權限。
  • 默認 ACL:存儲于 system.posix_acl_default,僅適用于目錄,控制新建文件或子目錄的初始權限。

ACL 的數據結構由多個 ACE(Access Control Entry,訪問控制條目) 組成,每個 ACE 包含:

  • 類型:如 ACL_USER(特定用戶)、ACL_GROUP(特定組)、ACL_MASK(掩碼)。
  • 標識符:關聯的 UID 或 GID。
  • 權限rwx 的位組合。

ACL 的底層實現依賴文件系統的元數據擴展能力。內核通過 VFS 層處理 ACL 的權限檢查,具體流程如下:

  1. 調用文件系統的 get_acl() 函數,從擴展屬性中讀取 ACL 數據。
  2. 若檢測到擴展 ACL,則覆蓋傳統權限的檢查邏輯。
  3. 遍歷所有 ACE,匹配調用進程的 UID 或 GID,確定適用權限。
  4. 掩碼(Mask)機制:通過 ACL_MASK 定義擴展條目(除屬主和基本組外)的權限上限,確保權限不會超出預期范圍。
  5. 繼承邏輯:當創建新文件時,內核檢查父目錄的 system.posix_acl_default,并將其復制到新文件的 system.posix_acl_access 中。

ACL 的實現需要文件系統支持(如 ext4xfsbtrfs),并通過掛載選項 acl 啟用,例如在 /etc/fstab 中添加 acl 參數。

2.2 查看與設置命令

  • 查看 ACL:getfacl
    用于查看文件的 ACL 配置,返回詳細的權限條目:

    getfacl /projects
    # 輸出:
    # file: projects
    # owner: alice
    # group: users
    user::rwx
    user:bob:rwx
    user:carol:r--
    group::r-x
    mask::rwx
    other::r-x
    
    • 常用選項
      • -R:遞歸顯示子目錄和文件的 ACL。
      • -p:顯示絕對路徑,避免相對路徑歧義。
      • -c:省略注釋行(如 # file:),簡化輸出。
  • 設置 ACL:setfacl

    • 修改權限(-m
      setfacl -m u:bob:rwx,u:carol:r /projects
      
      為用戶 bob 設置讀寫執行權限,為 carol 設置只讀權限。
    • 設置默認 ACL(-d
      setfacl -d -m u:bob:rwx /projects
      
      確保 /projects 下的新建文件自動繼承 bob 的 rwx 權限。
    • 調整掩碼
      setfacl -m mask:r-- /projects
      getfacl /projects
      # user:bob:rwx    #effective:r--
      
      掩碼將 bob 的實際權限限制為只讀。
    • 移除 ACL
      setfacl -x u:carol /projects  # 刪除 carol 的 ACL 條目
      setfacl -b /projects          # 清除所有 ACL,恢復傳統權限
      

三、擴展屬性(Extended Attributes)的原理與命令應用

3.1 底層原理

擴展屬性(Extended Attributes,簡稱 EA)是文件系統提供的元數據擴展機制,以鍵值對的形式存儲附加信息,不影響文件的主要內容。EA 被劃分為多個命名空間:

  • user.:用戶自定義屬性,普通用戶可操作(需啟用 user_xattr)。
  • system.:系統專用屬性,如 ACL 數據(system.posix_acl_access)。
  • security.:安全相關屬性,如 SELinux 的上下文。
  • trusted.:僅 root 可訪問的高權限屬性。

擴展屬性的存儲方式因文件系統不同而異:

  • ext4:小型屬性直接嵌入 inode 的額外空間(若啟用 inline_xattr),大型屬性存儲在單獨的數據塊中,通過 inode 的 i_file_acl 字段引用。
  • xfs:采用 B+ 樹結構管理,支持高效檢索和大容量存儲。
  • btrfs:將擴展屬性集成到文件系統的鍵值樹中,與其他元數據統一管理。

內核通過系統調用(如 setxattr()getxattr()removexattr())操作擴展屬性,VFS 層負責將請求轉發到具體的文件系統實現。這些屬性的訪問受限于文件的所有權和掛載選項(如 user_xattr)。

3.2 查看與設置命令

  • 查看屬性:getfattr
    用于提取文件的擴展屬性:

    getfattr -d report.pdf
    # 輸出:
    # file: report.pdf
    user.description="Project report"
    
    • 常用選項
      • -n <name>:指定查看某個屬性,例如 getfattr -n user.description report.pdf
      • -R:遞歸查看目錄下的所有文件屬性。
      • -e hex:以十六進制格式輸出原始數據,便于調試。
  • 設置屬性:setfattr

    • 添加或修改屬性
      setfattr -n user.description -v "Project report" report.pdf
      
      設置鍵 user.description 的值為 “Project report”。
    • 移除屬性
      setfattr -x user.description report.pdf
      
      刪除指定的擴展屬性。

四、文件屬性的原理與命令應用

4.1 底層原理

文件屬性存儲在 inode 的 flags 字段(32 位),為文件操作提供額外的限制或優化。常見的屬性包括:

  • EXT4_IMMUTABLE_FL(i:表示文件不可改變(immutable),禁止修改內容、刪除、重命名或創建硬鏈接。
  • EXT4_APPEND_FL(a:表示文件僅允許追加寫入,禁止覆蓋現有內容。
  • EXT4_EXTENTS_FL(e:表示文件數據使用 extents(連續范圍)存儲,而非傳統的塊鏈表,提升大文件的讀寫效率。

這些屬性的實現依賴內核在文件操作時的檢查邏輯:

  • i 屬性:內核攔截 writeunlinkrenamelink 等系統調用,返回 EPERM(操作不被允許)。只有 root 或具有 CAP_LINUX_IMMUTABLE 能力的用戶可以設置或移除此屬性。
  • a 屬性:內核強制文件以追加模式(O_APPEND)打開,阻止覆蓋寫入操作,常用于日志文件保護。
  • e 屬性:由文件系統(如 ext4)自動管理,標記文件是否使用 extents 存儲數據。它與權限無關,僅優化存儲結構,無法通過用戶命令手動設置或移除。

文件屬性的存儲和檢查完全依賴 inode 的 flags 字段,具體位定義在內核源碼(如 fs/ext4/ext4.h)中。這些屬性與傳統權限和 ACL 獨立運行,形成額外的保護層。

4.2 查看與設置命令

  • 查看屬性:lsattr
    顯示文件的屬性標志:

    lsattr /etc/resolv.conf
    ----i----------- /etc/resolv.conf
    
    • 輸出解析i 表示 immutable,- 表示未設置其他屬性。
    • 常用選項
      • -R:遞歸查看目錄及其內容的屬性。
      • -a:包括隱藏文件(如 . 開頭的文件)。
      • -d:僅顯示目錄自身的屬性,而非其內容。
  • 設置屬性:chattr

    • 添加屬性
      sudo chattr +i /etc/resolv.conf   # 設置不可變屬性
      sudo chattr +a /var/log/messages  # 設置僅追加屬性
      
      • 檢查效果:
        echo "test" > /etc/resolv.conf   # 失敗:Operation not permitted
        echo "test" >> /var/log/messages # 成功,僅追加
        
    • 移除屬性
      sudo chattr -i /etc/resolv.conf   # 移除不可變屬性
      sudo chattr -a /var/log/messages  # 移除僅追加屬性
      
    • 注意e 屬性無法通過 chattr 設置或移除,它由 ext4 文件系統在創建大文件時自動應用。

五、總結

Linux 文件權限體系通過多層次的設計實現了從基礎到高級的管理能力:

  • 傳統權限:基于 inode 的 mode 字段,提供靜態的權限控制,通過 ls -l 查看,chmodchown 設置。
  • ACL:利用擴展屬性實現動態權限分配,getfacl 查看,setfacl 配置。
  • 擴展屬性:為元數據擴展提供基礎,getfattr 查看,setfattr 操作。
  • 文件屬性:通過 inode 的 flags 字段增加操作限制,lsattr 查看,chattr 設置。

這些機制在內核 VFS 和文件系統的協同下,結合 inode、擴展屬性等底層數據結構,形成了 Linux 文件管理的核心框架。

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

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

相關文章

劍指Offer35- - 鏈表

1. 題目描述 這題題意感覺說的不是很清楚&#xff0c;容易讓人產生歧義&#xff01;其實題意很簡單&#xff0c;給你一個鏈表 head&#xff0c;你深拷貝它&#xff0c;然后返回即可&#xff0c;注意不能修改原鏈表 /* // Definition for a Node. class Node { public:int val;N…

C 語言常用關鍵字詳解:static、const、volatile

C 語言常用關鍵字詳解&#xff1a;static、const、volatile 文章目錄 C 語言常用關鍵字詳解&#xff1a;static、const、volatile1. static 關鍵字1.1 用于局部變量示例&#xff1a; 1.2 用于全局變量示例&#xff1a; 1.3 用于函數示例&#xff1a; 2. const 關鍵字2.1 用于局…

Centos7本地部署阿里Qwen2-7B模型

1.從hagging face下載模型 2.把下載的模型文件&#xff0c;放到/usr/local/Qwen2-7B目錄下 3.創建虛擬環境&#xff0c;安裝依賴 1.環境安裝 sudo yum update -y sudo yum install -y python3 python3-pip git 2.創建虛擬環境并激活 python3 -m venv qwen2_env source qwen2_…

群暉監控套件通過ONVIF協議添加海康攝像頭

1. 首先登錄錄像機 通道管理 找到每個攝像頭的IP地址 2. 登錄某個攝像頭 配置 3. 添加用戶名&#xff08;注意不能是admin&#xff09; 設置賬戶密碼 用戶類型選管理員 4. 群暉里面添加攝像頭&#xff0c;自動搜索&#xff0c;添加剛剛那個IP的攝像頭 5. 驗證…

【C++】 —— 筆試刷題day_8

一、求最小公倍數 題目解析 題目很簡單&#xff0c;給定兩個數a和b求它們的最小公倍數。 算法思路 對于求兩個數的最小公倍數問題&#xff0c;想必已經非常熟悉了&#xff1b; 在之前學校上課時&#xff0c;記得老師提起過&#xff0c;最小公倍數 兩個數的乘積 除以最大公約數…

MTK Android12-Android13 設置系統默認語言

Android 系統&#xff0c;默認語言 文章目錄 需求&#xff1a;場景 參考資料實現方案實現思路編譯腳本熟悉-平臺熟悉mssi_64_cnkernel-4.19 解決方案修改文件-實現方案 源碼分析PRODUCT_LOCALES 引用PRODUCT_DEFAULT_LOCALE 定義get-default-product-locale 方法定義PRODUCT_DE…

系統如何查找文件?inode號又是什么?

下面分別詳細解釋您提到的三個問題&#xff1a; “文件系統怎么定位文件”、“inode 是什么”、“為什么刪除后還可能被占用”。 一、文件系統怎么定位文件 1.1 目錄與文件名并不直接存儲文件數據 在常見的 Unix/Linux 文件系統&#xff08;如 ext4、xfs&#xff09;或類似的…

05-SpringBoot3入門-整合SpringMVC(配置靜態資源、攔截器)

1、說明 在01-SpringBoot3入門-第一個項目-CSDN博客中&#xff0c;其實就已經整合了SpringMVC。下面講解怎么配置靜態資源和攔截器 2、配置靜態資源 命名&#xff1a;static&#xff08;文件夾&#xff09; 位置&#xff1a;src/main/resources 編寫一個html文件 訪問 http:/…

Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測

聚劃算&#xff01;Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測 目錄 聚劃算&#xff01;Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 聚劃算&#xff01;Tran…

樹莓派瀏覽器配置全解析:從輕量系統到網頁應用平臺

樹莓派&#xff08;Raspberry Pi&#xff09;不僅是嵌入式開發的入門利器&#xff0c;也因其低成本和強大的社區支持而成為物聯網、數字標牌、教育培訓等領域的熱門平臺。在很多應用中&#xff0c;運行一個瀏覽器并作為 Web 前端展示、操作或交互的能力顯得尤為關鍵。 但在資源…

初識Qt(一)

本文部分ppt、視頻截圖原鏈接&#xff1a;萌馬工作室的個人空間-萌馬工作室個人主頁-嗶哩嗶哩視頻 1. Qt是什么&#xff1f; Qt是一個跨平臺的C應用程序開發框架&#xff0c;它既為圖形用戶界面(GUI)程序開發提供了強大支持&#xff0c;也能用于開發非GUI的控制臺程序、服務端…

六十天前端強化訓練之第三十二天之Babel 轉譯配置大師級深度講解

歡迎來到編程星辰海的博客講解 看完可以給一個免費的三連嗎&#xff0c;謝謝大佬&#xff01; 目錄 一、核心概念與知識體系詳解 1. Babel 工作原理全景解析 二、完整配置方案&#xff08;帶詳細注釋&#xff09; 1. 進階版 .babelrc 配置 2. Webpack 集成配置&#xff08…

智能提示詞生成器:助力測試工程師快速設計高質量測試用例

在軟件測試中,測試用例設計方法的選擇和實施是確保軟件質量的重要步驟。測試工程師經常需要根據不同的測試場景、參數維度和業務需求,設計出覆蓋率高且有效的測試用例。然而,設計測試用例并非易事,特別是在面對復雜的業務邏輯時。 為了幫助測試工程師高效生成測試用例提示…

beanie.exceptions.CollectionWasNotInitialized

遇到這樣的情況不要慌&#xff0c;不要慌 1&#xff1a;檢查模型是否已經初始化&#xff1a; class TaskModel(Document):"""定時任務模型"""task_id: str Field(default_factorylambda: str(uuid.uuid4()), # 新增默認值description"任…

【CVE-2025-30208】| Vite-漏洞分析與復現

漏洞簡介 CVE-2025-30208 是 Vite 開發服務器中的一個任意文件讀取漏洞。該漏洞允許攻擊者通過特定的 URL 參數繞過訪問控制&#xff0c;從而讀取服務器上的敏感文件&#xff08;如 /etc/passwd 或 C:\windows\win.ini&#xff09;。 該漏洞主要影響以下版本的 Vite&#xff…

將 Markdown 表格結構轉換為Excel 文件

在數據管理和文檔編寫過程中&#xff0c;我們經常使用 Markdown 來記錄表格數據。然而&#xff0c;Markdown 格式的表格在實際應用中不如 Excel 方便&#xff0c;特別是需要進一步處理數據時。因此&#xff0c;我們開發了一個使用 wxPython 的 GUI 工具&#xff0c;將 Markdown…

Golang使用 ip2region 查詢IP的地區信息

利用 ip2region 進行 IP 地址定位 import ("fmt""log""github.com/lionsoul2014/ip2region/binding/golang/xdb" )func main() {ip : "213.118.179.98"dbPath : ".\\cmd\\ip\\ip2region.xdb"// 1、初始化查詢器//searcher,…

對匿名認證的理解

概述&#xff1a;在 Spring Security 中&#xff0c;** 匿名認證&#xff08;Anonymous Authentication&#xff09;** 是一種特殊的認證機制&#xff0c;用于處理未提供有效憑證的請求。 匿名認證的本質 目的&#xff1a;允許未認證用戶訪問特定資源。原理&#xff1a; 當請求…

C++調用Python

Python安裝 地址&#xff1a; python官網 可以根據需要下載對應的版本。 調用python python測試腳本 # my_script.py import sys import jsondef calculate(a, b):return a * b 10 # 示例計算邏輯if __name__ "__main__":# 從命令行參數讀取 JSON 字符串try…

工程數字建造管理系統平臺有哪些?好的數字建造管理系統推薦

一、什么是工程數字建造管理系統平臺&#xff1f; 工程數字建造管理系統平臺是一種集成了先進信息技術&#xff08;如云計算、大數據、物聯網等&#xff09;的綜合性管理工具&#xff0c;它旨在通過數字化手段提升工程建造全過程的管理效率和決策水平。這一平臺不僅覆蓋了工程…