跳转至内容

用户和用户组

来自 ArchWiki
(从 Chage 重定向而来)

在 GNU/Linux 系统中,用户和组用于 访问控制——即控制对系统文件、目录和外围设备的访问。Linux 默认提供相对简单/粗粒度的访问控制机制。有关更高级的选项,请参阅 ACLCapabilitiesPAM#Configuration How-Tos

概述

用户是指使用计算机的任何人。在此,我们描述代表这些用户的名称。可能是 Mary 或 Bill,他们可以使用 Dragonlady 或 Pirate 等名称代替真实姓名。重要的是计算机为它创建的每个帐户都有一个名称,并且正是通过这个名称,一个人才能获得使用计算机的权限。一些系统服务也使用受限或特权用户帐户运行。

管理用户的目的是通过在某些特定方面限制访问来确保安全。超级用户(root)对操作系统及其配置拥有完全访问权限;它仅用于管理目的。非特权用户可以使用一些程序进行受控的 权限提升

任何个人都可以拥有多个帐户,只要他们为创建的每个帐户使用不同的名称即可。此外,还有一些保留名称(如“root”)不能使用。

用户可以被分组到一个“组”中,用户也可以被添加到现有组以利用其授予的特权访问。

注意 初学者应谨慎使用这些工具,并避免与除自己的帐户外任何现有用户帐户进行任何操作。

权限和所有权

来自 In UNIX Everything is a File

UNIX 操作系统巩固了几个塑造其设计、用户界面、文化和演变的重要统一思想和概念。其中最重要的一点可能是“一切皆文件”的格言,它被广泛认为是 UNIX 的定义点之一。
这个核心设计原则包括为访问各种输入/输出资源提供统一的范例:文档、目录、硬盘、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 系统上的每个文件都属于一个用户和一个组。此外,还有三种类型的访问权限:读、写和执行。可以对文件的所有者用户、所有者组和其他人(没有所有权者)应用不同的访问权限。可以通过查看 ls 命令的长列表格式来确定文件的所有者和权限。

$ ls -l /boot/
total 13740
drwxr-xr-x 2 root root    4096 Jan 12 00:33 grub
-rw-r--r-- 1 root root 8570335 Jan 12 00:33 initramfs-linux-fallback.img
-rw-r--r-- 1 root root 1821573 Jan 12 00:31 initramfs-linux.img
-rw-r--r-- 1 root root 1457315 Jan  8 08:19 System.map26
-rw-r--r-- 1 root root 2209920 Jan  8 08:19 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--r--)。同时,字符 drwxrwx--- 表示文件的所有者和属于所有者组的用户都具有读、写和执行权限(rwxrwx),而其他用户则被拒绝访问(---)。第一个字符代表文件类型。

使用 find 工具列出由用户或组拥有的文件。

# find / -group groupname
# find / -group groupnumber
# find / -user user

文件的所有者用户和组可以使用 chown(更改所有者)命令进行更改。文件的访问权限可以使用 chmod(更改模式)命令进行更改。

有关更多详细信息,请参阅 chown(1)chmod(1)Linux 文件权限

Shadow (影子文件)

Arch Linux 上的用户、组和密码管理工具来自 shadow 包,它是 base 元数据包的依赖项。

文件列表

警告 请勿手动编辑这些文件。有工具可以正确处理锁定并避免使数据库格式失效。有关概述,请参阅 #用户管理#组管理
文件 目的
/etc/shadow 安全的用户帐户信息
/etc/passwd 用户帐户信息
/etc/gshadow 包含组帐户的影子信息
/etc/group 定义用户所属的组

用户管理

要列出当前登录到系统的用户,可以使用 who 命令。要列出所有现有用户帐户及其存储在 用户数据库中的属性,请以 root 身份运行 passwd -Sa。有关输出格式的说明,请参阅 passwd(1)

要添加一个新用户,请使用 useradd 命令

# useradd -m -G additional_groups -s login_shell username
-m/--create-home
将创建用户的家目录,路径为 /home/username。目录将由 skeleton 目录中的文件填充。创建的文件归新用户所有。
-G/--groups
一个逗号分隔的附加组列表,用户也是这些组的成员。默认情况下,用户仅属于初始组。
-s/--shell
用户登录 shell 的路径。如果您选择的 shell 不是 Bash,请确保已安装。新创建用户的默认 shell 可以在 /etc/default/useradd 中设置。
警告 为了能够登录,登录 shell 必须是 /etc/shells 中列出的 shell 之一,否则 PAM 模块 pam_shells(8) 将拒绝登录请求。
注意 必须使用 passwd 定义新创建用户的密码,如 #添加用户的示例 中所示。

