Skip to content

配置文件

字数: 6291 字 时长: 23 分钟

在 Linux 系统中,用户和用户组的管理依托于一套层次化的配置文件体系。这些文件不仅承载着用户身份标识与权限分配的核心数据,更是构建系统安全策略的基础框架。通过这些全局配置文件,系统能够精确地定义用户的登录信息、权限范围、所属用户组等关键内容,从而实现对用户行为的有效管理和对系统资源的安全控制。

/etc/passwd

/etc/passwd 文件存储了用户的基本信息,包括用户名、用户 ID(UID)、默认用户组 ID(GID)、用户描述、家目录路径以及默认 Shell 等。这些信息是用户登录和系统识别用户身份的基础。

shell
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/usr/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
sssd:x:998:996:User for sssd:/:/sbin/nologin
chrony:x:997:995:chrony system user:/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
……

可以看到 Linux 系统中的每个用户都在 /etc/passwd 文件中有一个对应的记录行,它记录了这个用户的一些基本属性。这个文件对所有用户都是可读的,/etc/passwd 中一行记录对应着一个用户,每行记录又被冒号 : 分隔为 7 个字段:

shell
用户名:密码占位符:UID:GID: 用户信息描述:用户主目录:用户登录 Shell
  • 用户名:是用户在系统中进行登录和身份识别的标识,由字母、数字、下划线(_)等组成,具有唯一性,区分大小写。用户在登录系统、执行命令或进行其他操作时,需要使用用户名来表明身份。系统通过用户名查找对应的用户记录,以确定用户的权限和属性等信息。
  • 密码占位符:早期该字段用于存储用户的加密密码,但为了增强安全性,现代 Linux 系统将密码存储在 /etc/shadow 文件中,而此字段通常显示为 x* 等特殊字符,表示密码已被影子化处理。在系统验证用户身份时,系统会根据用户名在 /etc/shadow 文件中查找对应的加密密码,并与用户输入的密码进行比对,以确定用户是否有权登录。
  • UID:UID 是系统用于唯一标识每个用户的数字编号,范围通常为 0-65535。不同范围的 UID 有不同的用途和含义。系统在进行文件访问控制、进程管理等操作时,实际上是通过 UID 来识别用户身份,而不是用户名。文件和目录的权限设置也是基于 UID 来确定用户对它们的访问权限。UID 为 0 的用户是超级用户 root,拥有系统的最高权限,可以对系统进行任何操作。普通用户的 UID 一般从 1000 开始,如用户 user1 的 UID 可能是 1001user2 的 UID 可能是 1002 等。
  • GID:GID 用于标识用户所属的主要用户组。每个用户都至少属于一个组,这个组就是其主要组,用户还可以同时属于其他多个附加组。在文件系统中,文件和目录的权限设置除了与用户的 UID 相关外,还与用户所属的组相关。当用户访问文件或目录时,系统会根据文件的组权限以及用户所属的组来确定用户是否具有相应的访问权限。
  • 用户信息描述:也称为 GECOS 字段,是对用户的一些描述性信息,内容没有严格的格式要求,通常包含用户的真实姓名、办公地点、联系电话等信息。主要用于系统管理员和其他用户快速了解用户的相关信息,方便在需要时与用户进行沟通或查找用户相关资料。
  • 用户主目录:用户主目录是用户在登录系统后默认的工作目录,用户对其主目录通常具有完整的权限,如读取、写入和执行权限。用户在系统中创建的文件、保存的配置文件等通常都存储在其主目录下。不同用户的主目录相互独立,保证了用户数据的隔离和安全。
  • 用户登录 Shell:登录 Shell 是用户登录系统后使用的命令解释器,负责接收用户输入的命令并将其传递给系统内核执行,同时将系统的输出结果返回给用户。不同的 Shell 具有不同的功能和特性,用户可以根据自己的需求和习惯选择合适的 Shell。系统管理员也可以根据用户的角色和需求,为用户设置特定的 Shell。/bin/bash 是大多数 Linux 系统的默认 Shell,功能强大,支持各种命令和脚本编写。/sbin/nologin/bin/false 表示该用户不能用于登录系统,通常用于系统服务或其他特定目的,如 sshd 用户。

默认用户

