用戶和用戶組 - Arch Linux 中文维基

跳至內容

# 用戶和用戶組

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Users and Groups，最近一次同步於 2020-06-16，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- DeveloperWiki:UID / GID Database
- polkit
- File permissions and attributes
- Reset lost root password
- 認證管理

GNU/Linux 通過用戶和用戶組實現訪問控制——包括對文件訪問、設備使用的控制。Linux 默認的訪問控制機制相對簡單直接，不過還有一些更加高級的機制，包括 ACL、Capabilities 和 LDAP 認證.

## 概覽

用戶一般指使用計算機的人。在本文語境中，該詞指用來識別用戶的用戶名稱，既可以是 Mary 或 Bill 這樣的真名，也可以是 Dragonlady, Pirate 這樣的暱稱。關鍵是，計算機給每個帳戶分配了特定的名稱，而用戶則使用這些名稱訪問計算機。除了人之外，一些系統服務也以有部分限制，由享有部分特權的用戶帳戶身份運行。

由於安全需要，「用戶管理」應運而生，以加以明確限制各個用戶帳戶的權限。超級用戶 root 於計算機裡擁有至高無上的管理權限，所以一般只作管理用。非特權用戶則可以用 su 或 sudo 程序以臨時獲得特權。

個體可以擁有多帳戶，只不過彼此名稱當然不同。但有一些用戶名稱已事先被系統占用，比如 "root".

此外，任意用戶可能從屬某個「用戶組」。此外用戶也能夠新加入某些已經存在的用戶組，以獲取該組所擁有的特權。

注意：新手請務必謹慎地使用這方面的工具，並且要避免對除自己以外的其他已存在用戶發生誤操作。
提示：「root」重新導向至此。關於「根目錄」的內容，參見分區#根分區。

## 權限與屬主

摘自 In UNIX Everything is a File （UNIX 中一切皆文件）：

  集眾多靈感及理念之大成，UNIX 作業系統打造出了它的設計、接口、文化甚至革新。重中之重，有一句道理：「一切皆文件」可謂 UNIX 的真諦之一。

  根據這一設計原則，必須要有統一的模型，用以管理對大量 I/O 資源的訪問：文檔、目錄、磁碟、CD-ROM、數據機、鍵盤、印表機、顯示器和終端等等，甚至也包括了進程、網絡之間的通信。而解決之策，就是為所有這些資源提成一個抽象層，UNIX 之父們稱之為「文件」。所有文件都通過一致的 API 以提供訪問，因此光只用同一套簡單的命令，就可以讀寫磁碟、鍵盤、文檔以及網絡設備。

摘自 Extending UNIX File Abstraction for General-Purpose Networking （針對常規的網絡應用，擴展出 UNIX 文件抽象層）：

  UNIX 及兼容系統提供了一個即基本又強悍的抽象層——文件。很多系統服務和設備的應用程式接口，一開始都被設計為文件或文件系統之類的東西。這賦予程序全新的姿態——通過文件抽象層，我們就可以以全新的方式使用眾多現成的、且用途單一的小工具。例如 cat 工具，原本只用來讀取文件，再將其內容發送到標準輸出，但現在它也可以直接訪問特殊設備文件（通常在 `/dev` 目錄中），加以讀取 I/O 設備。在很多系統上，音頻記錄和播放也可以通過一令執行：分別是 `cat /dev/audio > myfile` 以及 `cat myfile > /dev/audio`.

GNU/Linux 系統中的每一個文件都從屬一個用戶（屬主）和一個用戶組（屬組）。另外，還有三種類型的訪問權限：讀（read）、寫（write）、運行（execute）。我們可以針對文件的屬主、屬組、而設置相應的訪問權限。再次，我們可以通過 ls 命令的長列表格式以查詢文件屬主、屬組和權限：

    $ ls /boot/ -l

    total 18492
    drwxr-xr-x 3 root root    12288 Aug 21 03:27 grub
    -rw-r--r-- 1 root root 12487150 Aug 29 18:24 initramfs-linux-fallback.img
    -rw-r--r-- 1 root root  2990626 Aug 29 18:23 initramfs-linux.img
    -rw-r--r-- 1 root root  3440576 Aug 26 15:17 vmlinuz-linux

第一列是文件訪問權限（例如，文件`initramfs-linux.img`的權限為`-rw-r--r--`），第三列和第四列分別是屬主和屬組（本例中所有文件屬主都是root用戶，屬組都是root組）。

    $ ls -l /media/

    total 16
    drwxrwx--- 1 root vboxsf 16384 Jan 29 11:02 sf_Shared

