在 Red Hat Enterprise Linux 中管理用户和组

Red Hat Enterprise LinuxBeginner
立即练习

介绍

在这个实验中,你将获得在 Red Hat Enterprise Linux (RHEL) 环境中管理本地用户和组的基本技能。你将首先了解基本的用户和组概念,包括如何识别用户和组信息以及文件所有权。

随后,你将学习如何获得超级用户访问权限,创建和修改本地用户账户,管理本地组账户,以及配置用户密码策略。这种实践经验将使你掌握在你的 Linux 系统上有效控制访问和权限的知识。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 86%。获得了学习者 99% 的好评率。

理解用户和组的概念

在这一步中,你将学习 Red Hat Enterprise Linux (RHEL) 中的基本用户和组概念,以及如何使用各种命令来检查用户和组信息。理解这些概念对于管理 Linux 系统上的权限和访问控制至关重要。

Linux 系统上的每个文件和进程都与一个用户和一个组相关联。这种关联决定了谁可以读取、写入或执行文件,以及谁可以管理进程。

首先,让我们探索如何使用 id 命令识别当前用户和系统上的其他用户。

  • 使用 id 命令显示关于当前登录用户的信息。此命令显示用户 ID (UID)、主组 ID (GID) 以及用户所属的所有组。

    id

    你应该看到类似这样的输出,指示你的 labex 用户信息:

    uid=1000(labex) gid=1000(labex) groups=1000(labex),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  • 要查看关于另一个用户(例如 root 用户)的基本信息,请将用户名作为参数传递给 id 命令。

    id root

    输出将显示 root 用户的 UID (0)、GID (0) 和组:

    uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

接下来,你将学习如何使用 ls 命令识别文件和目录的所有者。

  • 使用 ls -l 命令查看文件的所有者。首先,在你的 ~/project 目录中创建一个虚拟文件。

    touch ~/project/mytextfile.txt
    ls -l ~/project/mytextfile.txt

    输出将显示 labex 既是 mytextfile.txt 的用户所有者,也是组所有者:

    -rw-r--r-- 1 labex labex 0 Feb  5 11:10 /home/labex/project/mytextfile.txt
  • 使用 ls -ld 命令查看目录的所有者,而不是该目录的内容。在以下输出中,第三列显示用户名,第四列显示组名。

    ls -ld ~/project

    你将看到 labex 是你的 ~/project 目录的所有者:

    drwxr-xr-x 2 labex labex 6 Feb  5 11:10 /home/labex/project

现在,让我们检查如何使用 ps 命令查看进程信息以及与每个进程关联的用户。

  • 使用 ps -au 命令查看进程。a 选项显示所有带有终端的进程,u 选项显示与进程关联的用户。在以下输出中,第一列显示用户名。

    ps -au

    你将看到各种进程,其中 labexroot 是常见的用户:

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0  10608  3808 ?        Ss   00:00   0:00 /sbin/init
    root        42  0.0  0.0  10608  3808 ?        Ss   00:00   0:00 /sbin/init
    labex      123  0.0  0.1 224152  5756 pts/0    Ss   00:00   0:00 -bash
    labex      150  0.0  0.0 225556  3652 pts/0    R+   00:00   0:00 ps -au

