用户和组
GNU/Linux 系统上的用户和组用于访问控制——即控制对系统文件、目录和外围设备的访问。默认情况下,Linux 提供相对简单/粗略的访问控制机制。对于更高级的选项,请参阅ACL、Capabilities 和 PAM#配置指南。
概述
用户是任何使用计算机的人。在这里,我们描述的是代表这些用户的名称。可能是 Mary 或 Bill,他们可能会使用 Dragonlady 或 Pirate 来代替他们的真实姓名。重要的是计算机为其创建的每个帐户都有一个名称,并且个人通过此名称获得使用计算机的权限。一些系统服务也使用受限或特权用户帐户运行。
管理用户是为了安全目的,通过以某些特定方式限制访问。超级用户 (root) 拥有对操作系统及其配置的完全访问权限;它仅供管理使用。非特权用户可以使用多个程序进行受控的权限提升。
只要个人为他们创建的每个帐户使用不同的名称,他们就可以拥有多个帐户。此外,还有一些保留名称可能无法使用,例如“root”。
用户可以组合成“组”,并且可以将用户添加到现有组以利用其授予的特权访问权限。
权限和所有权
- UNIX 操作系统凝结了一些统一的思想和概念,这些思想和概念塑造了其设计、用户界面、文化和演变。其中最重要的一个可能是格言:“一切皆文件”,这被广泛认为是 UNIX 的定义要点之一。
- 这个关键的设计原则包括为访问各种输入/输出资源提供统一的范例:文档、目录、硬盘驱动器、CD-ROM、调制解调器、键盘、打印机、监视器、终端,甚至一些进程间和网络通信。诀窍是为所有这些资源提供一个通用的抽象,UNIX 的创始人将每个资源都称为“文件”。由于每个“文件”都通过相同的 API 公开,因此您可以使用同一组基本命令来读取/写入磁盘、键盘、文档或网络设备。
- UNIX 和兼容操作系统中提供的一个基本且非常强大、一致的抽象是文件抽象。许多操作系统服务和设备接口被实现为向应用程序提供文件或文件系统隐喻。这为现有应用程序实现了新的用途,并大大提高了其功能——设计时考虑到特定用途的简单工具,可以通过 UNIX 文件抽象以新颖的方式使用。一个简单的工具,例如 cat,旨在读取一个或多个文件并将内容输出到标准输出,可以用于通过特殊的设备文件从 I/O 设备读取,这些设备文件通常位于
/dev
目录下。在许多系统中,音频录制和播放可以简单地通过命令“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---
表示文件的所有者和属于所有者组的用户都具有读取、写入和执行权限 (rwx
和 rwx
),而其他用户被拒绝访问 (---
)。第一个字符表示文件的类型。
使用 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
。该目录由骨架目录中的文件填充。创建的文件归新用户所有。 -G
/--groups
- 用户也是其成员的补充组的逗号分隔列表。默认情况下,用户仅属于初始组。
-s
/--shell
- 用户登录 shell 的路径。如果选择 Bash 以外的其他 shell,请确保已安装所选的 shell。新创建用户的默认 shell 可以在
/etc/default/useradd
中设置。
如果通过名称或编号指定了初始登录组,则它必须引用已存在的组。如果未指定,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
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
用户数据库
本地用户信息存储在纯文本 /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
自动完整性检查
无需手动运行 pwck
/grpck
,systemd 定时器 shadow.timer
(它是 shadow 软件包安装的一部分并由其启用)将每天启动 shadow.service
。shadow.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
-a
选项,则用户将从 additional_groups
中未列出的所有组中删除(即,用户将仅是 additional_groups
中列出的那些组的成员)。使用 groupmod 命令修改现有组,例如将 old_group
组重命名为 new_group
# groupmod -n new_group old_group
old_group
拥有的所有文件都将由 new_group
拥有。要删除现有组
# groupdel group
要从组中删除用户
# gpasswd -d user group
grpck 命令可用于验证系统组文件的完整性。
组列表
本节解释了来自 filesystem 软件包的基本组的用途。还有许多其他组,当安装相关软件包时,将使用正确的 GID创建这些组。有关详细信息,请参阅软件的主页。
用户组
非 root 工作站/桌面用户通常需要添加到以下某些组,以允许访问硬件外围设备并方便系统管理
组 | 受影响的文件 | 用途 |
---|---|---|
adm | 管理组,通常用于授予对受保护日志的读取权限。它具有对日志文件的完全读取权限。 | |
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 日志的只读访问权限,作为 adm 和 wheel 的替代方案 [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 中的打印机。 也可以用于授予对 sudo 和 su 实用程序的访问权限(默认情况下两者都不使用它)。 |
系统组
以下组用于系统目的,仅在专用目的时才需要分配给用户
组 | 受影响的文件 | 用途 |
---|---|---|
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]* |
访问并行端口设备(打印机和其他设备)。 |
/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 |
pre-systemd 组
在 arch 迁移到 systemd 之前,用户必须手动添加到这些组才能访问相应的设备。 这种方式已被弃用,转而支持 udev,它使用 uaccess
tag 标记设备,并且 logind 根据当前活动的会话通过 ACL 动态地为用户分配权限。 请注意,会话不能中断才能使其工作(请参阅 General troubleshooting#Session permissions 以进行检查)。
有一些值得注意的例外情况,需要将用户添加到其中一些组:例如,如果您希望允许用户即使在未登录时也能访问设备。 但是,请注意,将用户添加到组甚至可能导致某些功能中断(例如,audio
组将破坏快速用户切换,并允许应用程序阻止软件混音)。
组 | 受影响的文件 | 用途 |
---|---|---|
audio | /dev/audio , /dev/snd/* , /dev/rtc0 |
直接访问声音硬件,适用于所有会话。 仍然需要使 ALSA 和 OSS 在远程会话中工作,请参阅 ALSA#User privileges,否则不推荐使用。 与某些其他发行版不同,此组不用于 实时权限。 |
disk | /dev/sd[a-zA-Z]*[1-9]* |
访问不受其他组(如 optical 、floppy 和 storage )影响的块设备。 |
floppy | /dev/fd[0-9]* |
访问软盘驱动器。 |
input | /dev/input/event[0-9]* , /dev/input/mouse[0-9]* |
访问输入设备。 在 systemd 215 中引入 [2]。 |
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 播放器; 允许用户挂载存储设备。[3] 现在仅用于直接访问磁带,如果未涉及自定义 udev 规则。[4][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 选项创建用户时,用户的 primary group。 |
getent(1) 可用于读取特定记录。
$ getent group tty
正如 #User database 中警告的那样,使用诸如 passwd
和 chfn
之类的特定实用程序是更改数据库的更好方法。 然而,有时需要直接编辑它们。 对于这些情况,提供了 vipw
,vigr
。 强烈建议使用这些定制的编辑器,而不是使用通用的文本编辑器,因为它们会锁定数据库以防止并发编辑。 它们还有助于防止无效条目和/或语法错误。 请注意,Arch Linux 更倾向于使用特定工具,例如 chage,来修改 shadow 数据库,而不是使用 util-linux 中的 vipw -s
和 vigr -s
。 另请参阅 FS#31414。