Linux用户和组的管理(新手必看)
在 Linux 中,我们经常从目的或预期使用的角度区分两种类型的用户账户:
系统用户和普通用户之间的区别与其说是技术上的,不如说是组织结构上的。为了理解这一点,我们首先必须介绍用户 ID(UID)的概念,这是一个由 Linux 管理的 32 位数值。
Linux 通过 UID 标识用户,用户属于一个组或多个组,通过组 ID(GID)标识。有一种 UID 为 0 的特殊用户,通常称为 root。这个“超级用户”可以做任何事情,也就是说,不受任何限制。通常,你希望避免以 root 用户身份工作,因为它的权限太大了。如果不小心,很容易就会破坏一个系统。
不同的 Linux 发行版有自己的方法来决定如何管理 UID 范围。例如,systemd 驱动的发行版有以下约定(这里简化):
要找出你自己的 UID,你可以像这样使用 id 命令:
对于本地用户管理,Linux 使用了一个简单的基于文件的界面,其命名方案有些混乱,但这是一个历史遗留问题,我们不得不接受。
下表列出了四个文件,它们共同实现了用户管理:
可以将 /etc/passwd 看作一种小型用户数据库,用于跟踪普通用户的用户名、UID、组成员关系和其他数据,例如使用的主目录和登录 shell。
让我们来看一个具体的例子:
让我们仔细看看 /etc/passwd 中的一行,以详细了解一个用户条目的结构:
我们注意到,在 /etc/passwd 中缺少的东西正是我们根据名称期望在那里找到的东西,也就是密码。出于历史原因,密码存储在一个名为 /etc/shadow 的文件中。虽然每个用户都可以读取 /etc/passwd,但通常需要 root 权限才能读取 /etc/shadow。
要添加一个用户,可以使用 adduser 命令,如下所示:
如果你想创建一个系统账户,则请传入 -r 选项。这将禁用使用登录 shell 的能力,并避免创建主目录。详细配置请参见 /etc/adduser.conf,包括 UID/GID 范围等选项。
除了用户之外,Linux 还有组的概念,从某种意义上说,组就是一个或多个用户的集合。任何普通用户都属于一个默认组,但可以是其他组的成员。
你可以通过 /etc/group 文件找到组和映射:
有了这些基本的用户概念和管理,我们将转向一种在专业设置中管理用户的可能更好的方法,并考虑到规模。
根据你的需求和(时间)预算,有几种方法可供你选择:
- 所谓的系统用户(或系统账户):通常程序(有时称为守护进程)使用这些类型的账户来运行后台进程。这些程序提供的服务可以是操作系统的一部分,例如网络(例如 sshd),也可以是应用程序层(例如 mysql,在流行的关系数据库的情况下);
- 普通用户:例如,通过 shell 交互使用 Linux 的人类用户。
系统用户和普通用户之间的区别与其说是技术上的,不如说是组织结构上的。为了理解这一点,我们首先必须介绍用户 ID(UID)的概念,这是一个由 Linux 管理的 32 位数值。
Linux 通过 UID 标识用户,用户属于一个组或多个组,通过组 ID(GID)标识。有一种 UID 为 0 的特殊用户,通常称为 root。这个“超级用户”可以做任何事情,也就是说,不受任何限制。通常,你希望避免以 root 用户身份工作,因为它的权限太大了。如果不小心,很容易就会破坏一个系统。
不同的 Linux 发行版有自己的方法来决定如何管理 UID 范围。例如,systemd 驱动的发行版有以下约定(这里简化):
- UID 0:是 root;
- UID 1~999:为系统用户保留;
- UID 65534:例如,用户 nobody 用于将远程用户映射到一些众所周知的 ID;
- UID 1000~65533、65536~4294967294:是普通用户。
要找出你自己的 UID,你可以像这样使用 id 命令:
$ id -u了解了 Linux 用户的基本知识之后,让我们看看如何管理用户。
Linux管理本地用户
第一个选项,也是传统上唯一可用的选项,是管理本地用户。也就是说,只使用计算机本地的信息,与用户相关的信息不会在计算机网络中共享。对于本地用户管理,Linux 使用了一个简单的基于文件的界面,其命名方案有些混乱,但这是一个历史遗留问题,我们不得不接受。
下表列出了四个文件,它们共同实现了用户管理:
目的 | 文件 |
---|---|
用户数据库 | /etc/passwd |
组数据库 | /etc/group |
用户密码文件 | /etc/shadow |
组密码文件 | /etc/gshadow |
可以将 /etc/passwd 看作一种小型用户数据库,用于跟踪普通用户的用户名、UID、组成员关系和其他数据,例如使用的主目录和登录 shell。
让我们来看一个具体的例子:
$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash ① daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin ② bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin syslog:x:104:110::/home/syslog:/usr/sbin/nologin mh9:x:1000:1001::/home/mh9:/usr/bin/fish ③
- ❶ 根用户的 UID 为 0;
- ❷ 一个系统账户;
- ❸ 我的用户账户。
让我们仔细看看 /etc/passwd 中的一行,以详细了解一个用户条目的结构:

