萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 使用者帳號管理實務:從 UID/GID 到 /etc/passwd 與影子密碼機制

核心觀念:使用者在核心眼中只是一個數字

Linux 核心不認識「帳號名稱」,只認識 UID (User ID) 與 GID (Group ID)。當您執行 ls -l 看到 user1,是因為 ls 程式透過 C Library 函式 getpwuid() 查詢 /etc/passwd 將 UID 1001 解析為字串「user1」。理解這點,帳號管理的本質就清晰了:維護一個 UID ↔ 使用者屬性 的映射資料庫。

一、建立帳號的標準流程與工具

1. 低層手動操作(教學用,生產環境請用工具)

  1. 編輯 /etc/passwd 新增一行:newuser:x:1005:1005::/home/newuser:/bin/bash
  2. 編輯 /etc/group 新增群組:newuser:x:1005:
  3. 編輯 /etc/shadow 設定密碼欄位(需用 openssl passwd -6 產生雜湊)。
  4. 建立家目錄:mkdir /home/newuser; cp -r /etc/skel/* /home/newuser/; chown -R 1005:1005 /home/newuser; chmod 700 /home/newuser
  5. 設定密碼:passwd newuser。

2. 標準管理工具:useradd / adduser

指令特性適用場景
useradd底層工具,參數明確,適合腳本自動化批次建帳、Ansible/Puppet 部署
adduserDebian/Ubuntu 友善互動腳本,自動建家目錄、複製 skel、提示密碼管理員手動建帳
GUI 工具GNOME Settings、KDE User Manager、YaST、cockpit桌面環境、遠端 Web 管理

常用 useradd 參數速查

useradd -m -d /home/alice -s /bin/zsh -c "Alice Chen" -G wheel,docker -u 2001 alice
# -m 建立家目錄並複製 /etc/skel
# -d 指定家目錄路徑
# -s 指定登入 Shell
# -c 註解(全名)
# -G 附屬群組
# -u 指定 UID(不指定則自動分配)

二、/etc/passwd 與 /etc/shadow 完整欄位解析

1. /etc/passwd(全域可讀,權限 644)

格式:帳號:密碼佔位符:UID:GID:註解(GECOS):家目錄:Shell

欄位說明範例
帳號登入名稱,1~32 字元,建議小寫字母數字alice
密碼佔位符啟用 shadow 時固定為 x;未啟用則為加密密碼(極不安全)x
UID0=root,1-999 系統保留,1000+ 一般使用者1001
GID主要群組 ID,對應 /etc/group1001
GECOS逗號分隔:全名,辦公室,辦公電話,住宅電話Alice Chen,Room 301,2345,
家目錄登入後預設工作目錄/home/alice
Shell登入程式,需列於 /etc/shells/bin/bash

2. /etc/shadow(僅 root 可讀,權限 640/000)

格式:帳號:加密密碼:最後修改日:最小間隔:最大間隔:警告天數:非活動天數:過期日:保留

欄位說明範例/單位
加密密碼$id$salt$hash 格式,id: 1=MD5, 5=SHA-256, 6=SHA-512, y=yescrypt$6$rounds=656000$salt$hash
最後修改日自 1970-01-01 起的天數19872 (2024-06-15)
最小間隔兩次改密碼最少間隔天數,0=無限制0
最大間隔密碼有效天數,99999=永不過期90
警告天數過期前幾天開始警告7
非活動天數過期後多少天鎖定帳號30
過期日帳號絕對過期日(天數),空白=永不20088

三、影子密碼機制:為什麼要把密碼藏起來?

早期 Unix 將加密密碼直接放在 /etc/passwd 第二欄,因檔案全域可讓 ls、finger 等程式查詢 UID→名稱。但這導致任何人都能取得加密密碼離線破解(字典攻擊、彩虹表)。

Shadow 方案:

  • 將真正的加密密碼移至 /etc/shadow,權限 640 root:shadow 或 000。
  • /etc/passwd 密碼欄固定為 x。
  • 需驗證密碼的程式(login、su、sudo、sshd、passwd)設定 setuid root 或具備 CAP_DAC_READ_SEARCH,得以讀取 shadow。
  • 一般程式(ls、id、getent)只讀 /etc/passwd,完全看不到密碼雜湊。

四、帳號修改與刪除實務

任務指令關鍵參數
修改帳號屬性usermod-l 新名稱, -d 新家目錄 -m 移動檔案, -s 新 Shell, -G 附屬群組(覆蓋), -aG 追加群組, -L/-U 鎖定/解鎖
修改密碼/過期策略passwd / chagepasswd -l/-u 鎖定/解鎖, chage -M 90 -W 7 -I 30
刪除帳號userdel-r 同時刪除家目錄與郵件佇列
查詢帳號資訊id, getent passwd user, chage -l user

五、系統帳號與服務帳號的區分

  • 系統帳號(UID 1-999):daemon, www-data, postgres, mysql。通常 /usr/sbin/nologin 或 /bin/false 作為 Shell,無家目錄或家目錄在 /var/lib/,用於服務進程權限隔離。
  • 一般使用者(UID ≥ 1000):具備互動登入 Shell、家目錄在 /home。

結語

帳號管理看似瑣碎,實則是系統安全的第一道防線。善用 useradd/usermod/chage、嚴格控管 /etc/shadow 權限、定期稽核 UID 0 帳號與無密碼帳號、為服務建立專用系統帳號而非共用 root,都是資深管理員的基本功。

copyright © 萬盛學電腦網 all rights reserved