上述例子中，`sf_Shared`目錄由root用戶和vboxsf組所有。使用`stat`命令也可以查看文件所有權和權限：

屬主：

    $ stat -c %U /media/sf_Shared/

    root

屬組：

    $ stat -c %G /media/sf_Shared/

    vboxsf

訪問權限：

    $ stat -c %A /media/sf_Shared/

    drwxrwx---

訪問權限由三組字符組成，分別代表屬主、屬組、其他人的權限。例如，`-rw-r--r--`表示屬主有讀寫權限、但無運行權限（`rw-`），屬組用戶和其他用戶只有讀取權限（`r--`）。又如，`drwxrwx---`表示文件屬主和屬組用戶有讀、寫、執行權限（`rwx`），而禁止其他用戶任何訪問（`---`）。第一個字符」d「代表文件類型（目錄）。

通過`find`命令查找屬於某個用戶或某個組的文件：

    # find / -group "用户组名"
    # find / -group "用户组编号"
    # find / -user "用户"

文件的屬主、屬組可以通過`chown`命令更改。文件的權限可以通過`chmod`命令修改。

詳情參見：chown(1)、chmod(1)、Linux 文件權限。

## Shadow

Arch Linux 的用戶、群組和密碼管理工具由 shadow包 提供，這個軟體包是 base包 元軟體包的依賴。

## 文件列表

警告：不要手動編輯這些文件。有些工具可以更好的處理鎖定、避免資料庫錯誤。

文件 | 作用
--- | ---
`/etc/shadow` | 保存用戶安全信息
`/etc/passwd` | 用戶帳戶信息
`/etc/gshadow` | 保存組帳號的安全信息
`/etc/group` | 定義用戶所屬的組
`/etc/sudoers` | 可以運行 sudo 的用戶
`/home/*` | 主目錄

## 用戶管理

使用`who`命令，可以查看目前已登錄的用戶。要查看系統上的用戶，以 root 執行 `passwd -Sa` 輸出的數據格式可以參考 passwd(1)。

使用`useradd`命令添加用戶：

    # useradd -m -G "附加组" -s "登录shell" "用户"

- `-m`/`--create-home`：創建用戶主目錄`/home/[用戶名]`；在自己的主目錄內，即使不是root用戶也可以讀寫文件、安裝程序等等。
- `-G`/`--groups`：用戶要加入的附加組列表；使用逗號分隔多個組，不要添加空格；如果不設置，用戶僅僅加入初始組。
- `-s`/`--shell`：用戶默認登錄shell的路徑；啟動過程結束後，默認啟動的登錄shell在此處設定；請確保使用的shell已經安裝，默認是 Bash。

警告：為了登錄，登錄 shell 必須位於 `/etc/shells` 中, 否則 PAM 的 `pam_shell` 模塊會阻止登錄請求。不要使用 `/usr/bin/bash` 替代 `/bin/bash`, 除非這個路徑已經在 `/etc/shells`中正確配置.

- 有時候需要禁止某些用戶執行登錄動作，例如用來執行系統服務的用戶。將shell設置成 `/usr/bin/nologin` 就可以禁止用戶登錄。(`nologin(8)`).
- 需要用 passwd 為新用戶設置密碼。
- 如果設置了用戶初始組的名稱或數字ID；該組必須是存在的；如果沒有設置該選項，`useradd`會根據`/etc/login.defs`文件中的USERGROUPS_ENAB環境變量進行設置。默認(`USERGROUPS_ENAB yes`) 會用和用戶名相同的名字創建群組，`GID` 等於 `UID`。

更多選項說明請查看 useradd(8)。

### 添加登錄用戶

要用默認設置添加一個名為archie的用戶：

    # useradd -m archie

提示：使用 `useradd --defaults` 可以查看 shell 的默認值。默認是 Bash。使用 `-s`/`--shell` 選項可以設置其他值。`/etc/shells` 記錄了可以使用的登錄 shell。

此命令會自動創建 `archie` 群組，並成為 `archie` 的默認登錄群組。建議每一個用戶都設置自己的默認群組，因為umask 默認值是 `002`, 所以同一個默認群組的用戶會有創建文件的寫權限。參閱 User Private Groups[失效連結 2021-11-19 ⓘ]。

