在 Linux 中配置用户账户与 Sudo 权限

CompTIABeginner
立即练习

介绍

在本实验中,你将学习管理用户账户和 sudo 权限的核心技术,以增强 Linux 系统的安全性。你将练习强制执行密码策略、锁定与解锁用户账户、保护 root 账户以及授予管理权限。对于任何负责维护安全且管理良好的 Linux 环境的系统管理员来说,这些技能都是基础。

你将首先使用 chage 命令设置密码过期规则,并使用 passwd 命令控制账户访问。接着,你将通过禁用 root 用户的直接 SSH 登录来保护系统。最后,你将探索两种授予提权的方法:将用户添加到 wheel 组以获得通用的 sudo 访问权限,以及使用 visudo 命令创建自定义的精细化规则,从而安全地委派特定的管理任务。

这是一个引导实验,提供分步说明以帮助你学习和练习。请仔细遵循说明完成每个步骤并获得实践经验。历史数据表明,这是一个 初学者 级别的实验,完成率为 93%。它获得了学习者 96% 的好评率。

使用 chage 管理用户密码策略

在这一步中,你将学习如何使用 chage 命令管理用户密码策略。强制执行密码策略(如设置过期日期)是保护用户账户免受未经授权访问的关键安全实践。chage 命令(“change age”的缩写)允许你查看和修改用户账户的密码有效期信息。

首先,让我们创建一个新用户以便安全地进行练习。我们将这个用户命名为 testuser。运行以下命令添加该用户:

sudo useradd -m testuser

接下来,为 testuser 设置密码。系统会提示你输入并确认新密码。为了本实验的简便起见,请使用 password 作为密码。

sudo passwd testuser

你将看到确认密码已成功更新的输出。

New password:
Retype new password:
passwd: password updated successfully

现在我们有了 testuser,让我们查看其默认的密码有效期设置。使用带有 -l(列表)选项的 chage 命令:

sudo chage -l testuser

输出显示了当前的策略。默认情况下,大多数设置处于非活动状态,且密码永不过期。

Last password change     : <date>
Password expires     : never
Password inactive     : never
Account expires      : never
Minimum number of days between password change  : 0
Maximum number of days between password change  : 99999
Number of days of warning before password expires : 7

让我们强制执行更严格的策略。我们将配置该账户,使得:

  • -m 7:用户在再次更改密码前必须至少等待 7 天。
  • -M 90:密码将在 90 天后过期。
  • -W 14:用户将在密码过期前 14 天收到警告。

你可以通过一条 chage 命令应用所有这些设置:

sudo chage -m 7 -M 90 -W 14 testuser

现在,通过再次列出设置来验证更改是否已应用:

sudo chage -l testuser

输出现在应该反映你刚刚设置的新策略。

Last password change     : <date>
Password expires     : <date + 90 days>
Password inactive     : never
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

另一个快速检查用户密码状态的有用命令是 passwd -S。让我们在 testuser 上尝试一下:

sudo passwd -S testuser

输出提供了密码状态的简要摘要,包括上次更改日期、最小有效期、最大有效期和警告期。

testuser PS <date> 7 90 14 -1

你现在已成功为用户账户配置并验证了密码有效期策略。

使用 passwd 锁定和解锁用户账户

在这一步中,你将学习如何临时锁定和解锁用户账户。这是一项常见的管理任务,例如,当员工休长假或怀疑账户被盗用时。锁定账户可以阻止登录,但会保留用户的数据和配置。我们将使用在上一步中创建的 testuser 账户。

首先,让我们锁定 testuser 账户。为此,使用带有 -l(锁定)选项的 passwd 命令。

sudo passwd -l testuser

你应该会看到一条确认消息:

passwd: password expiry information changed.

要验证账户是否已锁定,你可以再次使用 passwd -S 命令检查其状态。

sudo passwd -S testuser

注意输出中的状态字段。它现在应该以 L(已锁定)开头,表示基于密码的登录已被禁用。

testuser L <date> 7 90 14 -1

让我们尝试切换到 testuser 账户以确认其无法访问。使用 su(切换用户)命令。系统会提示你输入 testuser 的密码。

su - testuser

输入密码 password。登录尝试将失败,这是锁定账户的预期行为。

Password:
su: Authentication failure

现在,让我们解锁账户。这可以通过 passwd -u(解锁)选项完成。

sudo passwd -u testuser

同样,你将看到一条确认消息:

passwd: password expiry information changed.

让我们使用 passwd -S 验证解锁状态:

sudo passwd -S testuser

状态现在应该是 PS(已设置密码),表示账户处于活动状态且拥有有效密码。

testuser PS <date> 7 90 14 -1

最后,让我们再次尝试切换到 testuser 账户。

su - testuser

