UID / GID 沒過時,它只是被放在很多人看不到、但不能出錯的那一層
為什麼系統還在用 UID / GID?
從作業系統到現代應用權限設計的正確分工
在做系統開發或後端服務時,我們很常聽到 UID / GID 這兩個名詞,但也常會產生疑問:
-
這不是很古老的 Unix 設計嗎?
-
現在都有 RBAC、OAuth、JWT 了,還需要它嗎?
-
為什麼 Docker、Kubernetes 反而更重視 UID?
這篇文章會從工程實務角度,說清楚:
UID / GID 是什麼、為什麼還存在,以及它在現代系統中該扮演的正確角色
一、UID / GID 是什麼?(不是帳號名稱)
UID(User ID)
UID 是作業系統內部用來識別「使用者身分」的數字編號。
例如在 Linux 中:
雖然我們平常看到的是帳號名稱,但 Kernel 實際只認 UID,不認名稱。
GID(Group ID)
GID 則是群組的身分識別碼,用來表示「你屬於哪些群體」。
一個使用者通常會有:
-
一個 主要群組(Primary Group)
-
多個 附加群組(Secondary Groups)
二、為什麼作業系統要用「數字」?
這是一個很重要、但常被忽略的設計核心。
1️⃣ 效能與簡單性
數字比較快、比較小、比較好比對,對 Kernel 來說是最直接的表示方式。
2️⃣ 穩定性
帳號名稱可以改,但 UID 通常不變。
3️⃣ 分散式與跨系統相容
在 NFS、Container、Volume 掛載時:
只要 UID 對齊,權限就對齊
這點在 Docker / Kubernetes 中尤其重要。
三、檔案權限其實只看 UID / GID
當你看到:
實際上系統紀錄的是:
帳號名稱只是顯示用,權限判斷完全是數字比對。
四、UID / GID 的優點與限制
✅ 優點(它為什麼活了幾十年)
✔ 穩定到不能再穩定
-
Unix 時代設計
-
Linux、BSD、macOS 全通用
✔ 非常適合「底層安全隔離」
-
Process 權限
-
檔案系統
-
Container 隔離
✔ 容器化時代反而更重要
❌ 缺點(也是很多人誤用的原因)
✘ 語意太弱
✘ 不適合業務邏輯
UID 無法表達:
-
角色(Admin / User)
-
權限(Read / Write)
-
條件(只能看自己的資料)
✘ 管理成本高
跨系統 UID 沒規劃好,會變成權限地獄。
五、那現代系統到底還用不用 UID / GID?
答案是:一定用,但只在底層
正確分層來看:
| 系統層級 | 是否使用 UID / GID | 說明 |
|---|---|---|
| 作業系統(Kernel / OS) | ✅ 必用 | 行程、檔案、資源存取的最底層安全隔離機制 |
| Container / VM | ✅ 必用 | 確保容器之間的檔案與行程權限正確隔離 |
| 檔案系統 | ✅ 必用 | 透過 owner / group / permission bits 控制存取權限 |
| Web / API 層 | ❌ 幾乎不用 | 使用 Token、Claims、UserId(非 UID)來識別使用者 |
| 業務權限邏輯 | ❌ 不該使用 | 應使用 RBAC / ABAC / Policy-based 權限模型 |
六、那「現在用什麼來管權限」?
1️⃣ RBAC(角色權限模型)
最常見、最好理解:
例如:
2️⃣ ABAC(屬性條件)
更進階的做法:
3️⃣ OAuth / JWT / Claims
在 API 世界中,權限通常長這樣:
👉 完全不需要知道 UID
七、正確的現代系統權限分工
✔ 建議架構
❌ 常見錯誤設計
-
把 Linux 群組當業務角色
-
用 UID 當系統使用者主鍵
-
用 chmod 控制 API 權限
留言
張貼留言