如果通过名称或编号指定了初始登录组,则必须引用一个已存在的组。如果未指定,useradd 的行为将取决于 /etc/login.defs 中包含的 USERGROUPS_ENAB 变量。默认行为(USERGROUPS_ENAB yes)是创建一个与用户名同名的组。

当登录 shell 意图为非功能性时,例如当用户帐户是为特定服务创建的时,可以在常规 shell 的位置指定 /usr/bin/nologin 以礼貌地拒绝登录(请参阅 nologin(8))。

有关其他支持的选项,请参阅 useradd(8)

添加用户的示例

要添加一个名为 archie 的新用户,创建其家目录,并在组、目录名称、使用的 shell 和其他各种参数方面使用所有默认设置。

# useradd -m archie

尽管没有强制要求用密码保护新创建的用户 archie,但强烈建议这样做。

# passwd archie

上述 useradd 命令还将自动创建一个名为 archie 的组,并使其成为用户 archie 的默认组。使每个用户拥有自己的组(组名与用户名相同)是添加用户的首选方式。

您也可以使用 -g 选项将默认组设置为其他名称,但请注意,在多用户系统中,不建议为每个用户使用单个默认组(例如 users)。原因是,通常,为特定用户组提供共享写访问的方法是将用户 umask 值设置为 002,这意味着默认情况下,默认组始终对您创建的任何文件具有写访问权限。另请参阅 用户私有组。如果用户必须是特定组的成员,请在创建用户时将其指定为附加组。

在推荐的场景中,其中默认组与用户名同名,则默认情况下,只有创建文件的用户才能写入文件。要允许对特定组的写访问,可以通过在该目录上设置 setgid 位,使共享文件/目录对该组中的所有人默认可写,并将所有者组自动设置为拥有父目录的组。

# chmod g+s our_shared_directory

否则,将使用文件创建者的默认组(通常与用户名相同)。

如果需要临时更改 GID,您还可以使用 newgrp 命令在运行时将用户的默认 GID 更改为另一个 GID。例如,在执行 newgrp groupname 后,用户创建的文件将与 groupname GID 相关联,而无需重新登录。要切换回默认 GID,请在不带组名的情况下执行 newgrp

更改用户默认设置

用于创建新帐户的默认值在 /etc/default/useradd 中设置,并可以使用 useradd --defaults 显示。例如,要全局更改默认 shell,请设置 SHELL=/usr/bin/shell。也可以使用 -s/--shell 选项单独指定不同的 shell。使用 chsh -l 列出有效的登录 shell。

也可以在 /etc/skel 中指定要添加到新创建用户家目录的文件。这对于最小化的窗口管理器非常有用,在这些管理器中,配置文件需要手动配置才能达到 DE 熟悉的行为。例如,为所有新创建的用户设置默认快捷方式。

# mkdir /etc/skel/.config
# cp ~archie/.config/sxhkd /etc/skel/.config

另请参阅:Display manager#Run ~/.xinitrc as a session 以将 xinitrc 添加到显示管理器上的所有用户的选项。

添加系统用户的示例

系统用户可用于在不同用户下运行进程/守护进程,从而保护(例如使用 chown)文件和/或目录,以及更多计算机加固示例。

使用以下命令创建一个没有 shell 访问权限且没有 home 目录的系统用户(可选地附加 -U 参数以创建与用户同名的组,并将用户添加到该组)

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

如果系统用户需要特定的用户 ID 和组 ID,请在创建用户时使用 -u/--uid-g/--gid 选项指定它们。

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

更改用户的登录名或主目录

更改用户的家目录

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

-m 选项还会自动创建新目录并将内容移至其中。

提示 您可以从用户的前家目录创建链接到新目录。这样做将允许程序找到具有硬编码路径的文件。
# ln -s /my/new/home/ /my/old/home

确保 /my/old/home 末尾没有 /

更改用户的登录名

# usermod -l newname oldname
警告 请务必不要以您要更改名称的用户身份登录。打开一个新的 tty(例如 Ctrl+Alt+F6)并以 root 或其他用户身份登录,然后 提升到 rootusermod 应该会阻止您误操作。

正确执行时,更改用户名是安全且容易的,只需使用 usermod 命令即可。如果用户与同名组相关联,您可以使用 groupmod 命令重命名该组。