在提示时输入密码 password。这一次,登录应该成功,你的命令提示符将发生变化,显示你现在已以 testuser 身份登录。

Password:
testuser@<hostname>:~$

要返回到原始的 labex 用户会话,只需输入 exit 并按回车键。

exit

你现在已成功练习了锁定和解锁用户账户。

通过禁用 SSH 登录来保护 Root 账户

在这一步中,你将通过禁用 root 用户的直接 SSH 登录来增强系统的安全性。允许远程 root 登录是一个重大的安全风险,因为它为攻击者提供了一个直接的高权限目标。最佳实践是以标准用户身份登录,然后使用 sudo 执行管理任务。

首先,你需要编辑 SSH 守护进程的配置文件,该文件位于 /etc/ssh/sshd_config。我们将使用 nano 文本编辑器修改此文件。由于这是一个受保护的系统文件,你必须使用 sudo

sudo nano /etc/ssh/sshd_config

nano 编辑器中,你需要找到包含 PermitRootLogin 的行。你可以按 Ctrl+W 使用搜索功能,输入 PermitRootLogin,然后按 Enter

注意:在某些操作系统或特定的浏览器环境中,Ctrl+W 快捷键可能会与浏览器快捷键冲突。如果你无法使用 Ctrl+W 进行搜索,可以手动滚动文件以找到 PermitRootLogin 行,该行通常位于配置文件的身份验证(authentication)部分。

你可能会发现类似这样的一行:

#PermitRootLogin prohibit-password

或者它可能被设置为 yes。你的任务是将此行更改为 PermitRootLogin no。如果行首有 #,请务必将其删除,因为该字符会注释掉该行使其失效。最终的行应该完全如下所示:

PermitRootLogin no

完成更改后,保存文件并退出 nano。按 Ctrl+X,然后按 Y 确认保存更改,最后按 Enter 确认文件名。

为了使新配置生效,你必须重启 SSH 服务。使用 service 命令执行此操作:

sudo service ssh restart

如果命令执行成功,将不会产生任何输出。为了确保服务运行正常,你可以检查其状态:

sudo service ssh status

你应该看到服务处于 running(运行中)状态。

现在,让我们测试更改是否生效。我们将尝试从本机(使用 localhost)以 root 身份通过 SSH 登录。首先,你需要为 root 用户设置一个密码以使测试有效。使用 password 作为密码。

sudo passwd root
New password:
Retype new password:
passwd: password updated successfully

现在,尝试以 root 身份进行 SSH 登录:

ssh root@localhost

连接应立即被拒绝,并显示“Permission denied”错误。这确认了你的安全增强措施工作正常。

root@localhost: Permission denied (publickey,password).

你已成功通过禁用 SSH 直接 root 登录保护了你的系统。

通过 wheel 组授予 Sudo 访问权限

在这一步中,你将学习一种授予管理权限的标准方法:将用户添加到一个预先配置为拥有 sudo 访问权限的特殊组(通常是 wheelsudo)。这种方法比在 sudoers 文件中添加单个用户条目更易于管理且更具扩展性。我们将继续使用 testuser 账户。

首先,让我们确认 testuser 目前没有 sudo 权限。切换到 testuser 账户。密码是 password

su - testuser

现在,以 testuser 身份尝试运行一个需要 root 权限的命令,例如带 sudowhoami。系统会提示你输入 testuser 的密码。

sudo whoami

输入密码后,命令将失败。你将看到一条消息,指出 testuser 不在 sudoers 文件中。这是预期的结果。

[sudo] password for testuser:
testuser is not in the sudoers file.  This incident will be reported.

现在,输入 exit 返回到你的 labex 用户会话。

exit

接下来,我们需要编辑 sudoers 配置,以向 wheel 组的所有成员授予 sudo 访问权限。编辑此配置最安全的方法是使用 visudo 命令,它会在保存前验证语法,以防止你被锁定在系统之外。

sudo visudo

这将在文本编辑器(通常是 vinano)中打开 /etc/sudoers 文件。寻找引用 %wheel 组的行。它可能被 # 字符注释掉了。

## %wheel ALL=(ALL) ALL

或者

## %wheel ALL=(ALL:ALL) ALL

你需要通过删除行首的 # 来取消注释。结果应该如下所示:

%wheel ALL=(ALL) ALL

如果你在 vi 编辑器中,使用方向键移动到 #,按 x 将其删除,然后输入 :wq 并按回车键保存并退出。如果你在 nano 中,只需删除 #,按 Ctrl+X,然后按 Y,再按回回车。

现在 wheel 组已被赋权,将 testuser 添加到该组中。使用带有 -aG 选项的 usermod 命令,其中 -a 表示追加(append),-G 指定补充组。

sudo usermod -aG wheel testuser