- ❶ 要使用的登录 shell。为了防止交互式登录,请使用 /sbin/nologin。
- ❷ 用户的主目录,默认为 /。
- ❸ 用户信息,如全名或关联数据,如电话号码。通常也称为 GECOS 字段。注意,此处不使用 GECOS 格式,而是通常使用字段本身来表示与账户关联的人员的全名。
- ❹ 用户的主组(GID),参见 /etc/group。
- ❺ UID。注意,Linux 为系统使用保留了低于 1000 的 UID。
- ❻ 用户的密码,x 字符表示(加密的)密码存储在 /etc/shadow 中,这是目前的默认设置。
- ❼ 用户名,长度不超过 32 个字符。
我们注意到,在 /etc/passwd 中缺少的东西正是我们根据名称期望在那里找到的东西,也就是密码。出于历史原因,密码存储在一个名为 /etc/shadow 的文件中。虽然每个用户都可以读取 /etc/passwd,但通常需要 root 权限才能读取 /etc/shadow。
要添加一个用户,可以使用 adduser 命令,如下所示:
$ sudo adduser mh9 Adding user 'mh9' ... Adding new group 'mh9' (1001) ... Adding new user 'mh9' (1000) with group 'mh9' ... Creating home directory '/home/mh9' ... ① Copying files from '/etc/skel' ... ② New password: ③ Retype new password: passwd: password updated successfully Changing the user information for mh9 Enter the new value, or press ENTER for the default ④ Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Y
- ❶ adduser 命令用来创建一个主目录;
- ❷ 它还将一堆默认配置文件复制到主目录中;
- ❸ 需要定义密码;
- ❹ 提供可选的 GECOS 信息。
如果你想创建一个系统账户,则请传入 -r 选项。这将禁用使用登录 shell 的能力,并避免创建主目录。详细配置请参见 /etc/adduser.conf,包括 UID/GID 范围等选项。
除了用户之外,Linux 还有组的概念,从某种意义上说,组就是一个或多个用户的集合。任何普通用户都属于一个默认组,但可以是其他组的成员。
你可以通过 /etc/group 文件找到组和映射:
$ cat /etc/group ① root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog ... ssh:x:114: landscape:x:115: admin:x:116: netdev:x:117: lxd:x:118: systemd-coredump:x:999: mh9:x:1001: ②
- ❶ 显示组映射文件的内容;
- ❷ GID 为 1001 的用户的一个示例组。请注意,你可以在最后一个冒号之后添加一个以逗号分隔的用户名列表,以允许多个用户拥有该组权限。
有了这些基本的用户概念和管理,我们将转向一种在专业设置中管理用户的可能更好的方法,并考虑到规模。
Linux用户集中管理
如果你有多台机器或服务器需要管理用户(例如,在专业设置中),那么本地管理用户很快就过时了。你需要一种集中的方式来管理可以在本地应用到一台特定机器上的用户。根据你的需求和(时间)预算,有几种方法可供你选择:
- 基于目录:轻量目录访问协议(LDAP)是一套已有几十年历史的协议,现在由 IETF 正式定义,它定义了如何通过 Internet 协议(IP)访问和维护分布式目录。你可以自己运行 LDAP 服务器。例如,使用 Keycloak 或者外包给云提供商(比如Azure Active Directory)。
- 通过网络:用户可以使用 Kerberos 以这种方式进行身份验证。
- 使用配置管理系统:这些系统包括 Ansible、Chef、Puppet 或 SaltStack,可以用于跨机器一致地创建用户。
实际的实现通常由环境决定。也就是说,公司可能已经在使用 LDAP,因此选择可能是有限的。