或者,可以直接编辑 /etc/passwd 文件,请参阅 #用户数据库 以了解其格式的介绍。

同时请牢记以下几点

  • 如果您使用 sudo,请确保更新您的 /etc/sudoers 文件以反映新的用户名(通过以 root 身份运行 visudo 命令)。
  • 个人 crontabs 需要通过重命名 /var/spool/cron 中用户的 crontab 文件(从旧名称到新名称),然后打开 crontab -e 来更改任何相关的路径并相应地调整文件权限来完成。
  • Wine 的个人目录/文件内容,例如 ~/.wine/drive_c/users~/.local/share/applications/wine/Programs 以及可能更多内容,需要手动重命名/编辑。
  • 某些 Thunderbird 插件,如 Enigmail,可能需要重新安装。
  • 系统上的任何内容(桌面快捷方式、shell 脚本等),如果使用指向您家目录的绝对路径(例如 /home/oldname),都需要更改以反映您的新名称。为避免在 shell 脚本中出现这些问题,只需使用 ~$HOME 变量即可表示家目录。
  • 另外,请勿忘记相应地编辑 /etc/ 中依赖于您的绝对路径的配置文件(例如 Samba、CUPS 等)。学习需要更新哪些文件的不错方法是使用 grep 命令,如下所示:grep -r old_user *

其他用户管理示例

要输入 GECOS 注释(例如用户的全名)的用户信息,请键入

# chfn username

(这样 chfn 将以交互模式运行)。

或者,可以使用以下命令更自由地设置 GECOS 注释:

# usermod -c "Comment" username

要将用户密码标记为已过期,要求他们在首次登录时创建新密码,请键入

# chage -d 0 username

可以使用 userdel 命令删除用户帐户。

# userdel -r username

-r 选项指定也应删除用户的家目录和邮件 spool。

更改用户的登录 shell

# usermod -s /usr/bin/bash username
提示 adduserAUR 脚本允许以交互方式完成 useraddchfnpasswd 的工作。另请参阅 FS#32893

用户数据库

本地用户存储在纯文本文件 /etc/passwd 中:它的每一行代表一个用户帐户,并包含七个由冒号分隔的字段。

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

其中:

  • account 是用户名。此字段不能为空。适用标准的 *NIX 命名规则。
  • password 是用户密码。
    警告 passwd 文件是所有人可读的,因此在此文件中存储密码(无论是否哈希)是不安全的。相反,Arch Linux 使用 影子密码password 字段将包含一个占位符字符(x),表示哈希密码已保存在访问受限的文件 /etc/shadow 中。因此,建议始终使用 passwd 命令更改密码。
  • UID 是数值用户 ID。在 Arch 中,对于所谓的普通用户(相对于服务),第一个登录名(root 之后)的 UID 默认为 1000;后续用户的 UID 条目应大于 1000。
  • GID 是用户的数值主组 ID。GID 的数字值列在 /etc/group 中。
  • GECOS 是一个可选字段,用于信息目的;通常包含用户的全名,但它也可以被 finger 等服务使用,并由 chfn 命令管理。此字段是可选的,可以留空。
  • directory 由 login 命令用于设置 $HOME 环境变量。一些拥有自己用户的服务使用 /,但普通用户通常在 /home 下设置目录。
  • shell 是用户默认 命令 shell 的路径。此字段是可选的,默认为 /usr/bin/bash

示例

archie:x:1001:1003:Archie,some comment here,,:/home/archie:/usr/bin/bash

分解来看,这意味着:用户 archie,其密码在 /etc/shadow 中,其 UID 为 1001,其主组为 1003。Archie 是其全名,并且有一个与该帐户关联的注释;其家目录是 /home/archie,并且它正在使用 Bash

可以使用 pwck 命令来验证用户数据库的完整性。它也可以同时按 UID 对用户列表进行排序,这有助于进行比较。

# pwck -s
警告 Arch Linux 的文件默认值由 filesystem 包的新版本创建为 pacnew 文件。除非 Pacman 输出相关消息需要采取行动,否则这些 .pacnew 文件可以,也应该被忽略/删除。通过 systemd-sysusers(8) 或包安装脚本按需添加或重新添加新的必需默认用户和组。

自动完整性检查

而不是手动运行 pwck/grpckshadow 包的一部分(并且通过安装该包启用)的 systemd timer shadow.timer 将每天启动 shadow.serviceshadow.service 将运行 pwck(8)grpck(8) 来验证密码和组文件的完整性。

如果报告了不一致之处,可以使用 vigr(8) 命令编辑组,使用 vipw(8) 命令编辑用户。这提供了一层额外的保护,因为这些命令会锁定数据库进行编辑。请注意,默认文本编辑器是 vi,但如果设置了 EDITOR 环境变量,则会使用该编辑器。

使实时系统中的用户与 systemd sysuser.d 默认设置保持一致

警告 systemd 不提供任何官方方法将现有帐户迁移到完全锁定的系统帐户 [1]

随着软件包采用 change-sysusers-to-fully-locked-system-accounts,过去创建的软件包用户将不会继承用于提高锁定/过期状态安全性的新软件包默认设置。这些用户需要手动修改才能实现此更改。 user-analysis.sh 就是这样做的。

此外,该脚本还识别孤立用户(由已不在系统上的软件包创建的用户)并可以自动删除它们。

组管理

/etc/group 是定义系统中组的文件(有关详细信息,请参阅 group(5))。还有一个伴随文件 gshadow,很少使用。其详细信息请参阅 gshadow(5)

使用 groups 命令显示组的成员资格

$ groups user

如果省略 user,则显示当前用户的组名。

id 命令提供更多详细信息,例如用户的 UID 和关联的 GID。

$ id user

列出系统上的所有组

$ cat /etc/group

使用 groupadd 命令创建新组。

# groupadd group
注意 如果用户当前已登录,他们必须注销并重新登录才能使更改生效。