要賦予一個群組某個目錄的寫權限，可以在父目錄中設置：

    # chmod g+s our_shared_directory

通過下列命令設置用戶密碼，雖然不是必須的，還是強烈建議設置密碼

    # passwd [用户名]

如果需要臨時更改GID，也可以使用 newgrp 命令在運行時將用戶的默認 GID 更改為其他 GID。例如，執行 `newgrp "組名"` 後，用戶創建的文件將關聯到該`組名`的 GID，而無需重新登錄。若要恢復默認 GID，只需執行不帶`組名`的 `newgrp` 命令即可。

### 添加系統用戶

為進程、守護進程分配不同的系統用戶可以更安全的管控目錄及文件的訪問。下面命令創建一個不創建 `home` 目錄的非登錄用戶(可以加入 `-U` 參數創建一個和用戶名相同的群組):

    # useradd -r -s /usr/bin/nologin username

如果用戶需要特殊的 UID/GID，可以加入 `-u`/`--uid` 和 `-g`/`--gid` 選項：

    # useradd -r -u 850 -g 850 -s /usr/bin/nologin username

### 修改登錄名或主目錄

更改用戶主目錄：

    # usermod -d /my/new/home -m username

`-m` 選項會自動創建新目錄並移動內容。

更改用戶登錄名：

    # usermod -l newname oldname

警告：確保你不是使用你要修改的用戶名登錄，同時按下(`Ctrl`+`Alt`+`F1`)打開一個新的終端，使用root用戶登錄，或用其他用戶登錄後使用su命令登錄為root用戶。

操作得當的話，在Arch（或其他Linux發行版）中更改用戶名是安全的，並且很簡單。你可以更改用戶所屬的組。按照以下步驟進行，可以保留受影響用戶的UID和GID，而不會搞亂你已經設置好的文件權限。還有一種方法是手動編輯 `/etc/passwd` 文件。

- 如果要使用sudo，請更新文件`/etc/sudoers`把新的用戶（以root登錄使用visudo命令）添加進去。
- 如果修改了`~/.bashrc`的PATH環境變量，並把新的用戶添加進去。。
- 更改用戶名後，我不得不重新安裝Thunderbird擴展（Enigmail）。
- 系統（桌面快捷方式，腳本等）裡使用了舊的用戶主目錄的地方，都需要進行修改。要在腳本中避免這樣的問題，可以使用`~`或`$HOME`變量來表示主目錄。

### 其他用戶管理示例

將用戶加入 `群組`，用逗號分隔:

    # usermod -aG 群组 username

警告：如果不使用 `-a` 選項，用戶會離開沒有列在`群組`的其它群組。

要修改用戶的登錄 shell:

    # usermod -s /bin/bash username

通過下列命令設置GECOS欄位（用戶信息，例如用戶全名）：

    # chfn [用户名]

（這樣將會以交互式模式啟動`chfn`）

此外，可以設置 GECOS comment：

    # usermod -c "Comment" username

使用`userdel`命令刪除用戶：

    # userdel -r [用户名]

`-r`選項表示一併刪除用戶主目錄和郵件。

提示：adduserAUR 可以以交互的方式執行 useradd, chfn 和 passwd，參考 FS#32893.

### 用戶信息存儲

本地用戶信息儲存在`/etc/passwd`文件中。要查看系統上所有用戶帳戶：

    $ cat /etc/passwd

一行代表一個用戶，格式如下，每行分七個部分，用英文冒號「:」分開：

    account:password:UID:GID:GECOS:directory:shell

此處：

- `account`：用戶名，不能為空，而且要符合標準的*NIX命名規則。
- `password`：加密的密碼，可以使用一個小寫的"x"（不帶括號）表示密碼保存在`/etc/shadow`文件裡。
- `UID` `GID`：每個用戶和組有一個對應的UID和GID（用戶ID和組ID）。Arch裡面，第一個非 root 普通用戶的默認 UID 是 1000，後續創建的用戶UID也應大於1000，特定用戶的GID應該屬於指定的首要組，組的ID數值列在`/etc/group`文件裡。
- `GECOS`：可選的注釋欄位，通常記錄用戶全名
- `directory`：用於登錄命令設置`$HOME`環境變量。某些服務的用戶主目錄設置為"/"是安全的，但不建議普通用戶設置為此目錄。
- `shell`：是用戶默認登錄的shell，通常是Bash，還可選擇其他的命令解釋器，默認是"/bin/bash"（不帶括號），如果你用的是別的shell，在這裡設置其路徑，此部分是可選的，可留空。

