配置 Linux 用户账户和 Sudo 权限

CompTIACompTIABeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

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

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

使用 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(list)选项的 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 锁定和解锁用户账户

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

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

sudo passwd -l testuser

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

passwd: password expiry information changed.

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

sudo passwd -S testuser

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

testuser L <date> 7 90 14 -1

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

su - testuser

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

Password:
su: Authentication failure

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

sudo passwd -u testuser

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

passwd: password expiry information changed.

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

sudo passwd -S testuser

状态现在应该是 PS(Password Set),表示账户处于活动状态且具有有效密码。

testuser PS <date> 7 90 14 -1

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

su - testuser

在提示时输入密码 password。这次,登录应该会成功,并且你的命令提示符会发生变化,显示你现在已作为 testuser 登录。

Password:
testuser@<hostname>:~$

要返回到你原来的 labex 用户会话,只需键入 exit 并按 Enter 键。

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 来使用搜索功能。

你可能会找到类似这样的行:

#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 并按 Enter 保存并退出。如果你在 nano 中,只需删除 #,按 Ctrl+X,然后按 Y,最后按 Enter

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

sudo usermod -aG wheel testuser

为了验证 testuser 是否已成为 wheel 组的成员,请使用 groups 命令:

groups testuser

输出应显示 wheeltestuser 的组列表中。

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 文件中的别名来定义一组用户和一组命令,然后将它们在规则中链接起来。

首先,让我们创建一个场景来测试我们的规则。我们将以 root 用户身份启动一个进程。top 命令是一个简单的进程监视器,非常适合此任务。我们将使用 sudo 在后台运行它。

sudo top &

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

[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 中命令的权限。

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

为了正确测试此特定规则,我们必须首先从 wheel 组中移除 testuser,以撤销上一步中授予的完整 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 进程。

sudo pkill top

此命令应成功执行,没有任何错误消息。为了确认 top 进程已被终止,退出到你的 labex 用户并检查进程。

exit

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

pgrep top

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

总结

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

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