用戶管理

用戶賬號

/etc/passwd

Linux 使用 /etc/passwd 文件嚟保存用戶賬號信息。 因為好多服務進程需要讀取用戶賬號嘅信息,可以見到呢個文件嘅權限都係可讀嘅。

-rw-r--r-- 1 root root 2010 Aug 24 15:12 /etc/passwd

查看某個用戶嘅賬號信息。

grep kuga /etc/passwd
kuga:x:1000:1000:,,,:/home/kuga:/bin/bash
KEYVALUE
用戶名kuga
用戶密碼x
用戶 ID1000
用戶組 ID1000
備註字段,,,
目錄位置/home/kuga
默認 Shell/bin/bash

系統會預留一定嘅 UID 範圍,Ubuntu 新添加嘅用戶 ID 由 1000 開始。 下面嘅命令會按第 3 個字段 UID 逆序排序,然後輸出前 10 行,只顯示 136 字段(用戶名,UID,目錄位置)。

sort -t ':' -k 3 -nr /etc/passwd | cut -d ':' -f1,3,6 | head -n 10
nobody:65534:/nonexistent
soda:1001:/home/soda
kuga:1000:/home/kuga
lxd:999:/var/snap/lxd/common/lxd
ecs-instance-connect:998:/home/ecs-instance-connect
fwupd-refresh:115:/run/systemd
_chrony:114:/var/lib/chrony
usbmux:112:/var/lib/usbmux
landscape:111:/var/lib/landscape
tss:110:/var/lib/tpm

/etc/shadow

由於歷史原因,早期嘅用戶密碼使用 /etc/passwd 存儲,所以文件名係 passwd。 後來因為密碼容易被暴力破解,依家嘅密碼已經搬到新文件 /etc/shadow呢個文件只有 root 同 shadow 組可讀

-rw-r----- 1 root shadow 1255 Aug 24 15:08 /etc/shadow

可以粗略睇睇呢個文件嘅內容。

root:*:19955:0:99999:7:::
daemon:*:19103:0:99999:7:::
bin:*:19103:0:99999:7:::
sys:*:19103:0:99999:7:::
sync:*:19103:0:99999:7:::

呢啲字段一般都係管理密碼嘅(如幾多日後必須更改),呢度唔展開。

Useradd

HOME 目錄

默認唔創建用戶目錄。

useradd foo

使用 -m 參數會創建用戶目錄。

useradd -m foo

使用 -M 參數不會創建用戶目錄。

useradd -M foo

查看默認配置

使用 -D 選項可以查看添加用戶時采用嘅默認配置。

useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
  • GROUP:用戶默認組 ID。
  • HOME:用戶目錄位置。
  • INACTIVE:密碼過期後多少天禁用賬號。
  • EXPIRE:賬號過期日期。
  • SHELL:默認使用嘅登錄 Shell。
  • SKEL:Skeletal,該目錄內容會複製到用戶主目錄。
  • CREATE_MAIL_SPOOL:是否創建郵件存儲文件。

/etc/default/useradd

useradd 命令嘅默認配置文件。

-rw-r--r-- 1 root root 1118 Aug 28 10:58 /etc/default/useradd
cat /etc/default/useradd | head -n 20
# Default values for useradd(8)
#
# The SHELL variable specifies the default login shell on your
# system.
# Similar to DSHELL in adduser. However, we use "sh" here because
# useradd is a low level utility and should be as general
# as possible
SHELL=/bin/sh
#
# The default group for users
# 100=users on Debian systems
# Same as USERS_GID in adduser
# This argument is used when the -n flag is specified.
# The default behavior (when -n and -g are not specified) is to create a
# primary user group with the same name as the user being added to the
# system.
# GROUP=100
#
# The default home directory. Same as DHOME for adduser
# HOME=/home

如果把 SHELL 改成 /bin/bash,那麼 useradd -D 就會自動更新。

/etc/login.defs

用戶賬號同登錄管理嘅核心配置文件。 功能包括:密碼策略、UID/GID 範圍、HOME 目錄管理、用戶同組管理、登錄設置等等。 文件中嘅設置會影響著如 useraddusermodpasswd 等命令嘅行為,修改前建議提前備份。

-rw-r--r-- 1 root root 10734 Nov 11  2021 /etc/login.defs

單獨睇一下 USERGROUPS_ENAB 參數。

