Linux 學習 第十一章 取得使用者帳號

📢 本文由 gemini-3-flash-preview 翻譯

第十一章 取得使用者帳號

使用者帳號維持了使用系統的人與系統中執行的程序(Process)之間的邊界,而群組是一種將系統的權限一次性分配給多個使用者的方法。

11.1 建立使用者帳號

每一個使用 Linux 系統的人都應該有一個單獨的使用者帳號。透過擁有一個使用者帳號,可以提供用來完整儲存檔案的區域,以及調整使用者介面 (GUI、路徑、環境變數等),從而符合使用者使用電腦的習慣。

可以透過 Cockpit 使用 GUI 建立帳號,若尚未安裝:

1
2
yum install cockpit -y
systemctl enable --now cockpit.socket

然後瀏覽器打開 localhost:9090 以進行操作。

11.1.1 使用 useradd 指令新增使用者

多數情況下使用 GUI 是比較麻煩的,所以可以使用 useradd 指令以新增使用者 (root 權限),唯一必要的參數是使用者的登入名稱,可用選項包括:

可用選項描述
-c “comment”提供對新使用者帳號的描述。一般為使用者的全名
-d home_dir設定帳號所使用的家目錄。預設使用登入名稱命名並放入 /home 目錄
-D並不建立新帳號,而是將所提供的資訊儲存作為建立新使用者的預設設定
-e expire_date以 YYYY-MM-DD 格式分配帳號的有效期限。例如:-e 2024-08-01
-f -1設定密碼過期後多少天,便永久封鎖該帳號。預設值 -1 表示停用此選項
-g group設定使用者所在的主群組 (必須已存在於 /etc/group 檔案中)。若沒有該選項,將建立一個新群組 (使用使用者名稱作為群組名稱),並將其作為使用者的主群組
-G grouplist將新使用者新增到以逗號分隔的次要群組清單中。例如:-G wheel, sales, tech
-k skel_dir設定使用者家目錄的檔案,複製自 skel_dir,預設為 /etc/skel
-m自動建立使用者的家目錄。對於 Fedora 和 RHEL 該選項是預設的,但對於 Ubuntu 來說則不是
-M不建立使用者家目錄,儘管有 -m 選項也不建立
-n停用建立一個與新使用者名稱和使用者 ID 相符合之新群組的預設行為
-o使用 -u uid 建立一個與另一個使用者帳號具有相同 UID 的使用者帳號
-p passwd設定密碼 (使用 MD5 加密過的)。如果此時未設定,可以使用 passwd user 指令。使用 openssl passwd 以輸出透過 MD5 加密後的密碼
-s shell設定預設 shell。例如:-s /bin/csh
-u user_id為帳號指定使用者 ID 號碼,若沒有則自動分配。自動分配給一般使用者的 ID 從 1000 開始

一般情況使用:

1
2
3
# root 權限下
useradd yexca
passwd yexca

在建立 yexca 這個帳號的過程中,useradd 指令完成了以下活動:

  1. 讀取 /etc/login.defs 和 /etc/default/useradd 檔案,取得建立帳號所使用的預設值。

  2. 檢查命令列參數,找出哪些預設值被覆寫。

  3. 根據預設值和命令列參數,在 /etc/passwd 和 /etc/shadow 檔案中建立新使用者條目。

  4. 在 /etc/group 檔案中建立新的群組條目。

  5. 在 /home 目錄中根據使用者名稱建立一個家目錄。

  6. 將 /etc/skel 目錄中的所有檔案複製到新的家目錄中。其中通常包括登入和應用程式啟動指令碼(Script)。

在 /etc/passwd 檔案中的使用者行:

yexca:x:1001:1001::/home/yexca:/bin/bash

欄位之間以冒號分隔,分別為登入名稱、密碼、使用者 ID、主群組 ID、註釋欄位、家目錄、預設登入終端機。

密碼欄位為 x 是被加密儲存在 /etc/shadow。

在 /etc/group 檔案中的群組行:

yexca:x:1001:

同樣以冒號分隔,分別為群組名稱、群組密碼、群組 ID 以及群組中使用者清單。

11.1.2 設定使用者預設值

useradd 指令透過讀取 /etc/login.defs 和 /etc/default/useradd 檔案確定預設值,所以可以修改檔案以修改預設值。

在不同 Linux 系統中 login.defs 不同,以下僅列出部分:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
PASS_MAX_DAYS    99999
PASS_MIN_DAYS    0
PASS_MIN_LEN    5
PASS_WARN_AGE    7
UID_MIN    1000
UID_MAX    60000
SYS_UID_MIN    200
SYS_UID_MAX    999
GID_MIN    1000
GID_MAX    60000
SYS_GID_MIN    201
SYS_GID_MAX    999
CREATE_HOME    yes

修改其他預設選項可以參閱 /etc/default/useradd 檔案,可以透過 useradd -D 查看目前預設設定。

也可以將 -D 與一些其他選項搭配使用以修改 /etc/default/useradd 檔案:

  • -b default_home — 設定所建立家目錄所在的目錄。通常為 /home。

  • -e default_expire_date — 設定停用使用者帳號的預設截止日期。應當使用 YYYY-MM-DD 的日期格式。

  • -f default_inactive — 設定密碼過期後多少天帳號被停用。

  • -g default_group — 新使用者預設所在的群組。通常會建立與使用者具有相同名稱和 ID 號碼的新群組。

  • -s default_shell — 預設 shell。

