Linux 帳號的本質:UID 與 GID#
Linux 核心不認識帳號名稱,它只認識數字。每個使用者對應一個 UID(User ID),每個群組對應一個 GID(Group ID)。帳號名稱只是給人看的——系統內部的權限判斷、檔案擁有者記錄,全部都是用數字。
UID 的分類#
| UID 範圍 | 身份 | 說明 |
|---|---|---|
| 0 | root | 系統最高權限 |
| 1 ~ 999 | 系統帳號 | 給服務使用,不能登入 |
| 1000+ | 一般使用者 | 可以登入的正常帳號 |
UID 0 就是 root。 如果你把任何帳號的 UID 改成 0,它就擁有 root 的所有權限。這就是為什麼
/etc/passwd的安全性至關重要。
帳號資訊的三大檔案#
/etc/passwd#
每一行代表一個帳號,用冒號分隔七個欄位:
帳號名稱:密碼佔位:UID:GID:使用者說明:家目錄:預設Shell密碼欄位顯示 x 表示密碼存放在 /etc/shadow。
/etc/shadow#
存放加密後的密碼與密碼策略(過期日期、最短使用天數、警告天數等)。只有 root 能讀取。
/etc/group#
記錄群組名稱、GID、以及群組成員。
初始群組 vs. 有效群組#
- 初始群組(Primary Group):在
/etc/passwd中指定的 GID,新建檔案預設歸屬此群組 - 有效群組(Effective Group):可以用
newgrp切換,影響之後新建檔案的群組歸屬 - 一個使用者可以同時屬於多個群組
在團隊協作中,群組的設計非常關鍵。例如開發團隊共用一個目錄,需要將目錄的群組設為團隊群組,並設定 SGID,確保所有人在其中建立的檔案都自動歸屬於團隊群組。
身份切換:su 與 sudo#
su#
切換為其他使用者的身份。需要知道目標使用者的密碼。
su -:完整切換,載入目標使用者的環境變數su(不加-):只切換身份,保留原本的環境。這容易造成環境混亂
sudo#
以其他身份(通常是 root)執行單一指令。只需要自己的密碼。
在實務中,sudo 遠比 su 更安全。原因:
- 不需要共享 root 密碼
- 每次操作都有日誌記錄(
/var/log/secure)- 可以透過
/etc/sudoers精確控制誰能執行哪些指令- 權限最小化原則——只授予需要的權限
/etc/sudoers 與 visudo#
/etc/sudoers 定義 sudo 的授權規則。務必使用 visudo 編輯——它會在儲存時進行語法檢查,避免設定錯誤導致所有人都無法使用 sudo。
ACL(Access Control List)#
傳統的 rwx 權限只能針對「擁有者/群組/其他人」三個層級設定,粒度太粗。ACL 允許針對特定的使用者或群組設定個別的權限。
setfacl:設定 ACL 權限getfacl:查詢 ACL 權限- mask:ACL 的最大有效權限上限,所有 ACL 條目的實際權限都會與 mask 做交集
- default ACL:設定在目錄上,新建的檔案會自動繼承
當你用
ls -l看到權限欄最後有一個+號(如rwxrwxr-x+),表示該檔案設有 ACL。
PAM(Pluggable Authentication Modules)#
PAM 是 Linux 的統一驗證框架。所有需要身份驗證的程式(login、sudo、ssh、su 等)都透過 PAM 來處理,而不是各自實作驗證邏輯。
PAM 的四種驗證類別:
- auth:驗證使用者身份(通常是密碼)
- account:帳號是否有效(是否過期、是否有權限登入)
- password:密碼更新的規則
- session:登入/登出時的環境設定(如 ulimit、家目錄建立)
PAM 的模組化設計讓系統管理員可以靈活組合驗證方式——密碼驗證、LDAP 認證、雙因素認證、指紋辨識等,都可以透過載入不同的 PAM 模組來實現,而不需要修改應用程式本身。