要验证 testuser 现在是否是 wheel 组的成员,使用 groups 命令:

groups testuser

输出应在 testuser 的组列表中显示 wheel

testuser : testuser wheel

最后,让我们测试新权限是否生效。切换回 testuser

su - testuser

再次尝试 sudo 命令。在提示时输入 password

sudo whoami

这一次,命令应该成功执行并输出 root,确认 testuser 现在拥有 sudo 权限。

[sudo] password for testuser:
root

输入 exit 返回到你的 labex 会话。你已成功通过将用户添加到 wheel 组授予了 sudo 访问权限。

使用 visudo 创建自定义 Sudo 规则

在这一步中,你将超越宽泛的基于组的权限,学习如何创建精细化的 sudo 规则。这对于实施最小权限原则至关重要,即仅授予用户执行其职责所需的精确权限。我们将在 sudoers 文件中使用别名(alias)来定义一组用户和一组命令,然后在一个规则中将它们关联起来。

首先,让我们创造一个场景来测试我们的规则。我们将以 root 用户身份启动一个进程。top 命令(一个简单的进程监视器)非常适合这个实验。我们将使用 sudo 在后台运行它。在开始之前,让我们确保没有其他 top 进程在运行。

pgrep top || echo "No top processes running"
sudo top &

你将看到后台作业的进程 ID(PID)。如果提示符没有立即重新出现,请按回车键。

[1] <PID>

现在,让我们创建自定义规则。我们将授予 testuser 使用 killpkill 命令终止进程的特定能力。使用 visudo 命令打开 sudoers 文件进行编辑。这是编辑此文件的唯一安全方式。

sudo visudo

这将在编辑器中打开 /etc/sudoers。转到文件末尾。添加以下行来定义命令别名和用户别名,然后创建连接它们的规则。

## Custom rule for junior administrators
Cmnd_Alias      KILL_CMDS = /usr/bin/kill, /usr/bin/pkill
User_Alias      JUNIOR_ADMINS = testuser

JUNIOR_ADMINS   ALL=(ALL) KILL_CMDS

让我们分解这些行:

  • Cmnd_Alias:创建一个命名的命令列表。我们将我们的命名为 KILL_CMDS。注意,你必须使用命令的全路径。
  • User_Alias:创建一个命名的用户列表。我们将我们的命名为 JUNIOR_ADMINS
  • 最后一行是规则本身。它授予 JUNIOR_ADMINS 中的用户在所有主机(ALL)上运行 KILL_CMDS 中命令的权限。

添加完这些行后,保存文件并退出编辑器。

为了正确测试这个特定规则,我们必须首先将 testuserwheel 组中移除,以撤销在上一步中授予的完整 sudo 访问权限。这可以确保我们的测试是有效的。

sudo gpasswd -d testuser wheel

你将看到一条确认消息:

Removing user testuser from group wheel

现在,让我们测试新的受限权限。切换到 testuser 账户。密码是 password

su - testuser

首先,确认完整的 sudo 访问权限已消失。尝试运行一个不在我们 KILL_CMDS 别名中的命令,比如 whoami

sudo whoami

此尝试应该失败,并显示一条消息指出 testuser 不被允许执行此命令。

[sudo] password for testuser:
Sorry, user testuser is not allowed to execute '/usr/bin/whoami' as root on <hostname>.

接下来,尝试其中一个被允许的命令。让我们使用 pkill 来停止我们之前启动的 top 进程。我们将使用 pkill -u root top 来专门针对以 root 身份运行的 top 进程。

sudo pkill -u root top

该命令应该成功执行,且不显示任何错误消息。要确认 top 进程已被终止,请退出并返回到你的 labex 用户并检查该进程。

exit

现在,检查 top 进程是否仍在运行。

pgrep -u root top

该命令应该没有输出,确认进程已被 testuser 成功杀死。你现在已成功创建并测试了一个细粒度的 sudo 规则。

总结

在本实验中,你学习了在 Linux 环境中管理用户账户及其安全策略的核心技术。你练习了使用 chage 命令强制执行密码有效期规则,例如设置密码的最短和最长生存期以及警告期。你还学习了如何使用 passwd 命令锁定和解锁用户账户以控制登录访问。为了增强系统安全性,你修改了 SSH 守护进程配置以禁用直接 root 登录,这是保护系统最高权限账户的关键最佳实践。

此外,你还探索了使用 sudo 安全地委派管理权限的方法。你学习了通过 usermod 命令将用户添加到 wheel 组来授予完整 sudo 访问权限的标准做法。为了实现更精细的控制,你使用了 visudo 命令安全地编辑 sudoers 文件,创建了自定义规则,允许特定用户在无需 root 密码的情况下执行指定的提权命令。这种方法遵循了最小权限原则,仅授予用户执行其任务所需的权限。