CodeGym /Adesua ahorow /Docker SELF /使用 ACL (`setfacl`, `getfacl`) 管理權限

使用 ACL (`setfacl`, `getfacl`) 管理權限

Docker SELF
等級 5 , 課堂 3
開放

使用 ACL 管理權限 setfacl, getfacl

1. 認識 ACL

想像一下,你是個派對主辦人(或者系統管理員)。你希望客人可以進入特定的房間,而其他房間需要你的許可才能進去。Linux 基本的訪問權限 rwx 允許你只管理三個類別的訪問權限:擁有者 (user)、群組 (group) 和其他人 (others)。但如果你只想讓一個特別的朋友進入某個房間呢?標準權限模型的守門人會對你說:"嘿,這樣不行的。" 這時 ACL 就能派上用場了。

ACL (Access Control Lists) 用來解決傳統三層權限系統的限制,它可以讓你為特定的使用者和群組設定訪問權限。

ACL 的主要功能:

  1. 為特定的使用者和群組設定檔案和目錄的個別權限。
  2. 繼承目錄內新檔案的權限。
  3. 比傳統的 chmod 方法更靈活的設定方式。

2. 如何知道是否啟用了 ACL?

在開始管理 ACL 之前,我們先來確認一下您的系統是否支持它們。你可以使用這個指令來檢查:

mount | grep acl

如果文件系統掛載時使用了 acl 選項,那你就準備好了!否則,你需要重新掛載分區並添加 acl

sudo mount -o remount,acl /your/mount/point

好啦,現在你已經裝備齊全。是時候開始實踐了。


3. 操作 ACL 的基本指令

指令 說明
getfacl 獲取檔案或目錄的當前 ACL 列表。
setfacl 為檔案或目錄設定或修改 ACL。
setfacl -m 修改(modify)當前的存取權限。
setfacl -x 刪除(remove)指定的存取權限。
setfacl -b 刪除檔案或目錄的所有 ACL 記錄。
setfacl -d 設定目錄的預設權限,會被其內的檔案繼承。

現在讓我們用範例來解釋這些指令的用法吧!


取得當前 ACL getfacl

假設我們有一個檔案 example.txt。我們想要查看目前這個檔案的 ACL 權限,可以用以下指令:

getfacl example.txt

大致的輸出如下:

# 檔案: example.txt
# 擁有者: user1
# 群組: group1
user::rw-
group::r--
other::---

這個列表顯示了基本權限:擁有者 user1 可以讀取和寫入,群組 group1 只能讀取,而其他用戶完全無法訪問。


設定個別用戶的存取權限 (setfacl)

現在假設我們希望給用戶 user2 賦予寫入 example.txt 的權限,可以使用以下指令:

sudo setfacl -m u:user2:rw example.txt

這條指令的意思是:

  • -m: 修改權限。
  • u:user2:rw: 為用戶 user2 增加或修改權限(讀寫)。

檢查結果:

getfacl example.txt

現在輸出如下:

# 檔案: example.txt
# 擁有者: user1
# 群組: group1
user::rw-
user:user2:rw  # 額外的規則!
group::r--
other::---

刪除個別用戶的存取權限 setfacl -x

如果你決定不再需要用戶 user2 擁有寫入權限,可以刪除該權限:

sudo setfacl -x u:user2 example.txt

檢查一下:

getfacl example.txt

user2 的額外規則已經消失了!


設定群組的權限

ACL 不僅可以為單一用戶設置權限,還可以為整個群組設置。例如,要授予群組 devteam 讀寫訪問權限,可以執行:

sudo setfacl -m g:devteam:rw example.txt

設定預設權限 setfacl -d

有時我們需要為特定目錄內的所有新檔案和目錄自動設置權限。例如,我們希望目錄 project_dir 中的所有檔案都有用戶 developer 的寫入權限,可以這樣操作:

sudo setfacl -d -m u:developer:rw project_dir

檢查權限:

getfacl project_dir

現在,project_dir 中的所有新檔案和子目錄都會自動應用這條預設規則。


刪除所有 ACL setfacl -b

如果你想完全清除檔案的所有 ACL,可以執行:

sudo setfacl -b example.txt

現在,檔案將恢復到標準的權限模型 user:group:others


4. ACL 的實際應用

場景:項目中的協作

假設你有一個項目,存放在目錄 /project 中。有三個人參與工作:

  • Alice 應該擁有完全的訪問權限(讀取、寫入、執行)。
  • Bob 只能讀取文件。
  • Eve 不應該看到該目錄。

使用 ACL 來設置這些權限:

  1. 給予 Alice 完全訪問權限:

    sudo setfacl -m u:alice:rwx /project
    
  2. 給予 Bob 只讀訪問權限:

    sudo setfacl -m u:bob:r-- /project
    
  3. 對於 Eve,什麼都不用做 — 她默認將無訪問權限。

查看當前的 ACL 列表:

getfacl /project

輸出:

# file: /project
# owner: root
# group: root
user::rwx
user:alice:rwx
user:bob:r--
group::---
other::---

現在 Alice 可以無限制地工作,Bob 只能查看文件,而 Eve 則被排除在外。


5. 潛在的錯誤及其解決方法

  1. 設定了 ACL,但它們不起作用。 可能是該分區未以 acl 選項掛載。使用 mount 檢查並根據需要重新掛載。

  2. 標準權限與 ACL 之間的衝突。 ACL 總是優先於標準權限。例如,即使 "others" 設定為禁止讀取,ACL 也可以允許特定使用者存取。

  3. 忘記了繼承的 ACL。 如果你設定了 -d (default) 權限,請檢查這些規則是否被新文件繼承。

為什麼這很重要?

通過 ACL 管理權限可以靈活地為不同的使用者和群組設定存取權限。這在需要根據角色分配權限的工作伺服器中特別有用。例如,在公司中,ACL 被用於限制僅對那些「在狀況內」的人員開放存取權限——這是安全性的關鍵之一。

另外,你可以參考 ACL 的官方指南,以更深入地瞭解它們的功能。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION