用户和组

出自 ArchWiki
(重定向自 Chage

在 GNU/Linux 上,用户和组用于访问控制——即控制对系统文件、目录和外围设备的访问。默认情况下,Linux 提供相对简单/粗略的访问控制机制。有关更高级的选项,请参阅 ACLCapabilitiesPAM#配置指南

概述

用户是指任何使用计算机的人。在这里,我们描述的是代表这些用户的名称。可能是 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 目录创建为 /home/username。该目录由骨架目录中的文件填充。创建的文件归新用户所有。
-G/--groups
用户也是其成员的补充组的逗号分隔列表。默认情况下,用户仅属于初始组。
-s/--shell
用户登录 shell 的路径。如果选择 Bash 以外的其他 shell,请确保已安装所选 shell。新创建用户的默认 shell 可以在 /etc/default/useradd 中设置。
警告: 为了能够登录,登录 shell 必须是 /etc/shells 中列出的 shell 之一,否则 PAM 模块 pam_shells(8) 将拒绝登录请求。
注意: 必须为新创建的用户定义密码,使用 passwd,如 #添加用户示例 中所示。

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

当登录 shell 旨在是非功能性的时,例如当为特定服务创建用户帐户时,可以指定 /usr/bin/nologin 来代替常规 shell 以礼貌地拒绝登录(请参阅 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

另请参阅:显示管理器#将 ~/.xinitrc 作为会话运行,以将 xinitrc 作为选项添加到显示管理器上的所有用户。

添加系统用户示例

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

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

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

如果系统用户需要特定的用户和组 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 用户或其他用户身份登录,并提升为 root 权限usermod 应该可以防止您错误地执行此操作。

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

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

还要记住以下注意事项

  • 如果您正在使用 sudo,请确保更新您的 /etc/sudoers 以反映新的用户名(通过 root 身份的 visudo 命令)。
  • 个人 crontab 需要通过将 /var/spool/cron 中用户的文件从旧名称重命名为新名称来进行调整,然后打开 crontab -e 以更改任何相关路径并使其相应地调整文件权限。
  • Wine 的个人目录/文件内容在 ~/.wine/drive_c/users~/.local/share/applications/wine/Programs 以及可能更多的位置需要手动重命名/编辑。
  • 某些 Thunderbird 插件,例如 Enigmail,可能需要重新安装。
  • 系统上任何使用到您的主目录的绝对路径(即 /home/oldname)的内容(桌面快捷方式、shell 脚本等)都需要更改以反映您的新名称。为了避免 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 选项指定也应删除用户的主目录和邮件池。

要更改用户的登录 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 由登录命令用于设置 $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/grpcksystemd 定时器 shadow.timer(它是 shadow 软件包的一部分,并通过安装该软件包启用)将每天启动 shadow.serviceshadow.service 将运行 pwck(8)grpck(8) 以验证密码和组文件的完整性。

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

组管理

/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 的替代方案 [1]。否则,仅显示用户生成的消息。
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/ 一个被授权了解进程信息的组,否则会被 proc 文件系统hidepid= 挂载选项禁止。该组必须使用 gid= 挂载选项显式设置。
root /* 完整的系统管理和控制 (root, admin)。
smmsp sendmail 组。
tty /dev/tty, /dev/vcc, /dev/vc, /dev/ptmx
utmp /run/utmp, /var/log/btmp, /var/log/wtmp

systemd 前的组

在 arch 迁移到 systemd 之前,用户必须手动添加到这些组才能访问相应的设备。这种方式已被弃用,转而支持 udev,使用 uaccess 标签标记设备,并且 logind 根据当前活动的会话,通过 ACL 动态地为用户分配权限。请注意,会话不得中断才能使其工作(请参阅 常规故障排除#会话权限 以进行检查)。

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

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

现在仅用于直接访问磁带设备,如果未涉及自定义 udev 规则。[4][5][6][7]

也是通过 udisks/udisksctl 操作某些设备所必需的。

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

未使用的组

以下组目前没有任何用途

受影响的文件 用途
bin 历史遗留
daemon
用于锁文件访问。例如 gnokiiAUR 需要此组。
mem
网络 默认未使用。例如,可以用于授予 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 -s` 和 `vigr -s` 吗?(在 Talk:Users and groups#Utilities to handle the shadow file in acrh 中讨论)

可以使用 getent(1) 读取特定的记录。

$ getent group tty

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