排查 Linux 下 su 认证失败问题

LinuxBeginner
立即练习

介绍

Linux 中的「su」(substitute user,切换用户)命令是一个强大的工具,允许用户临时切换到另一个用户账户(通常是 root 用户)来执行管理任务。然而,su 认证可能会失败,导致无法获取权限并产生潜在的安全风险。本实验将引导你完成排查 Linux 下 su 认证失败的过程,涵盖常见原因、配置设置以及 su 安全使用的最佳实践。

理解 su 命令及基本用法

在本步骤中,你将学习 Linux 中的 su 命令如何允许用户将当前身份切换为另一个用户。这对于执行需要提升权限的管理任务非常有用。

让我们探索 su 命令的基本用法并了解其工作原理。

su 的基本用法

在 LabEx 虚拟机环境中打开终端。你可以使用以下语法运行 su 命令:

su [options] [username]

如果不指定用户名直接运行 su,它默认切换到 root 用户:

su

系统会提示你输入 root 密码。然而,在包括 Ubuntu 在内的许多现代 Linux 发行版中,出于安全考虑,root 账户默认是禁用的。

让我们创建一个测试用户来进行练习:

sudo adduser testuser

根据提示输入所需信息。为简单起见,你可以将该测试用户的密码设为 "password"。

现在,让我们尝试切换到该用户:

su testuser

出现提示时,输入你为 testuser 设置的密码。认证成功后,你的提示符会发生变化,表明你现在正以 testuser 的身份操作。

要验证是否已成功切换用户,请运行:

whoami

输出应显示:

testuser

要返回到原来的用户,只需输入:

exit

使用带选项的 su

su 命令支持多个选项。最常用的是 -(连字符)选项,它提供了一个完整的登录环境:

su - testuser

这不仅切换了用户身份,还执行了以下操作:

  • 切换到目标用户的主目录
  • 设置目标用户的环境变量
  • 提供一个登录 shell

尝试运行此命令并观察差异:

pwd

输出应显示 testuser 的主目录:

/home/testuser

输入以下命令退出 testuser:

exit

su 命令的这些基本了解将有助于我们在接下来的步骤中排查认证失败问题。

常见的 su 认证失败及其原因

在本步骤中,你将创建并检查常见的 su 认证失败场景。了解这些失败原因是解决问题的第一步。

测试认证失败

让我们故意制造一些认证失败,以便更好地理解它们。

首先,尝试使用错误的密码切换到 testuser:

su testuser

输入错误的密码。你将看到类似以下的错误信息:

su: Authentication failure

接下来,尝试切换到一个不存在的用户:

su nonexistentuser

你将看到类似以下的错误信息:

su: user nonexistentuser does not exist

认证失败的常见原因

1. 密码错误

认证失败最常见的原因就是输入了错误的密码。这可能是由于:

  • 拼写错误
  • 开启了 Caps Lock(大写锁定)
  • 忘记了密码

2. 账户限制

某些账户可能被配置为禁止登录或密码已过期:

让我们修改测试用户来演示这一点:

sudo passwd -l testuser

这会锁定 testuser 的密码。现在尝试:

su testuser

即使输入正确的密码,你也会看到认证失败。

使用以下命令解锁账户:

sudo passwd -u testuser

3. PAM 配置问题

可插拔认证模块(PAM)系统控制着 Linux 中的认证。PAM 配置问题可能导致 su 失败。

让我们检查 su 命令的 PAM 配置:

cat /etc/pam.d/su

该文件包含 su 命令特定的 PAM 配置。查找可能限制访问的行,例如:

auth       required   pam_wheel.so

如果取消注释,该行会将 su 访问权限限制为仅限 wheel 组成员。

4. su 二进制文件的权限问题

su 命令的二进制文件必须具有正确的权限才能正常工作:

ls -l $(which su)

输出应类似于:

-rwsr-xr-x 1 root root 71816 Apr 18  2022 /usr/bin/su

权限中的 s 表示设置了 setuid 位,允许程序以其所有者(root)的权限运行,而不是以运行它的用户身份运行。

5. 检查认证日志

在 LabEx 虚拟机中排查认证失败时,可以使用 lastb 查看失败的登录记录:

sudo lastb | head

该命令读取 /var/log/btmp 并显示最近失败的认证尝试,包括系统记录的失败 su 尝试。

例如,一次失败的 su 尝试可能会显示包含目标用户和终端会话的条目。

了解这些常见的 su 认证失败原因将帮助你在接下来的步骤中更有效地识别和解决问题。

配置 su 命令的访问控制

