共享家目錄與集中式身分驗證¶
Terminology rule (zh-TW pages)
技術名詞首次出現以「中文 (English original)」格式呈現,例:依賴注入
(dependency injection)。不自創翻譯——若無公認譯名直接保留英文
(如 embedding、tokenizer)。代碼、API 名、CLI flag、套件名、檔名一律不翻。
「所有人的 $HOME 都在 NAS 上,ssh alice@anynode 直接就能用」 —— 經典的多節點 Linux 模式。實際上是同時解決兩個問題:
- 儲存:一個共享檔案系統匯出
/home;所有運算節點掛載它。 - 身分驗證:一個目錄服務 (directory service) 散播使用者、群組、UID 與憑證,使每個節點都看到同一個
alice、同一個 UID 10042。
少了任一個,你就會碰上檔案權限混亂或在 50 個節點上重複執行 useradd。
參考架構¶
flowchart LR
user["使用者"] -->|ssh alice@node42| sshd["sshd (PAM)"]
sshd -->|nsswitch lookup| sssd["node42 上的 SSSD"]
sshd -->|認證| sssd
sssd -->|"LDAP (TLS)"| ipa["FreeIPA / 389ds"]
sssd -->|Kerberos| ipa
sshd -->|pam_mkhomedir / autofs| mount["/home/alice"]
mount -.->|"NFSv4 / BeeGFS / CephFS"| nas["NAS server"]
ipa -.->|"Kerberos ticket (sec=krb5p)"| nas
流程:
alice透過 SSH 連到node42。node42上的 PAM 請 SSSD 為她做認證。- SSSD 與 FreeIPA 伺服器以 LDAP(用於目錄查找)和 Kerberos(用於密碼/票證)對話。
- PAM 的
pam_mkhomedir確保她的家目錄存在;autofs或一個靜態掛載 (static mount) 將其從 NAS 接上來。 - 若 NFSv4 啟用
sec=krb5p,掛載會以她的 Kerberos 票證向 NAS 證明身分。
元件¶
身分 / 目錄服務¶
| 選項 | 授權 | 提供什麼 | 適合場景 |
|---|---|---|---|
| FreeIPA | GPLv3 | 389ds LDAP + MIT Kerberos + DNS + Dogtag PKI + 網頁 UI + CLI (ipa) + 複寫 |
整套裝好的 Linux 機隊身分驗證 |
| 389 Directory Server | GPLv3 | LDAPv3 伺服器(獨立) | 只想要 LDAP,Kerberos 自行處理 |
| OpenLDAP | OpenLDAP License | LDAPv3 (slapd) + 工具 |
經典、手動、Unix 風格 |
| Samba AD DC | GPLv3 | 與 Windows 相容的 Active Directory | 混合 Windows + Linux + Mac |
| Microsoft Active Directory | 商業 | 企業 Windows 標準 | 你已有 Windows 基礎建設 |
| Keycloak | Apache 2.0 | OIDC / SAML IdP | 現代網頁應用;非 POSIX 使用者身分 |
| Authentik | MIT | OIDC / SAML IdP | Keycloak 的輕量替代品 |
| JumpCloud / Okta / Entra ID | SaaS | 雲端目錄;LDAP/RADIUS gateway | 雲端優先的組織 |
針對「Linux 叢集 + 共享 /home」這個用例,FreeIPA 是務實的預設值。它整合了所有部件、有可用的網頁 UI、處理複寫,並且能與 SSSD 乾淨整合。
Client 端 resolver¶
SSSD(System Security Services Daemon)跑在每個運算節點上:
- 與目錄服務以 LDAP + Kerberos 對話。
- 快取查找結果(首次認證後可離線運作)。
- 接到
nsswitch.conf(讓getent passwd alice可用)與 PAM(用於登入 / sudo)。 - 若你將
sudo規則集中存於 LDAP schema,也由 SSSD 處理。
macOS 上有對應的 opendirectoryd 綁定,可透過 dsconfigldap 或 MDM profile 設定,但體驗比 Linux 粗糙。共享家目錄 Linux 叢集上的 Mac 使用者,通常仍維持本機 macOS 帳號,只有在 SSH 登入時才接上叢集。
共享 /home 儲存¶
完整對照請見 shared-storage.md。針對共享家目錄具體選項:
- NFSv4 —— 最簡單;搭配
autofs做按需個人掛載。在不可信網路上請用sec=krb5p。 - BeeGFS —— 若同一份儲存還要承擔 HPC 工作負載,這選項很強。
- CephFS —— 若你已經為 K8s/物件儲存跑了 Ceph。
- 單一 ZFS 伺服器 + NFS —— 5-50 位使用者完全夠用;ZFS 快照 (snapshot) 提供 Dropbox 風格的「歷史版本」。
家目錄掛載機制¶
兩種慣用做法:
- 靜態掛載:
/etc/fstab在開機時掛載/home。簡單;空閒時佔用 RAM;所有使用者的家目錄皆可見。 - autofs 按需掛載:每個
/home/<user>在第一次存取時掛載、逾時後卸載。多節點叢集的標準做法;可減少不必要的 NFS 流量。
autofs 設定請見 shared-storage.md#client-mount-recipes。
pam_mkhomedir(位於 PAM 堆疊)會在首次登入且家目錄不存在時建立它。一般用在運算節點上、家目錄是延遲建立的場合。
UID/GID 慣例¶
當 /home 是共享的,所有節點 UID 一致是不可妥協的。檔案權限是以 UID 數字儲存於磁碟;如果在 node A 上 alice 是 10042、在 node B 上是 10043,從 node B 看她的檔案就會像是屬於 bob。
可以擴展的慣例:
| 範圍 | 用途 |
|---|---|
| 0-999 | 系統帳號(root、daemon)—— 由發行版管理 |
| 1000-9999 | 本機使用者(單機上一次性 adduser 的對象) |
| 10000-99999 | 目錄使用者(FreeIPA / LDAP)—— 給它們專屬保留範圍 |
| 100000+ | 從屬 UID(用於 user namespace、rootless 容器,依 /etc/subuid) |
FreeIPA 預設會在隨機範圍(例如 1234xxxxxx)配發 UID 以避開本機使用者衝突。如果你想要乾淨的 10000+ 慣例,可在 ipa-server-install --idstart=10000 --idmax=99999 時覆寫。
永遠不要跨目錄回收 UID(例如舊的 AD + 新的 FreeIPA)。維持單一資料來源 (single source of truth)。
寫入共享家目錄的 Kubernetes pod¶
如果一個 pod 的 /home/alice 是 NFS/CephFS 掛載,而 pod 需要以 alice 的身分寫入,container 中的使用者 UID 必須是 10042:
spec:
securityContext:
runAsUser: 10042
runAsGroup: 10042
fsGroup: 10042
containers:
- name: notebook
image: jupyter/base-notebook
volumeMounts:
- name: home
mountPath: /home/alice
volumes:
- name: home
nfs:
server: nas.example.com
path: /home/alice
Kubeflow 與 JupyterHub 的 spawner 透過 KubeSpawner profile 為每位使用者注入正確的 UID 來處理這件事。請在啟動時從目錄服務查詢 UID,而不要寫死。
實際技術堆疊範例¶
小型 Linux 團隊(5-20 位使用者)¶
- 1 台 NAS 伺服器:Ubuntu + ZFS +
nfs-kernel-server匯出/export/home - 1 台 IPA 伺服器:Rocky Linux 或 Ubuntu +
ipa-server-install(FreeIPA master) - 每台工作站:
ipa-client-install(一次完成註冊機器、設定 SSSD + Kerberos + NFSv4 + PAM) autofs按需掛載/home/<user>
成本:兩台常開的 VM + 一台 NAS。時間:一個週末。
HPC / ML 實驗室(50-500 位使用者,GPU 叢集)¶
- Head node + 1-2 台 IPA replica(冗餘)
- BeeGFS 或 Lustre 儲存叢集用於
/scratch - NFS 或 BeeGFS 用於
/home - SLURM controller + 計帳資料庫(請見 compute-scheduling.md)
- Open OnDemand 提供網頁入口
- 所有運算節點透過
ipa-client-install加入;pam_mkhomedir做延遲家目錄建立
K8s 原生(雲原生產品團隊)¶
- 身分:OIDC (Keycloak / Dex / Okta) —— 使用者在叢集內不需要 POSIX UID
- 運算:Kubernetes + Kueue/Volcano 處理批次
- 儲存:Rook-Ceph 搭配 CephFS 提供 RWX volume
- 「家目錄」是 per-user PVC 或筆記本映像檔;不是傳統 Linux 意義下的共享檔案系統
- 只有 JupyterHub / Kubeflow spawner 需要 POSIX UID 對應,通常透過 ConfigMap 注入
這種架構下你其實不會跑 FreeIPA —— K8s RBAC + OIDC 技術堆疊取代了它。
營運檢查清單¶
一個共享家目錄叢集運作正常,意味著:
- [ ]
getent passwd alice在每個節點回傳的輸出完全相同 - [ ]
id alice在每個節點回傳相同的 UID/GID - [ ]
ssh alice@anynode可用密碼或金鑰登入 - [ ] 登入後
ls -la /home/alice顯示alice alice(而不是 UID 數字) - [ ] 在 node A 建立的檔案,從 node B 看也屬於
alice - [ ] 登入後
klist顯示 Kerberos 票證 - [ ] 票證過期後
kinit alice能成功 - [ ] 從 IPA 移除使用者後,在快取 TTL 內所有節點皆停用其登入
- [ ]
sudo -l強制執行 LDAP 中儲存的 sudo 規則(若已集中化)
陷阱¶
- UID 衝突:永遠為目錄使用者保留專屬範圍,且不要讓本機
adduser進入該範圍。 - 沒有 Kerberos 的 NFS:UID 在傳輸線上是被信任的。在隔離的管理網路上沒問題,在較大的網路上很危險。
- 大小寫敏感性:LDAP 使用者名稱預設不分大小寫;POSIX 則是分。請強制只允許小寫使用者名稱。
- 家目錄權限:
chmod 700 /home/alice是安全預設;profile 中相應設umask 077。 - SSSD 快取過時:IPA 改密碼後,舊密碼可能仍可用直到快取失效。可用
sss_cache -u alice強制重新整理。 - macOS client:別假設把 macOS 綁到 FreeIPA 會獲得跟 Linux 一樣的體驗。多數團隊會讓 Mac 使用者保持在本機,只透過 IPA 同步 SSH 金鑰。
相關連結¶
- shared-storage.md ——
/home底層的 NAS - compute-scheduling.md —— SLURM account 與 K8s RBAC 共用同一個身分驗證層
- virtualization.md —— IPA / LDAP 伺服器通常以 VM 形式跑在 Proxmox / ESXi 上
- docs/tools/infrastructure-as-code.md —— FreeIPA、LDAP 的 Terraform provider