最后,你将探索 /etc/passwd/etc/group 文件,它们分别存储用户和组信息。这些文件对于理解如何在 Linux 系统上定义用户和组账户至关重要。

  • /etc/passwd 文件中的每一行都包含关于一个用户的信息。该文件分为七个以冒号分隔的字段。使用 cat 查看其内容。

    cat /etc/passwd

    找到 labexroot 的条目。对于 labex,它应该看起来像这样:

    labex:x:1000:1000:LabEx User:/home/labex:/bin/bash

    让我们分解每个字段:

    • labex: 此用户的用户名。
    • x: 用户的加密密码历史上存储在这里;现在这是一个占位符,因为密码存储在 /etc/shadow 中以确保安全。
    • 1000: 此用户账户的 UID 号码。
    • 1000: 此用户账户主组的 GID 号码。
    • LabEx User: 关于此用户的简短注释、描述或真实姓名。
    • /home/labex: 用户的家目录,以及登录 shell 启动时的初始工作目录。
    • /bin/bash: 此用户在登录时运行的默认 shell 程序。
  • /etc/group 文件中的每一行都包含关于一个组的信息。每个组条目分为四个以冒号分隔的字段。使用 cat 查看其内容。

    cat /etc/group

    你将看到各种系统组和用户私有组的条目。例如,labex 组条目可能如下所示:

    labex:x:1000:

    让我们分解每个字段:

    • labex: 此组的名称。
    • x: 废弃的组密码字段;现在这是一个占位符。
    • 1000: 此组的 GID 号码。
    • (空): 作为辅助组成员的此组的成员列表。如果此字段为空,则表示没有其他用户被明确列为该组的辅助成员(尽管主用户 labex 隐式地是成员)。

    主组和辅助组:
    每个用户都有一个主组。对于本地用户,此组由 GID 在 /etc/passwd 文件中列出。主组拥有用户创建的文件。创建普通用户时,通常会创建一个与用户同名的组,作为用户的主组。用户通常是此用户私有组的唯一成员。这种设计简化了文件权限管理。

    用户也可能拥有辅助组。辅助组的成员资格存储在 /etc/group 文件中。用户可以访问文件,这取决于他们的任何组是否具有访问权限,而不管这些组是主组还是辅助组。例如,如果 labex 用户有一个 labex 主组和 wheel 作为辅助组,那么该用户可以读取任何这两个组可以读取的文件。

    id 命令可以显示用户的所有组成员资格。回想一下 labexid 输出:

    uid=1000(labex) gid=1000(labex) groups=1000(labex),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

    这里,gid=1000(labex) 表示 labex 是主组。groups=1000(labex),10(wheel) 列出了所有组成员资格,显示 labex 作为主组,wheel 作为辅助组。

获取超级用户访问权限

在这一步中,你将学习如何在 RHEL 系统上获得超级用户访问权限(root 权限)。超级用户访问权限对于执行管理任务至关重要,例如安装软件、管理用户和配置系统设置。你将探索 susudo 命令,它们是特权提升的主要工具。

su (substitute user,替换用户) 命令允许你切换到另一个用户账户。当不带用户名使用时,它默认为 root 用户。

  • 使用 su - 命令切换到 root 用户。连字符 (-) 选项确保你获得一个登录 shell,这意味着将加载 root 用户的环境变量和路径。系统将提示你输入 root 密码,密码是 redhat

    su -

    输入密码 redhat 后,你的提示符将变为 [root@host ~]#,表明你现在是 root 用户。

    Password:
    [root@host ~]#

    要验证你是否是 root,你可以运行 whoami 命令:

    whoami

    输出应该是:

    root

    要退出 root shell 并返回到你的 labex 用户,请键入 exit

    exit

    你的提示符将返回到 [labex@host ~]$

sudo (superuser do,超级用户执行) 命令允许被授权的用户以超级用户或其他用户的身份执行命令,这由 sudoers 文件指定。labex 用户被配置为拥有 sudo 权限,而无需密码,这在许多云和实验环境中很常见。

  • 使用 sudo -i 命令切换到 root 账户。通常建议使用此命令而不是 su -,因为它提供了一种更安全的方式来使用提升的权限运行命令。当你使用 sudo -i 时,你仍然使用你自己的用户账户,但具有 root 权限,并且命令被记录到你的账户,这使得更容易跟踪所做的事情。

    sudo -i

    你的提示符将变为 [root@host ~]#,表明你现在是 root 用户。

    [root@host ~]#

    同样,你可以使用 whoami 进行验证:

    whoami

    输出应该是:

    root

    要退出 root shell 并返回到你的 labex 用户,请键入 exit

    exit

    你的提示符将返回到 [labex@host ~]$

  • 你也可以使用 sudo 以 root 权限运行单个命令,而无需切换到 root shell。例如,要查看 /etc/shadow 的内容(仅可由 root 读取),你可以使用 sudo cat /etc/shadow

    sudo cat /etc/shadow | head -n 3

    这将显示 /etc/shadow 文件的头三行,表明 cat 命令是以 root 权限执行的。

    root:*:19780:0:99999:7:::
    bin:*:19780:0:99999:7:::
    daemon:*:19780:0:99999:7:::

    /etc/sudoers 文件是 sudo 命令的主要配置文件。它定义了哪些用户或组可以使用提升的权限运行哪些命令。为了避免多个管理员同时尝试编辑文件时出现问题,你应该仅使用特殊的 visudo 命令进行编辑。visudo 编辑器还会验证文件,以确保没有语法错误。

    /etc/sudoers 中的一个常见条目允许 wheel 组的成员以 root 身份运行任何命令。labex 用户是 wheel 组的成员,这就是 sudo 在没有密码的情况下工作的原因。

    sudo grep wheel /etc/sudoers

    你应该看到类似这样的行,它授予 wheelsudo 访问权限:

    %wheel        ALL=(ALL:ALL)       ALL

    此行表示:

    • %wheel: 该规则适用于 wheel 组的成员。% 符号表示一个组。
    • ALL=(ALL:ALL): 在任何主机上(第一个 ALL),wheel 组中的用户可以作为任何用户(第二个 ALL)和任何组(第三个 ALL)运行命令。
    • ALL: wheel 组中的用户可以运行任何命令。

