介绍
在这个实验中,你将获得在 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要退出
rootshell 并返回到你的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要退出
rootshell 并返回到你的labex用户,请键入exit。exit你的提示符将返回到
[labex@host ~]$。你也可以使用
sudo以 root 权限运行单个命令,而无需切换到rootshell。例如,要查看/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/testuser01grep命令应该不返回任何输出,表明用户已删除。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 userAgid字段现在应该显示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设置一个密码策略,其中包含以下规则:- 密码更改之间的最少天数:7 天(
-m 7) - 密码更改之间的最长天数:90 天(
-M 90) - 密码过期前的警告期:14 天(
-W 14) - 密码过期后账户锁定前的非活动期:30 天(
-I 30)
sudo chage -m 7 -M 90 -W 14 -I 30 policyuser- 密码更改之间的最少天数:7 天(
要验证这些更改,你可以使用
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 系统上的用户访问和安全性。



