Linux 帳號的本質:UID 與 GID#

Linux 核心不認識帳號名稱,它只認識數字。每個使用者對應一個 UID(User ID),每個群組對應一個 GID(Group ID)。帳號名稱只是給人看的——系統內部的權限判斷、檔案擁有者記錄,全部都是用數字。

UID 的分類#

UID 範圍身份說明
0root系統最高權限
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 模組來實現,而不需要修改應用程式本身。