这结束了你对获得超级用户访问权限的探索。你现在了解了 su -sudo -i 之间的区别,以及如何使用提升的权限执行命令。

创建和修改本地用户账户

在这一步中,你将学习如何在 RHEL 系统上创建、修改和删除本地用户账户。管理用户账户是一项基本的管理任务,确保每个用户都具有适当的访问权限。你将使用 useraddusermoduserdelpasswd 等命令。

首先,让我们创建一个新的用户账户。

  • 使用 useradd 命令创建一个新用户。默认情况下,useradd 创建一个 UID 大于或等于 1000 的新用户,创建一个家目录 (/home/username),并将默认 shell 设置为 /bin/bash。你需要 sudo 权限才能运行此命令。让我们创建一个名为 testuser01 的用户。

    sudo useradd testuser01

    创建用户后,你可以在 /etc/passwd 中验证其是否存在,并检查其家目录。

    grep testuser01 /etc/passwd
    ls -ld /home/testuser01

    你应该看到类似这样的输出:

    testuser01:x:1001:1001::/home/testuser01:/bin/bash
    drwx------. 2 testuser01 testuser01 6 Mar  4 15:22 /home/testuser01
  • 默认情况下,新创建的用户没有设置密码,这意味着他们无法登录。你需要使用 passwd 命令为 testuser01 设置密码。

    sudo passwd testuser01

    系统将提示你输入新密码。对于这个实验,使用 labexrhel9 作为 testuser01 的密码。你可能会看到一个“BAD PASSWORD”警告,但你可以继续。

    New password:
    Retype new password:
    passwd: all authentication tokens updated successfully.

    现在,尝试使用 su - 切换到 testuser01

    su - testuser01

    当提示时,输入密码 labexrhel9。你的提示符应该变为 [testuser01@host ~]$

    Password:
    [testuser01@host ~]$

    要返回到你的 labex 用户,请键入 exit

    exit

接下来,让我们使用 usermod 命令修改现有的用户账户。usermod 命令允许你更改用户的各种属性,例如他们的家目录、shell 或组成员资格。

  • 让我们将 testuser01 的注释字段(全名)更改为“Test User One”。

    sudo usermod -c "Test User One" testuser01

    再次检查 /etc/passwd 文件来验证更改。

    grep testuser01 /etc/passwd

    输出现在应该反映更新后的注释:

    testuser01:x:1001:1001:Test User One:/home/testuser01:/bin/bash
  • 你还可以锁定或解锁用户账户。锁定账户会阻止用户登录,而解锁账户会重新启用登录。

    要锁定 testuser01 账户:

    sudo usermod -L testuser01

    现在,再次尝试切换到 testuser01

    su - testuser01

    你将被提示输入密码,但即使使用正确的密码,登录也会失败:

    Password:
    su: Authentication failure

    要解锁 testuser01 账户:

    sudo usermod -U testuser01

    再次尝试切换到 testuser01,它应该会成功。记住 exit 返回到 labex

    su - testuser01
    ## Enter password 'labexrhel9'
    exit

最后,让我们删除你创建的用户账户。

  • 使用 userdel 命令删除用户。默认情况下,userdel/etc/passwd 中删除用户的条目,但保留他们的家目录不变。这可能导致孤立文件。

    sudo userdel testuser01

    验证用户已从 /etc/passwd 中删除,但家目录仍然存在。

    grep testuser01 /etc/passwd
    ls -ld /home/testuser01

    grep 命令应该不返回任何输出,表明用户已删除。ls -ld 命令将显示家目录仍然存在,但其所有权将显示为数字 UID/GID,因为用户已不再存在。

    drwx------ 2 1001 1001 83 Mar  4 15:22 /home/testuser01

    注意:在某些 RHEL 版本或配置中,如果家目录为空或用户是唯一的所有者,userdel 可能会默认删除家目录。但是,显式使用 -r 选项以确保删除家目录更安全。

  • 要删除用户及其家目录,请将 -r 选项与 userdel 一起使用。让我们创建一个新用户 testuser02 来正确演示这一点。

    sudo useradd testuser02
    sudo passwd testuser02 ## 你将被提示输入 'labexrhel9'

    现在,删除 testuser02 及其家目录:

    sudo userdel -r testuser02

    验证用户条目和家目录都已被删除。

    grep testuser02 /etc/passwd
    ls -ld /home/testuser02

    这两个命令都应该表明 testuser02 及其家目录已不再存在。

    ls: cannot access '/home/testuser02': No such file or directory