在 Linux 系统中,即使是一个全新的安装,也会存在许多默认用户。这些用户并不是用于日常登录的普通用户,而是系统用户(system users),它们的存在是为了满足系统服务、守护进程(daemons)和特定功能的需要。这些用户通常具有特定的权限和限制,以确保系统的安全性和稳定性。

/etc/shadow

/etc/shadow 文件是 Linux 系统中用于存储用户密码和密码相关策略的核心文件。为了增强系统的安全性,现代 Linux 系统将用户密码从 /etc/passwd 文件中分离出来,并存储在 /etc/shadow 文件中。这个文件只有 root 用户和特定的系统进程可以访问,从而保护了密码信息的安全性。

shell
root:$6$9dGlhMoEUng5lWby$RFSTfWO5GH/Cen49s9.5I7sXkGC5jA0R76e9VDHX.1psMU/biK0olqti/np3vvwkEGq9e0Zu7qQmsnzMoo3p30::0:99999:7:::
bin:*:19820:0:99999:7:::
daemon:*:19820:0:99999:7:::
adm:*:19820:0:99999:7:::
lp:*:19820:0:99999:7:::
sync:*:19820:0:99999:7:::
shutdown:*:19820:0:99999:7:::
halt:*:19820:0:99999:7:::
mail:*:19820:0:99999:7:::
operator:*:19820:0:99999:7:::
games:*:19820:0:99999:7:::
ftp:*:19820:0:99999:7:::
nobody:*:19820:0:99999:7:::
tss:!!:20045::::::
systemd-coredump:!!:20045::::::
dbus:!!:20045::::::
sssd:!!:20045::::::
chrony:!!:20045::::::
sshd:!!:20045::::::

/etc/shadow 中的记录行与/etc/passwd 中的一一对应,它由 pwconv 命令根据 /etc/passwd 中的数据自动产生,它的文件格式与 /etc/passwd 类似,共有 9 个字段组成:

shell
用户名:加密密码:最后一次修改密码的时间:密码最小使用期限:密码最大使用期限:密码过期警告天数:密码不活动天数:账号过期时间:保留字段
  • 用户名:这是系统中用于唯一标识用户的名称,与 /etc/passwd 文件中的用户名一一对应。它由字母、数字、下划线等字符组成,且区分大小写。系统在进行用户认证和权限管理时,通过该用户名来查找对应的密码及其他相关信息。例如,当用户尝试登录系统时,输入的用户名会与 /etc/shadow 中的记录进行匹配,以找到对应的加密密码进行验证。
  • 加密密码:该字段存储的是经过加密算法处理后的用户密码。现代 Linux 系统大多采用安全的加密算法,如 SHA-512 等,以提高密码的安全性。加密后的密码是一串由多种字符组成的长字符串。在用户登录时,系统会将用户输入的明文密码使用相同的加密算法进行处理,然后将处理后的结果与 /etc/shadow 中存储的加密密码进行比对。如果两者一致,则验证通过,允许用户登录;否则,拒绝登录。如果该字段显示为 *!,表示该用户账号被锁定,无法使用密码进行登录。
  • 最后一次修改密码的时间:该字段记录的是从 1970 年 1 月 1 日 00:00:00 UTC(即 Unix 时间戳的起始时间)到用户最后一次修改密码的时间所经过的天数,以整数形式表示。这个时间用于计算密码的使用期限和判断密码是否需要更新。系统会根据这个时间以及密码的最大使用期限等设置,来确定用户的密码是否已经过期。
  • 密码最小使用期限:指的是用户在更改密码后,必须经过多少天才能再次更改密码,以天数为单位,用整数表示。设置该期限可以防止用户频繁更改密码,避免用户随意设置简单密码或者在短时间内多次尝试密码组合,从而增强密码的安全性。例如,如果设置为 7,则用户在更改密码后的 7 天内不能再次更改密码。
  • 密码最大使用期限:规定了用户密码的有效期限,即从用户最后一次修改密码开始,到密码过期的天数,以整数形式存储。为了增强系统的安全性,强制用户定期更换密码。当密码达到最大使用期限后,用户登录系统时会被提示更改密码,否则可能无法正常使用系统的某些功能或无法登录。例如,设置为 90,表示用户的密码在 90 天后就会过期。
  • 密码过期警告天数:在密码即将过期前,系统会提前多少天向用户发出密码过期的警告信息,以天数为单位,用整数表示。提醒用户及时更改密码,避免因密码过期而影响正常使用系统。例如,设置为 7,那么在密码还有 7 天过期时,用户登录系统就会收到密码即将过期的提示。
  • 密码不活动天数:如果用户在密码过期后,经过指定的天数仍未更改密码,那么该用户账号将被锁定,这个指定的天数就是密码不活动天数,以整数形式记录。进一步增强系统的安全性,防止因用户长时间不更改过期密码而导致账号存在安全风险。例如,设置为 14,表示密码过期 14 天后,如果用户还没有更改密码,账号就会被锁定,用户无法再使用该账号登录系统。
  • 账号过期时间:从 1970 年 1 月 1 日 00:00:00 UTC 开始计算,到指定日期所经过的天数,以整数形式存储。当到达这个日期后,无论密码是否过期,该用户账号都将被禁用。用于设置一些临时账号的有效期限,例如为访客或临时员工创建的账号。当超过指定日期后,系统会自动禁用该账号,无需管理员手动操作。
  • 保留字段:该字段目前通常未被使用,是为系统未来的功能扩展预留的。一般显示为空字符串。随着系统的发展和功能的增加,未来可能会利用这个字段来存储一些新的用户相关信息或配置选项。目前,它不影响系统的正常运行和用户认证等功能。