11.1.3 使用 usermod 修改使用者

usermod 指令提供了一種簡單明瞭的方法來更改帳號參數。

選項描述
-c “username”更改描述
-d home_dir更改家目錄
-e expire_date分配一個 YYYY-MM-DD 格式的新過期時間
-f -1更改密碼過期之後多少天永久停用帳號。預設值 -1 表示停用該選項
-g group更改使用者所在主群組 (需存在該群組)
-G grouplist將使用者的附屬群組設定為以逗號分隔的群組清單。如果想保留原本群組,請使用 -Ga
-l login_name更改登入名稱
-L鎖定帳號 (在 /etc/shadow 檔案的加密密碼前新增一個驚嘆號)
-m將原家目錄內容複製到新家目錄。僅當 -d 選項被使用時該選項才有效
-o只能與 -u 一起使用以取消 UID 必須唯一的限制
-s shell更改 shell
-u user_id更改使用者 ID
-U解除鎖定 (將 /etc/shadow 檔案的加密密碼前的驚嘆號刪除)

11.1.4 使用 userdel 刪除使用者

例如指令 userdel -r yexca 將使用者 yexca 從 /etc/passwd 檔案刪除,-r 表示將家目錄 /home/yexca 也一併刪除。

在刪除使用者前可以先使用 find 指令尋找使用者遺留的檔案,例如:find / -user yexca -lsfind / -uid 1001 -ls

因為沒有分配給使用者的檔案可能會是一個安全隱憂,比較好的作法是分配給一個真實的帳號,可以使用 find / -nouser -ls 指令找到不與任何使用者關聯的檔案。

11.2 瞭解群組帳號

如果要處理在多個使用者中共享一組檔案,那麼群組帳號是非常有用的。

透過 chgrp grpName fileOrDir 指令以更改檔案或目錄所屬群組。

11.2.1 使用群組帳號

每一個使用者都分配給一個主群組,主群組由 /etc/passwd 檔案中每一條目的第四個欄位的數字來表示。

一個使用者可以屬於多個次要群組,也可以不屬於任何次要群組。如果使用者 yexca 是群組 yexca 和群組 hi 的一名成員,那麼在 /etc/group 檔案中的條目將如下所示:

yexca:x:1001:yexca

hi:x:1002:yexca

只有 root 權限的人才能改變分組,也就是一般使用者無法更改自己的分組,也不能將其他使用者新增到自己的群組。

如果想要以某群組身分建立檔案,可以使用 newgrp 指令以暫時成為某一群組成員。

擁有 root 權限的使用者可以使用 gpasswd 指令設定某群組的群組密碼。

11.2.2 建立群組帳號

建立:groupadd groupName

分配群組編號:groupadd -g gid groupName

或者更改某使用者的群組,可以使用群組名稱或群組編號:

groupmod -g gid userName

groupmod -n groupName userName

而如果改變次要群組,參考 usermod 指令。

11.3 在企業中管理使用者

透過使用 ACL (Access Control Lists) 技術,使任何使用者可將檔案或目錄的特定權限分配給任何使用者和群組。

11.3.1 使用 ACL 設定權限

兩個指令:設定 setfacl 和取得 getfacl 某目錄權限。

設定時,透過 -m 修改或 -x 刪除權限,例如:

setfacl -m u:userName:rwx filename

11.3.2 為使用者新增目錄以便進行協作

當使用 chmod 指令更改權限時,一般會忽略一組特殊的三權限位元,這些權限位元可以在指令和目錄上設定特殊權限。

例如:chmod 775 /home/yexca/tmp.txt ,實際上權限為 0775

名稱數值字母值
設定使用者 ID 位4u+s
設定群組 ID 位2g+s
粘滯位1o+t
  1. 建立群組協作目錄 (設定 GID 位)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 建立一個用於協作的群組
groupadd -g 301 cooperation
# 新增一些使用者
usermod -aG cooperation yexca
# 建立協作目錄
mkdir /mnt/co-tmp
# 將群組 cooperation 分配給該目錄
chgrp cooperation /mnt/co-tmp
# 更改目錄權限
chmod 2775 /mnt/co-tmp
# 此時如果查看該目錄權限應該為 rwxrwsr-x

現在,若使用者 yexca 在目錄 /mnt/co-tmp 建立一個檔案,該檔案所屬群組為 cooperation,而不是 yexca。

  1. 建立受限制的刪除目錄 (粘滯位)

指令:chmod 1775 /mnt/tmp

在受限制的刪除目錄中,除非是 root 使用者或者是目錄的擁有者,否則不能刪除其他使用者的檔案,即使擁有寫入權限。

例如 /tmp 目錄就是一個受限制的刪除目錄 (權限為 rwxrwxrwt)。

設定使用者位元 Set UID

擁有設定使用者位元的可執行檔 (rwsr-xr-x) 代表其他使用者可執行,但執行指令的程序為擁有該檔案的使用者。

例如 su 指令,所有使用者皆可執行,但執行的程序屬於 root 使用者。

11.4 集中式使用者帳號

Linux 預設驗證使用者的方法是根據 /etc/passwd 檔案和 /etc/shadow 檔案的密碼,但也可以使用其他方式。

例如 LDAP (Lightweight Directory Access Protocol)、NIS (Network Information Service)、Winbind 等。