介绍
在这个实验中,你将获得在 Red Hat Enterprise Linux (RHEL) 环境中管理本地用户和组的基本技能。你将首先了解基本的用户和组概念,包括如何识别用户和组信息以及文件所有权。
随后,你将学习如何获得超级用户访问权限,创建和修改本地用户账户,管理本地组账户,以及配置用户密码策略。这种实践经验将使你掌握在你的 Linux 系统上有效控制访问和权限的知识。
在这个实验中,你将获得在 Red Hat Enterprise Linux (RHEL) 环境中管理本地用户和组的基本技能。你将首先了解基本的用户和组概念,包括如何识别用户和组信息以及文件所有权。
随后,你将学习如何获得超级用户访问权限,创建和修改本地用户账户,管理本地组账户,以及配置用户密码策略。这种实践经验将使你掌握在你的 Linux 系统上有效控制访问和权限的知识。
在这一步中,你将学习 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
你将看到各种进程,其中 labex 和 root 是常见的用户:
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
找到 labex 和 root 的条目。对于 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 命令可以显示用户的所有组成员资格。回想一下 labex 的 id 输出:
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 权限)。超级用户访问权限对于执行管理任务至关重要,例如安装软件、管理用户和配置系统设置。你将探索 su 和 sudo 命令,它们是特权提升的主要工具。
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
你应该看到类似这样的行,它授予 wheel 组 sudo 访问权限:
%wheel ALL=(ALL:ALL) ALL
此行表示:
%wheel: 该规则适用于 wheel 组的成员。% 符号表示一个组。ALL=(ALL:ALL): 在任何主机上(第一个 ALL),wheel 组中的用户可以作为任何用户(第二个 ALL)和任何组(第三个 ALL)运行命令。ALL: wheel 组中的用户可以运行任何命令。这结束了你对获得超级用户访问权限的探索。你现在了解了 su - 和 sudo -i 之间的区别,以及如何使用提升的权限执行命令。
在这一步中,你将学习如何在 RHEL 系统上创建、修改和删除本地用户账户。管理用户账户是一项基本的管理任务,确保每个用户都具有适当的访问权限。你将使用 useradd、usermod、userdel 和 passwd 等命令。
首先,让我们创建一个新的用户账户。
使用 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 系统上管理本地组账户。组对于有效管理权限至关重要,允许你同时向多个用户授予访问权限。你将使用 groupadd、groupmod 和 groupdel 等命令,并重新访问 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 命令。首先,创建几个测试用户。
创建 userA 和 userB,并将它们的密码设置为 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 作为辅助组添加到 developers 和 qa_team 组。
sudo usermod -aG developers,qa_team userB
验证 userB 的组成员资格。
id userB
你应该看到列出了 developers 和 qa_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/shadow 中 policyuser 的条目。
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 设置一个密码策略,其中包含以下规则:
-m 7)-M 90)-W 14)-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 -l 和 ls -ld 命令识别文件和目录的所有权,这对于理解权限和访问控制至关重要。
该实验进一步指导你获取超级用户访问权限,创建和修改本地用户账户,管理本地组账户,以及配置用户密码策略。这些步骤提供了在基本系统管理任务中的实践经验,使你能够有效地管理 Linux 系统上的用户访问和安全性。