Users and Groups (简体中文)
| 摘要 |
|---|
| 本文介绍如何使用系统工具添加、删除、管理用户和用户组。一些桌面环境也提供图形化的用户和用户组管理工具,但此处不涉及它们。 |
| 概览 |
| GNU/Linux通过用户和用户组进行访问控制。超级用户(root)对操作系统和系统配置享有完全的控制权,我们只应当在管理系统时使用它。无特权的普通用户可以使用su和sudo程序提升权限。 |
| 相关文章 |
| Change username |
| DeveloperWiki:UID / GID Database |
| PolicyKit |
| chmod |
GNU/Linux通过用户和用户组实现访问控制 —— 包括对文件访问、设备使用的控制。Linux默认的访问控制机制相对简单直接。有一些更加高级的机制,包括:ACL和LDAP Authentication。
Contents |
概览
用户一般指使用计算机的人。本文语境中,该词指用来识别用户的用户名称,既可以是Mary或Bill这样的真名,也可以是Dragonlady、Pirate这样的昵称。重要的是,计算机中每个账户都拥有一个名称,而使用者通过这些名称访问计算机。除了人之外,一些系统服务也使用不同的用户账户运行。
处于安全原因,我们通过一些途径对用户进行限制。
一个人可能拥有多个账户,只要这些账户名称不同。但有一些用户名称是系统保留的,比如“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 /media/ -l
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 / -user [用户]
文件的属主、属组可以通过chown命令更改。文件的权限可以通过chmod命令修改。
详情参见:man chown、man chmod、Linux file permissions。
用户管理
使用who命令,可以查看目前已登陆的用户。
使用useradd命令添加用户:
# useradd -m -g [初始组] -G [附加组] -s [登陆shell] [用户]
-
-m:创建用户主目录/home/[用户名];在自己的主目录内,即使不是root用户也可以读写文件、安装程序等等。 -
-g:设置用户初始组的名称或数字ID;该组必须是存在的;如果没有设置该选项,useradd会根据/etc/login.defs文件中的USERGROUPS_ENAB环境变量进行设置。 -
-G:用户要加入的附加组列表;使用逗号分隔多个组,不要添加空格;如果不设置,用户仅仅加入初始组。 -
-s:用户默认登录shell的路径;Arch Linux的init脚本使用bash;启动过程结束后,默认启动的登录shell在此处设定;请确保使用的shell已经安装。
以典型的桌面系统为例,要添加一个名为archie的用户,并使用bash作为登录shell:
# useradd -m -g users -s /bin/bash archie
有关useradd的高级用法,参见man页:
$ man useradd
通过下列命令设置GECOS字段(用户信息,例如用户全名):
# chfn [用户名]
(这样将会以交互式模式启动chfn)
通过下列命令设置用户密码:
# passwd [用户名]
另一个交互式界面的添加用户的工具:
# adduser
adduser会询问一些常见的设置,并使用合适的默认值,调用useradd创建用户。该命令还会设置用户信息和密码,囊括了chfn和passwd两个命令的功能。
使用userdel命令删除用户:
# userdel -r [用户名]
-r选项表示一并删除用户主目录和邮件。
用户信息存储
本地用户信息储存在/etc/passwd文件中。要查看系统上所有用户账户:
$ cat /etc/passwd
一行代表一个用户,格式如下:
account:password:UID:GID:GECOS:directory:shell
此处:
account:用户名password:用户密码UID:用户的数字IDGID:用户所在主组的数字IDGECOS:可选的注释字段,通常记录用户全名directory:用户的主目录($HOME)shell:用户的登陆shell(默认为/bin/sh)
用户组管理
/etc/group文件储存了系统中用户组的信息,详情参见:man group。
使用groups命令查看用户所在组的名称:
$ groups [用户名]
若省略用户名,默认显示当前用户所在组。
id命令提供额外的信息,包括用户UID以及相关用户组GID:
$ id [用户名]
查看所有组:
$ cat /etc/group
使用groupadd创建新的组:
# groupadd [组名]
使用gpasswd将用户添加到组:
# gpasswd -a [用户名] [组名]
删除用户组:
# groupdel [组名]
将用户从组中移除:
# gpasswd -d [用户名] [组名]
如果用户已登录,必须重新登录使更改生效。
文件列表
| 文件 | 作用 |
|---|---|
/etc/shadow |
保存用户安全信息 |
/etc/passwd |
用户账户信息 |
/etc/gshadow |
保存组账号的安全信息 |
/etc/group |
定义用户所属的组 |
/etc/sudoers |
可以运行 sudo 的用户 |
/home/* |
主目录 |
群组列表
用户组
工作站、桌面用户会把日常使用的非root用户添加到下列附加组,以方便访问外部设备、硬件以及系统管理:
| 组 | 影响文件 | 作用 |
|---|---|---|
| audio | /dev/audio, /dev/snd/*, /dev/rtc0 |
直接访问声音硬件(ALSA 和 OSS),本地会话不属于此组也能访问声音。 |
| camera | 访问 Digital Cameras. | |
| disk | /dev/sda[1-9], /dev/sdb[1-9] |
访问不受 optical, floppy 和 storage 组控制的块设备. |
| floppy | /dev/fd[0-9] |
访问软盘驱动器。 |
| games | /var/games |
访问一些游戏。 |
| locate | /usr/bin/locate, /var/lib/locate, /var/lib/mlocate, /var/lib/slocate |
使用 updatedb 命令。 |
| lp | /etc/cups, /var/log/cups, /var/cache/cups, /var/spool/cups |
访问打印设备,管理打印任务。 |
| network | 改变网络设置的权限,比如使用 Networkmanager 的权限. | |
| networkmanager | 通过 Networkmanager 连接无线网的权限。这个组在默认的Arch设置里没有,需要手动添加。 | |
| optical | /dev/sr[0-9], /dev/sg[0-9] |
访问光学设备,比如CD,DVD。 |
| power | 使用 Pm-utils (挂起、休眠...) 和电源管理控制。 | |
| scanner | /var/lock/sane |
访问扫描仪硬件。 |
| storage | 访问可移动储存器,例如 USB 硬盘、flash 存储器、MP3 播放器等;用户可以通过 D-Bus 挂载设备。 | |
| sys | 管理 CUPS 中的打印机. | |
| users | 标准用户组. | |
| uucp | /dev/ttyS[0-9], /dev/tts/[0-9] |
串口和 USB 设备,例如猫、手柄 RS-232/串口。 |
| video | /dev/fb/0, /dev/misc/agpgart |
访问视频捕获和硬件加速设备。framebuffer (X 不属于这个组也能使用),本地会话不属于此组也能访问视频设备。 |
| wheel | 管理组,通常用于 sudo 和 su 命令权限。systemd 会允许非 root 的 wheel 组用户启动服务。[1] |
系统组
下列组系统使用,一般不被 Arch 用户使用:
| 组 | 影响文件 | 作用 |
|---|---|---|
| avahi | ||
| bin | /usr/bin/* |
以只读权限访问 /usr/bin/ 中的二进制文件.
|
| clamav | /var/lib/clamav/*, /var/log/clamav/* |
Clam AntiVirus 使用. |
| daemon | ||
| dbus | /var/run/dbus/* |
|
| ftp | /srv/ftp |
FTP 服务器,例如 Proftpd |
| gdm | X 认证目录 (ServAuthDir) | GDM 组. |
| hal | /var/run/hald, /var/cache/hald |
|
| http | ||
| kmem | /dev/port, /dev/mem, /dev/kmem |
|
| log | /var/log/* |
访问 /var/log 中的日志.
|
/usr/bin/mail |
||
| mem | ||
| mpd | /var/lib/mpd/*, /var/log/mpd/*, /var/run/mpd/*, 可选的音乐目录 |
MPD 组. |
| nobody | 无权限的组。 | |
| ntp | /var/lib/ntp/* |
NTPd 组. |
| policykit | PolicyKit 组. | |
| root | /* |
完全的系统管理和控制 (root, admin) |
| smmsp | sendmail 组. | |
| systemd-journal | /var/log/journal/* |
访问完整系统日志,不在此组中的用户仅能访问自己生成的信息。 |
| tty | /dev/tty, /dev/vcc, /dev/vc, /dev/ptmx |
访问 /dev/ACMx
|
| vboxsf | 虚拟系统的共享目录 | VirtualBox使用. |
程序专用组
如下组中的成员可以执行特定程序:
| 组 | 影响文件 | 作用 |
|---|---|---|
| adbusers | /dev/中的设备节点 |
访问 Android 调试桥。 |
| cdemu | /dev/vhba_ctl |
使用 cdemu 模拟驱动. |
| kvm | 用户空间软件可以访问 /dev/kvm 接口 |
使用 KVM 的硬件虚拟化。 |
| thinkpad | /dev/misc/nvram |
ThinkPad 用户访问 tpb 等工具。 |
| vboxusers | /dev/vboxdrv |
使用Virtualbox软件 |
| vmware | 使用 VMware 软件。 |
过时的组
如下组目前已经没有任何作用:
| 组 | 作用 |
|---|---|
| rfkill | 不再使用! 控制无线设备的电源 (可能被 rfkill 使用). |
| stb-admin | 不再使用! 曾经用来控制 system-tools-backends 的访问。 |