grep -B 4 -E "USERGROUPS_ENAB (yes|no)" /etc/login.defs
# If set to yes, userdel will remove the user's group if it contains no
# more members, and useradd will create by default a group with the name
# of the user.
#
USERGROUPS_ENAB yes

如果 USERGROUPS_ENAB 嘅值為 yes:

  • userdel:刪除用戶嘅時候,會同時刪除空嘅用戶用。
  • useradd:創建用戶嘅時候,會同時創建同用戶名一樣嘅組。

這就係為咗緊上面創建用戶嘅時候,沒有使用 GROUP=100 呢個默認參數。

使用命令修改配置

修改默認登錄 Shell。

sudo useradd -D -s /bin/bash

修改默認組 ID。

sudo useradd -D -g 100

修改默認嘅 HOME 目錄。

sudo useradd -D -b path

執行命令後,你會發現,文件嘅權限由 644 -> 600

-rw------- 1 root root 1195 Aug 28 11:22 /etc/default/useradd

權限更正如下。

sudo chmod 644 /etc/default/useradd

翻一下源碼,在 set_defaults(void) 方法中,執行過程大致如下:

/*
 * set_defaults - write new defaults file
 *
 * set_defaults() re-writes the defaults file using the values that
 * are currently set. Duplicated lines are pruned, missing lines are
 * added, and unrecognized lines are copied as is.
 */
static int
set_defaults(void)
{
...
}
  • 使用 mkstemp 函數創建臨時文件 A。
  • 處理 /etc/default/useradd 文件並複製到 A 中。
  • 備份原來嘅 useradd 文件,重命名useradd-
  • 把 A 文件覆蓋原來嘅 useradd 文件。
  • mkstemp 函數創建嘅文件權限係 0600

查看 useradd 同它嘅備份 useradd-

ls -li /etc/default/useradd*
655124 -rw------- 1 root root 1197 Aug 28 16:28 /etc/default/useradd
655237 -rw------- 1 root root 1197 Aug 28 16:07 /etc/default/useradd-

如果使用執行命令修改默認登錄 Shell。

sudo useradd -D -s /bin/sh

再次查看兩個文件嘅 inode。

655454 -rw------- 1 root root 1195 Aug 28 17:27 /etc/default/useradd
655124 -rw------- 1 root root 1197 Aug 28 16:28 /etc/default/useradd-

不難發現 useradd- 嘅 inode 就係修改前 useradd 嘅 inode。 關於權限被修改嘅問題,顯然係唔合理嘅,命令唔應該修改文件嘅權限。 在 GitHub 上可以查看這個 pull request

Usermod

更改用戶嘅登錄名

sudo usermod -l newuser olduser

將用戶添加到一個組

-a 表示追加到組,而唔係替換當前組列表。

sudo usermod -aG group user

更改用戶嘅默認 Shell

usermod 唔會檢查 Shell 嘅合法性,可用 chsh 代替。

sudo chsh -s /bin/bash user

更改用戶 ID

sudo usermod -u newuid user

Passwd

修改當前用戶嘅密碼

唔加參數就係修改當前用戶嘅密碼。

passwd

修改指定用戶嘅密碼

sudo passwd soda

登錄管理

禁止密碼登錄

下面兩種方法係一樣嘅,而且唔會禁止 SSH 公鑰認證

sudo usermod -L user
sudo passwd -l user

執行後,/etc/shadow 文件嘅密碼字段前面會加 !

sudo grep user /etc/shadow
user:!$y...:19959:0:99999:7:::

恢復密碼登錄

下面兩種方法係一樣嘅,可以混著用。

sudo usermod -U user
sudo passwd -u user

執行後,/etc/shadow 文件嘅密碼字段前面會刪除 !

禁止 SSH 公鑰認證

沒有了登錄 Shell,自然密碼也係唔能登錄。

sudo usermod -s /usr/sbin/nologin user

恢復 SSH 公鑰認證

sudo usermod -s /bin/bash user

Userdel

僅刪除用戶

呢種方法只刪除用戶,保留主目錄。

sudo userdel user

主目錄同郵件

不但刪除用戶,還要刪除主目錄同郵件。

sudo userdel -r user

如果文件或目錄沒不存在,會在終端提示。

Adduser Package

呢個包提供兩個實用命令,adduserdeluser,屬於上層封裝好嘅工具。