第十一章 取得使用者帳號
使用者帳號維持了使用系統的人與系統中執行的程序(Process)之間的邊界,而群組是一種將系統的權限一次性分配給多個使用者的方法。
11.1 建立使用者帳號
每一個使用 Linux 系統的人都應該有一個單獨的使用者帳號。透過擁有一個使用者帳號,可以提供用來完整儲存檔案的區域,以及調整使用者介面 (GUI、路徑、環境變數等),從而符合使用者使用電腦的習慣。
可以透過 Cockpit 使用 GUI 建立帳號,若尚未安裝:
| |
然後瀏覽器打開 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 開始 |
一般情況使用:
| |
在建立 yexca 這個帳號的過程中,useradd 指令完成了以下活動:
讀取 /etc/login.defs 和 /etc/default/useradd 檔案,取得建立帳號所使用的預設值。
檢查命令列參數,找出哪些預設值被覆寫。
根據預設值和命令列參數,在 /etc/passwd 和 /etc/shadow 檔案中建立新使用者條目。
在 /etc/group 檔案中建立新的群組條目。
在 /home 目錄中根據使用者名稱建立一個家目錄。
將 /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 不同,以下僅列出部分:
| |
修改其他預設選項可以參閱 /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 -ls 或 find / -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 位 | 4 | u+s |
| 設定群組 ID 位 | 2 | g+s |
| 粘滯位 | 1 | o+t |
- 建立群組協作目錄 (設定 GID 位)
| |
現在,若使用者 yexca 在目錄 /mnt/co-tmp 建立一個檔案,該檔案所屬群組為 cooperation,而不是 yexca。
- 建立受限制的刪除目錄 (粘滯位)
指令: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 等。