注意：Arch Linux 使用影子密碼。`passwd`文件對所有人可讀，在裡面存儲密碼（無論是否加密過）是很不安全的。在`password`欄位，通常使用一個占位字符（`x`）代替。加密過的密碼儲存在`/etc/shadow`文件，該文件對普通用戶限制訪問。

示例：

    jack:x:1001:1003:Jack Smith,some comment here,,:/home/jack:/bin/bash

示例分解說明：用戶登錄名為jack，密碼保存在`/etc/shadow`，UID為1001，首要組的ID是1003 (users組)，全名Jack Smith並加了一些注釋，主目錄是`/home/jack`，使用Bash作為默認shell。

pwck 命令可以用來驗證用戶資料庫是否完整。它可以在檢查的同時用 GID 排序用戶列表，在比較時很有用：

    # pwck -s

警告：Arch Linux的默認文件會由新版本的'filesystem包 軟體包創建為.pacnew文件。除非Pacman輸出了需要您採取行動的相關信息， 這些 .pacnew 可以且應當被刪除。systemd-sysusers(8) 或者軟體包安裝腳本會自動添加或重新添加新的，所需的默認用戶和組。

## 用戶組管理

`/etc/group`文件儲存了系統中用戶組的信息，詳情參見：group(5)。還有一個很少使用的 `gshadow`，詳情請參考 gshadow(5).

使用`groups`命令查看用戶所在組的名稱：

    $ groups [用户名]

若省略用戶名，默認顯示當前用戶所在組。

`id`命令提供額外的信息，包括用戶UID以及相關用戶組GID：

    $ id [用户名]

查看所有組：

    $ cat /etc/group

使用`groupadd`創建新的組：

    # groupadd [组名]

使用`gpasswd`將用戶添加到組：

    # gpasswd -a [用户名] [组名]

更改用戶所屬的組名，不變更`GID`：

    # groupmod -n newname oldname

刪除用戶組：

    # groupdel [组名]

將用戶從組中移除：

    # gpasswd -d [用户名] [组名]

如果用戶已登錄，必須重新登錄使更改生效。

可以使用 grpck 命令驗證系統組文件的完整性。

警告：Arch Linux的默認文件會由新版本的'filesystem包 軟體包創建為.pacnew文件。除非Pacman輸出了需要您採取行動的相關信息， 這些 .pacnew 可以且應當被刪除。systemd-sysusers(8) 或者軟體包安裝腳本會自動添加或重新添加新的，所需的默認用戶和組。

## 群組列表

本節解釋來自 filesystem包 的常用組的用途。有很多其他組，在安裝相關包時會使用正確的 GID 創建。請到相關軟體的首頁上了解更多信息。

注意：刪除軟體包並不會自動移除軟體包自動創建的用戶/組（UID/GID）。這是有意為之的設計，因為如果不這樣做，在軟體包使用期間創建的任何文件都將變為無主文件，從而構成潛在的安全風險。

### 用戶組

組 | 影響文件 | 作用
--- | --- | ---
adm |  | 通常用來給予系統日誌讀權限，可以讀取 journal 文件。
ftp | `/srv/ftp/` | 訪問 FTP 伺服器.
games | `/var/games` | 訪問一些遊戲。
log |  | 訪問 syslog-ng 創建的 `/var/log/` 日誌文件. |
http | `/srv/http/` | 訪問 HTTP 伺服器文件.
rfkill | 不再使用! 控制無線設備的電源 (被 rfkill 使用).
sys |  | 可以管理 CUPS 列印服務。 |
systemd-journal | `/var/log/journal/*` | 以只讀方式訪問系統日誌，和 `adm` 和 `wheel` 不同 [1]. 不在此組中的用戶僅能訪問自己生成的信息。
users |  | 標準用戶組。
uucp | `/dev/ttyS[0-9]+`, `/dev/tts/[0-9]+`, `/dev/ttyUSB[0-9]+`, `/dev/ttyACM[0-9]+`, `/dev/rfcomm[0-9]+` | 串口和 USB 設備，例如貓、手柄 RS-232/串口。
wheel |  | 管理組，可以訪問 journal 文件和 CUPS 列印服務，可以用戶 sudo　和 su 命令權限管理(需要額外設置)。

### 系統組