使用 gpasswd 命令将用户添加到组(有关错误,请参阅 FS#58262)。

# gpasswd -a user group

或者,使用 usermod 将用户添加到其他组(将 additional_groups 替换为逗号分隔的列表)。

# usermod -aG additional_groups username
警告 如果省略 usermod 命令中的 -a 选项,用户将被从所有未在 additional_groups 中列出的组中移除(即,用户将仅是 additional_groups 中列出的那些组的成员)。

使用 groupmod 命令修改现有组,例如将 old_group 组重命名为 new_group

# groupmod -n new_group old_group
注意 这将更改组名,但不会更改组的数值 GID。因此,之前由 old_group 拥有的所有文件将归 new_group 所有。

删除现有组

# groupdel group

从组中删除用户

# gpasswd -d user group

可以使用 grpck 命令来验证系统组文件的完整性。

警告 Arch Linux 的文件默认值由 filesystem 包的新版本创建为 .pacnew 文件。除非 Pacman 输出相关消息需要采取行动,否则这些 .pacnew 文件可以,也应该被忽略/删除。通过 systemd-sysusers(8) 或包安装脚本按需添加或重新添加新的必需默认用户和组。

组列表

本节解释了 filesystem 包中基本组的用途。还有许多其他组,当安装相关软件包时,会使用 正确的 GID 创建它们。有关详细信息,请参阅软件的主页。

注意 稍后卸载软件包不会再次删除自动创建的用户/组(UID/GID)。这是故意的,因为否则在使用过程中创建的任何文件都会被留下孤立,可能带来安全风险。

用户组

非 root 工作站/桌面用户通常需要添加到以下一些组,以便访问硬件外围设备和方便系统管理。

受影响的文件 目的
adm 管理组,通常用于授予对受保护日志的读取访问权限。它对 journal 文件具有完全读取访问权限。
ftp /srv/ftp/ 访问由 FTP 服务器提供的文件。
games /var/games 访问某些游戏软件。
http /srv/http/ 访问由 HTTP 服务器提供的文件。
log 访问由 syslog-ng 创建的 /var/log/ 中的日志文件。
rfkill /dev/rfkill 控制无线设备电源状态的权限(由 rfkill 使用)。
sys CUPS 中管理打印机的权限。
systemd-journal /var/log/journal/* 可用于提供对 systemd 日志的只读访问,作为 admwheel 的替代方案 [2]。否则,仅显示用户生成的消息。
uucp /dev/ttyS[0-9]+/dev/tts/[0-9]+/dev/ttyUSB[0-9]+/dev/ttyACM[0-9]+/dev/rfcomm[0-9]+ RS-232 串行端口以及连接到它们的设备。
wheel 管理组,通常用于授予执行管理操作的权限。它对 journal 文件具有完全读取访问权限,并拥有在 CUPS 中管理打印机的权限。还可以用于授予对 sudosu 工具的访问权限(两者默认都不使用它)。

系统组

以下组用于系统目的,仅在特定目的时才需要分配给用户。

受影响的文件 目的
dbus 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
nobody 非特权组。
proc /proc/pid/ 一个有权了解进程信息(否则会被 hidepid= 挂载选项禁止)的组,该选项用于 proc 文件系统。必须使用 gid= 挂载选项显式设置该组。
root /* 完整的系统管理和控制(root,admin)。
smmsp sendmail 组。
tty /dev/tty/dev/vcc/dev/vc/dev/ptmx
utmp /run/utmp/var/log/btmp/var/log/wtmp 请参阅 Wikipedia:utmp#utmp, wtmp and btmp

Systemd 之前的组

在 arch 迁移到 systemd 之前,用户必须手动添加到这些组才能访问相应的设备。现在已弃用此方法,转而使用 udev 为设备打上 uaccess 标签,并由 logind 根据当前活动的会话动态地通过 ACL 为用户分配权限。请注意,会话必须保持活跃才能正常工作(请参阅 General troubleshooting#Session permissions 进行检查)。

有一些值得注意的例外情况需要将用户添加到某些组中:例如,如果您希望用户即使在未登录的情况下也能访问设备。但是,请注意,将用户添加到组中甚至可能导致某些功能失效(例如,audio 组会破坏快速用户切换,并允许应用程序阻止软件混音)。

受影响的文件 目的
audio /dev/audio, /dev/snd/*, /dev/rtc0 直接访问声音硬件,适用于所有会话。在远程会话中,仍然需要此设置才能使 ALSAOSS 工作,请参阅 ALSA#User privileges,否则不推荐。与其他一些发行版不同,此组不用于 实时权限
disk /dev/sd[a-zA-Z]*[1-9]*, /dev/nvme[0-9]*p[1-9]*, /dev/mmcblk[0-9]*p[1-9]* 访问未受 opticalfloppystorage 等其他组影响的块设备。
floppy /dev/fd[0-9]* 访问软盘驱动器。
输入 /dev/input/event[0-9]*, /dev/input/mouse[0-9]* 访问输入设备。在 systemd 215 中引入 [3]
kvm /dev/kvm 使用 KVM 访问虚拟机。
optical /dev/sr[0-9], /dev/sg[0-9] 访问光驱(如 CD 和 DVD 驱动器)。
scanner /var/lock/sane 访问扫描仪硬件。
storage /dev/st[0-9]*[lma]*, /dev/nst[0-9]*[lma]* 用于访问可移动驱动器(如 USB 硬盘、闪存/U 盘、MP3 播放器);允许用户挂载存储设备。[4]

现在仅用于直接访问磁带(如果没有自定义 udev 规则)。[5][6][7]

使用 udisks/udisksctl 操纵某些设备也需要此组。

video /dev/fb/0, /dev/misc/agpgart 访问视频采集设备、2D/3D 硬件加速、帧缓冲(X 可以在不属于此组的情况下使用)。

未使用的组

以下组目前未用于任何目的

受影响的文件 目的
bin none 历史
daemon
lock 用于锁定文件访问。例如,gnokiiAUR 需要此组。
mem
network 默认未使用。可用于例如授予对 NetworkManager 的访问权限(参见 NetworkManager#Set up PolicyKit permissions)。
power
uuidd
users 当未使用用户私有组时(通常不推荐),用户的首选组,例如,在 /etc/login.defs 中创建用户时使用 USERGROUPS_ENAB no,或者使用 useradd-N/--no-user-group 选项。

本文或本节已候选合并到 #Shadow

说明: 分开的章节没有意义。(在 Talk:Users and groups 中讨论)

本文或本章节的准确性存在争议。

原因: Arch Linux 是否真的偏爱 chage 而不是 vipw -svigr -s?(在 Talk:Users and groups#Utilities to handle the shadow file in acrh 中讨论)

getent(1) 可用于读取特定记录。

$ getent group tty

#User database 中警告的那样,使用诸如 passwdchfn 等特定实用程序是更改数据库的更好方法。然而,有时也需要直接编辑它们。对于这些情况,提供了 vipwvigr。强烈建议使用这些定制编辑器而不是通用文本编辑器,因为它们可以锁定数据库以防止并发编辑。它们还有助于防止无效条目和/或语法错误。请注意,Arch Linux 偏好使用 chage 等特定工具来修改 shadow 数据库,而不是使用来自 util-linuxvipw -svigr -s。另请参阅 FS#31414

lslogins(1)lastlog2(1) 是用于查看 utmp 相关文件的一些工具。