这结束了你对创建、修改和删除本地用户账户的实践。

管理本地组账户

在这一步中,你将学习如何在 RHEL 系统上管理本地组账户。组对于有效管理权限至关重要,允许你同时向多个用户授予访问权限。你将使用 groupaddgroupmodgroupdel 等命令,并重新访问 usermod 来管理用户 - 组的成员资格。

首先,让我们创建一个新组。

  • 使用 groupadd 命令创建一个新组。默认情况下,groupadd/etc/login.defs 中指定的范围内分配下一个可用的 GID。你需要 sudo 权限才能运行此命令。让我们创建一个名为 developers 的组。

    sudo groupadd developers

    你可以通过检查 /etc/group 文件来验证组的创建。

    grep developers /etc/group

    你应该看到类似这样的条目:

    developers:x:1002:
  • 你还可以使用 -g 选项为组指定特定的 GID。让我们创建另一个名为 testers 的组,并指定一个特定的 GID,例如 2000

    sudo groupadd -g 2000 testers

    验证 testers 组的 GID。

    grep testers /etc/group

    输出应该确认指定的 GID:

    testers:x:2000:

接下来,让我们使用 groupmod 命令修改现有的组。

  • 你可以使用 -n 选项更改组的名称。让我们将 testers 重命名为 qa_team

    sudo groupmod -n qa_team testers

    /etc/group 中验证名称更改。

    grep qa_team /etc/group

    输出应该显示新名称以及原始 GID:

    qa_team:x:2000:
  • 你还可以使用 -g 选项更改组的 GID。让我们将 qa_team 的 GID 更改为 2001

    sudo groupmod -g 2001 qa_team

    验证 GID 更改。

    grep qa_team /etc/group

    输出应该反映新的 GID:

    qa_team:x:2001:

现在,让我们管理这些组中的用户成员资格。你将为此使用 usermod 命令。首先,创建几个测试用户。

  • 创建 userAuserB,并将它们的密码设置为 labexrhel9

    sudo useradd userA
    sudo passwd userA

    输入 labexrhel9 作为 userA 的密码。

    sudo useradd userB
    sudo passwd userB

    输入 labexrhel9 作为 userB 的密码。

  • userA 作为辅助组添加到 developers 组。将 -a(追加)和 -G(组)选项与 usermod 一起使用。

    sudo usermod -aG developers userA

    使用 id 命令验证 userA 的组成员资格。

    id userA

    你应该在 groups 部分看到 developers

    uid=1003(userA) gid=1003(userA) groups=1003(userA),1002(developers)
  • userB 作为辅助组添加到 developersqa_team 组。

    sudo usermod -aG developers,qa_team userB

    验证 userB 的组成员资格。

    id userB

    你应该看到列出了 developersqa_team

    uid=1004(userB) gid=1004(userB) groups=1004(userB),1002(developers),2001(qa_team)
  • 你还可以使用 -g 选项与 usermod 一起更改用户的主组。让我们将 userA 的主组更改为 developers

    sudo usermod -g developers userA

    验证 userA 的主组。

    id userA

    gid 字段现在应该显示 developers

    uid=1003(userA) gid=1002(developers) groups=1002(developers)

    注意:当你更改用户的主组时,如果该组也是一个辅助组,则会从 /etc/group 中该组的成员资格列表中删除。在这种情况下,userA 的原始主组 (userA) 不再被列为辅助组。

最后,让我们删除你创建的组和测试用户。

  • 使用 groupdel 命令删除一个组。如果一个组是任何用户的主组,则你无法删除它。首先,在删除 developers 之前,将 userA 的主组改回其默认值(或其他现有组)。

    sudo usermod -g userA userA ## 将 userA 的主组改回 userA
    sudo groupdel developers

    验证 developers 已从 /etc/group 中删除。

    grep developers /etc/group

    此命令应该不返回任何输出。

  • 删除 qa_team 组。

    sudo groupdel qa_team

    验证其删除。

    grep qa_team /etc/group

    此命令也应该不返回任何输出。

  • 清理测试用户。

    sudo userdel -r userA
    sudo userdel -r userB

这结束了你对管理本地组账户和用户 - 组成员资格的实践。

配置用户密码策略