下列組系統使用，一般不被 Arch 用戶使用：

組 | 影響文件 | 作用
--- | --- | ---
avahi |  |
clamav | `/var/lib/clamav/*`, `/var/log/clamav/*` | Clam AntiVirus 使用.
dbus | `/var/run/dbus/*` |
kmem | `/dev/port`, `/dev/mem`, `/dev/kmem` |
locate | `/usr/bin/locate`, `/var/lib/locate`, `/var/lib/mlocate`, `/var/lib/slocate` | 見 Locate。
lp | `/dev/lp[0-9]*`, `/dev/parport[0-9]*` | 訪問並口設備（如印表機）。
mail | `/usr/bin/mail` |
mpd | `/var/lib/mpd/*`, `/var/log/mpd/*`, `/var/run/mpd/*`, 可選的音樂目錄 | MPD 組.
nobody |  | 無權限的組。
ntp | `/var/lib/ntp/*` | NTPd 組.
proc | `/proc/pid/` | A group authorized to learn processes information otherwise prohibited by `hidepid=` mount option of the proc file system. The group must be explicitly set with the `gid=` mount option.
root | `/*` | 完全的系統管理和控制 (root, admin)
smmsp |  | sendmail 群組.
tty | `/dev/tty`, `/dev/vcc`, `/dev/vc`, `/dev/ptmx` | 訪問 `/dev/ACMx`
utmp | `/run/utmp`, `/var/log/btmp`, `/var/log/wtmp` |
vboxsf | 虛擬系統的共享目錄 | VirtualBox使用.

### systemd 之前的群組

在 Arch 遷移到 systemd 之前，用戶需要主動加入以下組，才能訪問對應設備。This way has been deprecated in favour of udev marking the devices with a `uaccess` tag[失效連結 2022-09-23 ⓘ] and logind assigning the permissions to users dynamically via ACLs according to which session is currently active. 注意在 session 沒有損壞時這才能工作 (見 General troubleshooting#Session permissions 以檢查）。

There are some notable exceptions which require adding a user to some of these groups: for example if you want to allow users to access the device even when they are not logged in. However, note that adding users to the groups can even cause some functionality to break (for example, the `audio` group will break fast user switching and allows applications to block software mixing).

如下組是 systemd 之前使用，目前已經沒有任何作用，使用後還可能對功能有影響:

組 | 作用
--- | ---
audio | `/dev/audio`, `/dev/snd/*`, `/dev/rtc0` | 直接訪問聲音硬體(ALSA 和 OSS),JACK 也用來給予用戶實時處理權限。
camera |  | 訪問 Digital Cameras.
disk | `/dev/sda[1-9]`, `/dev/sdb[1-9]` | 直接訪問不受 optical, floppy 和 storage 組控制的塊設備. 除非有特殊需要, 否則不建議將一般用戶添加至該組.
floppy | `/dev/fd[0-9]` | 訪問軟盤驅動器。
lp | `/etc/cups`, `/var/log/cups`, `/var/cache/cups`, `/var/spool/cups` | 訪問列印設備，管理列印任務。
network |  | 改變網絡設置的權限，比如使用 NetworkManager 的權限.
optical | `/dev/sr[0-9]`, `/dev/sg[0-9]` | 訪問光學設備，比如CD，DVD。
scanner | `/var/lock/sane` | 訪問掃描儀硬體。
storage |  | 訪問可移動儲存器，例如 USB 硬碟、flash 存儲器、MP3 播放器等；用戶可以通過 D-Bus 掛載設備。
sys |  | 管理 CUPS 中的印表機.
video | `/dev/fb/0`, `/dev/misc/agpgart` | 訪問視頻捕獲和硬體加速設備。例如framebuffer (X 不屬於這個組也能使用).

### 不再使用的組

Group | Affected files | Purpose
--- | --- | ---
bin | none | Historical
daemon |  |
lock |  | Used for lockfile access. Required by e.g. gnokiiAUR.
mem |  |
network |  | Unused by default. Can be used e.g. for granting access to NetworkManager (see NetworkManager#Set up PolicyKit permissions).
power |  |
uuidd |  |
users |  | The primary group for users when user private groups are not used (generally not recommended), e.g. when creating users with `USERGROUPS_ENAB no` in `/etc/login.defs` or the `-N`/`--no-user-group` option of useradd.

分類：​

- 安全
- 包含失效連結的頁面

用戶和用戶組
新增話題