pwconv

pwconv 是一个 Linux 系统管理命令,用于将用户密码从 /etc/passwd 文件迁移到更安全的 /etc/shadow 文件中,从而实现「投影密码」(shadow password)功能。这个过程称为「投影」(shadowing),目的是提高系统安全性,因为 /etc/shadow 文件的权限设置更为严格,只有超级用户(root)可以访问。

/etc/group

将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种重要手段。每个用户都至少属于一个用户组,称为主组(Primary Group),同时也可以属于多个附加组(Secondary Groups)。用户组的合理划分和管理能够有效简化权限分配,增强系统的安全性和可管理性。

shell
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:john
cdrom:x:11:
mail:x:12:
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:john
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
users:x:100:
nobody:x:65534:
utmp:x:22:
utempter:x:35:
ssh_keys:x:101:
tss:x:59:
input:x:999:
kvm:x:36:
render:x:998:
systemd-journal:x:190:
systemd-coredump:x:997:
dbus:x:81:
sssd:x:996:
chrony:x:995:
sshd:x:74:

用户组的所有信息都存放在 /etc/group 文件中。此文件的格式类似于 /etc/passwd 文件,由冒号(:)分隔 4 个字段,每个字段都有特定的含义:

shell
组名:密码:GID: 组成员列表
  • 组名:用户组的名称,是用户组在系统中的标识,由字母、数字、下划线等组成,且具有唯一性,区分大小写。方便系统管理员和用户识别和管理不同的用户组,在设置文件权限、执行特定任务等场景中,通过组名来指定对哪些用户集合进行操作。
  • 密码:该字段理论上存储的是用户组的密码,但在现代 Linux 系统中,通常不使用组密码,而是使用其他授权机制。如果该字段为 x,表示组密码被影子化,实际的密码存储在 /etc/gshadow 文件中;如果为空字符串,则表示该组没有设置密码。在某些特定场景下,可能会使用组密码来限制对组资源的访问。例如,当一个组拥有特定的共享资源,只有知道组密码的用户才能临时加入该组以访问这些资源。
  • GID:每个用户组都有一个唯一的数字标识符,称为组 ID。它是一个整数,在系统内部用于标识用户组,类似于用户名对应用 UID。系统在进行权限管理和文件访问控制时,会使用 GID 来判断用户所属的组,进而确定用户对文件和目录的访问权限。不同的系统对 GID 的分配范围有不同的规定,一般来说,0-499 通常为系统保留 GID,500 及以上为普通用户 GID。
  • 组成员列表:该字段列出了属于这个用户组的所有用户名,多个用户名之间用逗号分隔。如果一个用户同时属于多个组,那么在不同组的 /etc/group 记录中都会出现该用户名。明确了每个用户组所包含的成员,方便系统管理员查看和管理用户与组之间的关系。在设置文件和目录的权限时,可以针对组进行操作,从而影响组内所有成员的访问权限。

主组和附加组