在这一步中,你将学习如何在 RHEL 系统上配置用户密码策略。密码策略对于增强安全性至关重要,它通过对密码复杂性、过期和账户锁定的规则进行强制执行。你将探索 /etc/shadow 文件和 chage 命令。

首先,让我们了解 /etc/shadow 文件,它存储加密的密码信息和用户账户的密码老化参数。此文件高度敏感,只能由 root 用户读取。

  • 每个用户在 /etc/shadow 文件中都有一个条目。让我们创建一个新用户 policyuser,并为其设置密码 labexrhel9,以进行演示。

    sudo useradd policyuser
    sudo passwd policyuser

    输入 labexrhel9 作为 policyuser 的密码。

  • 现在,查看 /etc/shadowpolicyuser 的条目。

    sudo grep policyuser /etc/shadow

    你将看到类似这样的输出:

    policyuser:$6$randomsalt$encryptedhash:19780:0:99999:7:::

    让我们分解每个字段,用冒号分隔:

    • policyuser:用户账户的名称。
    • $6$randomsalt$encryptedhash:用户的加密密码。
      • $6:用于此密码的哈希算法(SHA-512,RHEL 9 默认值)。
      • randomsalt:用于加密密码的 salt;最初随机选择。
      • encryptedhash:用户密码的加密哈希。
    • 19780:自纪元(1970-01-01 UTC)以来密码最后一次更改的天数。此数字将根据当前日期而变化。
    • 0:自上次密码更改以来,用户可以再次更改密码之前的最少天数。
    • 99999:密码过期之前,密码未更改的最长天数。一个空字段表示密码永不过期。
    • 7:在密码过期之前警告用户的提前天数。
    • (空):自密码过期之日起,在账户自动锁定之前,没有活动的天数。
    • (空):账户过期的日期,以自纪元以来的天数表示。一个空字段表示账户永不过期。
    • 最后一个字段通常为空,并保留供将来使用。

接下来,你将使用 chage 命令修改这些密码老化参数。chage 命令允许你更改用户密码过期信息。

  • 让我们为 policyuser 设置一个密码策略,其中包含以下规则:

    • 密码更改之间的最少天数:7 天(-m 7
    • 密码更改之间的最长天数:90 天(-M 90
    • 密码过期前的警告期:14 天(-W 14
    • 密码过期后账户锁定前的非活动期:30 天(-I 30
    sudo chage -m 7 -M 90 -W 14 -I 30 policyuser
  • 要验证这些更改,你可以使用 chage -l(列表)来显示 policyuser 的当前密码老化信息。

    sudo chage -l policyuser

    你应该看到反映新策略的输出:

    Last password change     : Mar 04, 2024
    Password expires     : Jun 02, 2024
    Password inactive     : Jul 02, 2024
    Account expires      : never
    Minimum number of days between password change  : 7
    Maximum number of days between password change  : 90
    Number of days of warning before password expires : 14

    注意:日期将根据你执行实验的时间而变化。

  • 你还可以使用 -E 选项设置绝对的账户过期日期。让我们将 policyuser 的账户设置为从今天起 30 天后过期。首先,获取今天的日期并计算 30 天后的日期。

    EXPIRY_DATE=$(date -d "+30 days" +%Y-%m-%d)
    echo "Account will expire on: $EXPIRY_DATE"
    sudo chage -E $EXPIRY_DATE policyuser

    验证账户过期日期。

    sudo chage -l policyuser | grep "Account expires"

    输出应该显示计算出的过期日期:

    Account expires      : Apr 03, 2024

    注意:日期将大约是你的当前实验日期的 30 天后。

  • 要删除账户过期日期,你可以使用 chage -E -1 policyuser

    sudo chage -E -1 policyuser
    sudo chage -l policyuser | grep "Account expires"

    输出应该恢复为 never

    Account expires      : never

最后,清理 policyuser 账户。

sudo userdel -r policyuser

这结束了你对配置用户密码策略的实践。你现在了解了如何使用 /etc/shadow 文件和 chage 命令来检查和修改密码老化参数。

总结

在这个实验中,你学习了 Red Hat Enterprise Linux (RHEL) 中用户和组管理的基本概念。你首先了解了用户和组如何与文件和进程关联,以及如何使用 id 命令检查当前用户和其他系统用户(如 root)的用户和组信息。你还练习了分别使用 ls -lls -ld 命令识别文件和目录的所有权,这对于理解权限和访问控制至关重要。

该实验进一步指导你获取超级用户访问权限,创建和修改本地用户账户,管理本地组账户,以及配置用户密码策略。这些步骤提供了在基本系统管理任务中的实践经验,使你能够有效地管理 Linux 系统上的用户访问和安全性。