Linux 提供了多种机制来控制谁可以使用 su 命令。在本步骤中,我们将探索如何配置这些访问控制以增强安全性。

理解 PAM 配置

可插拔认证模块(PAM)系统负责 Linux 中的认证。su 命令的配置存储在 /etc/pam.d/su 文件中。

让我们详细检查该文件:

cat /etc/pam.d/su

该文件包含控制认证方式的各种指令。需要注意的一行重要配置是:

auth       required   pam_wheel.so

如果该行未被注释(不以 ## 开头),它会将 su 访问权限限制为仅限 wheel 组成员。

将 su 访问权限限制为特定组

我们可以将使用 su 切换到 root 的权限限制为特定组的成员。这是一种常见的安全做法。

首先,让我们创建一个名为 sugroup 的新组:

sudo groupadd sugroup

接下来,将我们的测试用户添加到该组:

sudo usermod -aG sugroup testuser

现在,我们需要修改 PAM 配置以将 su 访问权限限制为该组成员:

sudo cp /etc/pam.d/su /etc/pam.d/su.bak

现在,在 nano 编辑器中打开 PAM 配置文件:

sudo nano /etc/pam.d/su

查找类似以下内容的行:

## auth       required   pam_wheel.so

取消注释该行(删除开头的 #),并将其修改为使用我们的 sugroup 而不是 wheel:

auth       required   pam_wheel.so group=sugroup

Ctrl+O 保存文件,然后按 Ctrl+X 退出 nano。

测试配置

让我们通过尝试以不在 sugroup 中的用户身份使用 su 来测试我们的配置。

首先,创建另一个测试用户:

sudo adduser testuser2

根据提示输入所需信息。

现在,尝试使用 testuser2 切换到 root 用户:

su - testuser2

出现提示时输入 testuser2 的密码。

现在尝试切换到 root 用户:

su -

即使输入正确的 root 密码,你也应该收到认证失败的消息。这是因为 testuser2 不是 sugroup 的成员。

现在切换回你原来的用户:

exit

然后尝试使用 testuser(sugroup 的成员)使用 su

su - testuser

出现提示时输入 testuser 的密码。

现在尝试切换到 root 用户:

su -

如果你输入了正确的 root 密码,你应该能够成功切换到 root 用户。

还原更改

为了完成本实验的其余部分,让我们还原对 PAM 配置的更改:

sudo cp /etc/pam.d/su.bak /etc/pam.d/su

此配置允许你控制谁可以使用 su 命令切换到 root 用户,从而增强系统的安全性。

排查并解决 su 认证失败

在本步骤中,你将使用系统化的流程来排查并解决 su 认证失败问题。

诊断认证失败

当你遇到 su 认证失败时,请遵循以下系统步骤进行诊断:

步骤 1:检查错误信息

错误信息可以提供有关失败性质的重要线索。常见的错误信息包括:

  • su: Authentication failure - 通常表示密码错误。
  • su: user username does not exist - 指定的用户账户不存在。
  • su: permission denied - 访问控制限制阻止了该操作。

步骤 2:验证用户账户

确保目标用户账户存在且未被锁定:

grep testuser /etc/passwd

这应该在密码文件中显示 testuser 的条目,确认账户存在。

检查账户是否被锁定:

sudo passwd -S testuser

输出包含账户的状态。如果显示 "L"(Locked),则表示账户已锁定。

步骤 3:检查访问控制限制

正如我们在上一步中所学,PAM 配置可能会限制 su 访问。检查是否存在此类限制:

grep -v "^#" /etc/pam.d/su | grep pam_wheel

如果返回包含 pam_wheel.so 的行,则 su 访问权限可能被限制为特定组成员。

步骤 4:检查系统日志

失败的登录记录可以提供有关认证失败的有用信息:

sudo lastb | head

查找与你失败的 su 尝试相关的条目,这可以提供额外的上下文。

解决常见的 su 认证失败

现在,让我们解决常见的 su 认证失败问题:

1. 密码错误

如果你输入了正确的密码但仍然认证失败,可能需要重置密码:

sudo passwd testuser

出现提示时为 testuser 输入新密码。

2. 账户锁定

如果账户被锁定,请解锁它:

sudo passwd -u testuser

3. 访问控制限制

如果访问控制限制阻止了 su 访问,你可以:

a. 将用户添加到所需的组:

sudo usermod -aG sugroup testuser2

这将把 testuser2 添加到 sugroup 中。

b. 通过注释掉 PAM 配置中的相关行来暂时禁用限制:

sudo sed -i 's/^auth\s\+required\s\+pam_wheel.so/#&/' /etc/pam.d/su

此命令会注释掉 su PAM 配置中包含 pam_wheel.so 的行。

4. 文件权限问题

如果 su 二进制文件权限不正确,请修复它们:

sudo chmod u+s $(which su)

这确保了 su 二进制文件上设置了 setuid 位。

测试修复结果

应用修复程序后,测试 su 认证是否正常工作:

su - testuser

出现提示时输入 testuser 的密码。如果成功,你应该以 testuser 身份登录。

尝试切换到 root 用户:

su -

如果你有 root 密码并且访问控制限制已得到妥善处理,你应该能够成功切换到 root 用户。

这些排查步骤和修复方法解决了最常见的 su 认证失败问题。通过系统地诊断和解决这些问题,你可以确保 su 命令在你的系统上正常运行。

su 安全使用的最佳实践

在本步骤中,你将探索安全使用 su 命令的最佳实践。遵循这些实践有助于在有效执行管理任务的同时,最大限度地降低安全风险。

尽可能使用 sudo 代替 su

sudo 命令通常被认为比 su 更安全,因为:

  • 它允许对权限进行更细粒度的控制
  • 它会记录以提升权限执行的命令
  • 它不需要共享 root 密码

使用 sudo 代替 su 的示例:

## 代替:
su -
## 然后以 root 身份输入命令

## 使用:
sudo command

尝试这个示例:

sudo ls /root

这会在不切换到 root 用户的情况下,以 root 权限执行 ls 命令。

正确配置 sudo 访问权限

确保正确配置 sudo 以仅授予必要的权限:

sudo visudo

这会在安全编辑器中打开 sudoers 文件。该文件应包含类似以下的条目:

## User privilege specification
root    ALL=(ALL:ALL) ALL

## Members of the sudo group may gain root privileges
%sudo   ALL=(ALL:ALL) ALL

Ctrl+X 退出而不进行更改。

限制直接 root 登录

不鼓励直接以 root 身份登录,尤其是在通过 SSH 登录时。相反,用户应使用其常规账户登录,并在必要时使用 susudo

检查是否禁用了通过 SSH 直接 root 登录:

grep "PermitRootLogin" /etc/ssh/sshd_config

如果返回 PermitRootLogin no,则表示已正确禁用直接 root 登录。

实施强密码策略

确保 root 密码和具有 su 访问权限的用户密码足够强大:

sudo apt-get install -y libpam-pwquality

这会安装一个用于密码质量检查的 PAM 模块。

通过编辑 PAM 配置来配置密码策略:

sudo nano /etc/pam.d/common-password

查找包含 pam_pwquality.so 的行,并确保它具有适当的参数,例如:

password requisite pam_pwquality.so retry=3 minlen=12 difok=3

Ctrl+X 退出而不进行更改,因为我们只是在检查配置。

定期审计 su 使用情况

当你需要调查不成功的认证尝试时,请查看失败的登录记录:

sudo lastb | head

这显示了记录在 /var/log/btmp 中的最近失败的认证尝试。

考虑为多次失败的 su 尝试设置自动警报,这可能预示着攻击。

使用带连字符选项的 su

使用 su 切换到另一个用户(尤其是 root)时,请使用连字符(-)选项以获得干净的环境:

su - username

这提供了一个带有目标用户环境变量的登录 shell,这更安全,并防止了因继承原始用户环境而导致的潜在问题。

实践环节 - 安全使用 su

让我们练习这些最佳实践。

首先,不要使用 su - 成为 root 然后运行命令,而是使用 sudo:

## 代替:
## su -
## cat /etc/shadow

## 使用:
sudo cat /etc/shadow

接下来,在干净的环境中切换到 testuser:

su - testuser

然后退出回到你原来的用户:

exit

最后,检查失败的登录记录:

sudo lastb | head

通过遵循这些最佳实践,你可以安全地使用 su 命令,同时最大限度地减少对系统的潜在安全风险。

总结

在本实验中,我们探索了 Linux 中的 su 命令,并学习了如何排查常见的认证失败问题。我们涵盖了:

  1. 理解 su 命令的基本用法及其工作原理
  2. 识别 su 认证失败的常见原因,包括密码错误、账户限制和 PAM 配置问题
  3. 配置 su 命令的访问控制以增强安全性
  4. 通过系统诊断排查并解决 su 认证失败
  5. 实施 su 安全使用的最佳实践,包括尽可能使用 sudo、配置强密码策略以及定期审计 su 使用情况

通过应用这些技术和最佳实践,你可以确保 su 命令正常运行,同时维护 Linux 系统的安全性。请记住,适当的认证管理是系统管理和安全的关键方面。