主组也称为基本组或主要组,是用户在登录系统时所属的默认组。当用户创建文件或目录时,如果没有特别指定,文件或目录的所属组通常就是用户的主组。系统在进行权限检查时,会根据文件或目录的属组权限以及用户的主组身份来确定用户是否具有相应的访问权限。主组在一定程度上代表了用户的主要身份属性,用于系统对用户进行分类和管理,方便进行整体的权限规划和资源分配。

附加组是用户除主组之外所属的其他组,用户可以同时属于多个附加组。通过将用户添加到不同的附加组,可以让用户获得对更多资源的访问权限。例如,一个用户可能同时需要访问开发相关资源和测试相关资源,就可以将其加入到开发组和测试组这两个附加组中,从而方便地实现对不同资源的访问控制。

/etc/gshadow

/etc/gshadow 文件是 Linux 系统中用于存储用户组密码和组管理信息的配置文件。它类似于 /etc/shadow 文件,但专门用于用户组的管理。该文件的权限通常设置为只有 root 用户和特定用户组可以访问,以确保组密码和管理信息的安全。

shell
root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::john
cdrom:::
mail:::
man:::
dialout:::
floppy:::
games:::john
tape:::
video:::
ftp:::
lock:::
audio:::
users:::
nobody:::
utmp:!::
utempter:!::
ssh_keys:!::
tss:!::
input:!::
kvm:!::
render:!::
systemd-journal:!::
systemd-coredump:!::
dbus:!::
sssd:!::
chrony:!::
sshd:!::

/etc/gshadow 文件中的每一行对应一个用户组,字段由冒号(:)分隔,共有四个字段:

shell
组名:加密密码:组管理员:成员列表
  • 组名:用于标识用户组的名称,是用户组在系统中的唯一标识符,在系统管理和权限设置等操作中,通过组名来指定和操作相应的用户组。一方面方便系统管理员直观地识别和管理不同的用户组,比如在分配文件和目录权限时,可以直接指定某个组名来设置相应的权限;另一方面,用户在使用系统命令时,也可以通过组名来进行相关操作,如查看某个组的成员、切换到某个组等。
  • 加密密码:该字段存储的是经过加密算法处理后的用户组密码。它用于验证用户在使用 newgrp 命令切换到该用户组时输入的密码是否正确。在某些特定场景下,需要对用户组的访问进行更严格的控制,只有知道组密码的用户才能通过 newgrp 命令临时切换到该组,获取该组的权限来访问相关资源。
  • 组管理员:记录的是被指定为该用户组管理员的用户名。组管理员具有对该用户组进行特定管理操作的特殊权限。组管理员可以执行一些普通成员无法进行的操作,比如添加或删除组成员、修改组的某些属性等。这有助于将用户组的管理权限分散,让特定的用户负责管理相应的组,减轻系统管理员的负担,同时也提高了管理的灵活性和效率。
  • 成员列表:列出了属于该用户组的所有成员的用户名,它明确了哪些用户属于这个特定的用户组。系统通过这个字段来确定用户所属的组,进而根据组的权限设置来控制用户对系统资源的访问。当用户访问某个文件或目录时,系统会检查该用户所属的所有组,包括主组和附加组(记录在 /etc/group/etc/gshadow 中的成员列表),以确定用户是否具有相应的访问权限。

/etc/login.defs

/etc/login.defs 是 Linux 系统中用于定义用户账户和密码策略默认设置的重要配置文件。它在用户创建、管理以及登录过程中发挥关键作用,为系统管理员提供了集中管理用户账户行为和安全策略的工具。

需要留意的是,该文件内针对用户的默认配置并不适用于 root 用户。root 用户作为系统的超级管理员,其权限和相关属性有着独立且特殊的设定机制,不受 /etc/login.defs 中普通用户默认配置的约束 。

此外,当 /etc/login.defs 文件中的配置与 /etc/passwd/etc/shadow 文件里的用户信息出现冲突时,系统将优先采用 /etc/passwd/etc/shadow 文件中的信息。这是因为 /etc/login.defs 中的配置更多是为用户账户创建及一般性密码策略提供默认值,在具体用户信息存在冲突时,后两者文件具有更高的优先级,以确保用户账户信息的准确性和系统运行的稳定性 。

/etc/login.defs 文件中有非常多的注释和空行,可以使用 grep 命令进行过滤,只查看实际生效的配置项:

shell
grep -vE '^\s*$|^\s*#' `/etc/login.defs`

命令过滤掉注释和空行后的 /etc/login.defs 文件内容:

shell
MAIL_DIR        /var/spool/mail
UMASK           022
HOME_MODE       0700
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_WARN_AGE   7
UID_MIN                  1000
UID_MAX                 60000
SYS_UID_MIN               201
SYS_UID_MAX               999
SUB_UID_MIN                100000
SUB_UID_MAX             600100000
SUB_UID_COUNT               65536
GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999
SUB_GID_MIN                100000
SUB_GID_MAX             600100000
SUB_GID_COUNT               65536
ENCRYPT_METHOD SHA512
SHA_CRYPT_MAX_ROUNDS 100000
USERGROUPS_ENAB yes
CREATE_HOME     yes
HMAC_CRYPTO_ALGO SHA512

邮件和用户主目录相关:

配置项说明
MAIL_DIR/var/spool/mail指定用户邮件存储的目录路径。
UMASK022定义用户创建文件和目录时的默认权限掩码。022 表示文件默认权限为 644 (-rw-r--r--),目录默认权限为 755 (drwxr-xr-x)
HOME_MODE0700定义用户主目录的默认权限。0700 表示用户主目录的权限为 drwx------,即只有用户自己可以访问。

用户和组 ID 的范围:

配置项说明
UID_MIN1000普通用户的最小 UID 值。
UID_MAX60000普通用户的最大 UID 值。
SYS_UID_MIN201系统用户的最小 UID 值。
SYS_UID_MAX999系统用户的最大 UID 值。
SUB_UID_MIN100000子用户(sub-user)的最小 UID 值。
SUB_UID_MAX600100000子用户的最大 UID 值。
SUB_UID_COUNT65536为每个用户分配的子用户 UID 数量。

子用户

子用户是一种特殊的用户类型,通常用于特定场景(如容器化环境或多用户管理)中,以隔离用户权限并减少对系统全局环境的影响。子用户可以通过映射机制将一个用户的权限限制在特定的命名空间(namespace)中,从而实现更高的安全性和隔离性,通常用于容器、虚拟化或权限精细控制场景。

子用户的创建和管理与普通用户类似,但它们的 UID 和 GID 范围通常被分配在更高的区间,以避免与系统用户和普通用户冲突。这些子用户通常用于容器化环境或多用户场景中,以实现更好的隔离和权限管理。

用户组 ID 的范围:

配置项说明
GID_MIN1000普通用户组的最小 GID 值。
GID_MAX60000普通用户组的最大 GID 值。
SYS_GID_MIN201系统用户组的最小 GID 值。
SYS_GID_MAX999系统用户组的最大 GID 值。
SUB_GID_MIN100000子用户组的最小 GID 值。
SUB_GID_MAX600100000子用户组的最大 GID 值。
SUB_GID_COUNT65536为每个用户分配的子用户 GID 数量。

子用户组

子用户组(Sub-Group)的概念与子用户(Sub-User)类似,主要用于支持用户命名空间(User Namespace)和容器化环境。这些特性允许在隔离的环境中为每个用户分配独立的用户组 ID(GID)范围,从而实现更细粒度的权限管理和资源隔离。

在容器化环境中(如 Docker),一个用户可能需要在容器内部拥有多个用户组,但这些用户组的 GID 需要与宿主机上的用户组隔离。为此,Linux 系统引入了子用户组的概念,允许为每个用户分配一个独立的 GID 范围。

密码策略:

配置项说明
PASS_MAX_DAYS99999密码的最大有效期(天数)。99999 表示密码几乎永不过期。
PASS_MIN_DAYS0用户在更改密码后必须等待的天数。0 表示用户可以随时更改密码。
PASS_WARN_AGE7密码过期前的警告天数。7 表示在密码过期前 7 天开始提醒用户。
ENCRYPT_METHODSHA512指定密码加密方法。SHA512 是一种安全的加密算法。
SHA_CRYPT_MAX_ROUNDS100000SHA 加密算法的最大迭代次数,用于增加密码破解难度。

用户管理:

配置项说明
USERGROUPS_ENAByes是否允许删除用户时同时删除其初始用户组。yes 表示允许。
CREATE_HOMEyes是否在创建用户时自动创建用户主目录。yes 表示自动创建。
HMAC_CRYPTO_ALGOSHA512指定用于 HMAC 加密的算法。SHA512 是一种安全的哈希算法。