简介
Linux 中的 "su" (substitute user, 切换用户) 命令是一个强大的工具,它允许用户临时切换到不同的用户账户,通常是 root 用户,以执行管理任务。然而,su 认证失败可能会发生,导致访问被拒绝和潜在的安全风险。本教程将指导你解决 Linux 上 su 认证失败的问题,涵盖常见原因、配置设置以及安全使用 su 的最佳实践。
理解 Su 命令和基本用法
Linux 中的 su 命令允许用户将其当前用户身份切换到另一个用户。这对于执行需要提升权限的管理任务特别有用。
让我们探索 su 命令的基本用法,并了解它是如何工作的。
Su 的基本用法
在你的 LabEx 虚拟机环境中打开一个终端。你可以使用以下语法运行 su 命令:
su [options] [username]
如果你运行 su 且未指定用户名,它将默认为 root 用户:
su
你将被提示输入 root 密码。然而,在许多现代 Linux 发行版中,包括 Ubuntu,出于安全原因,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, Pluggable Authentication Modules) 系统控制 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. 检查认证日志
在解决认证失败问题时,检查系统日志可以提供有价值的信息:
sudo tail /var/log/auth.log
此命令显示最近的认证事件,包括失败的 su 尝试。
例如,失败的 su 尝试可能会显示如下条目:
May 10 14:23:45 ubuntu su[12345]: FAILED su for root by labex
理解这些常见的 su 认证失败原因将帮助你在后续步骤中更有效地识别和解决问题。
配置 Su 命令的访问控制
Linux 提供了几种机制来控制谁可以使用 su 命令。在这一步中,我们将探讨如何配置这些访问控制以增强安全性。
理解 PAM 配置
可插拔认证模块 (PAM, Pluggable Authentication Modules) 系统负责 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
并尝试使用 su 和 testuser,testuser 是 sugroup 的成员:
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"(锁定),则帐户被锁定。
步骤 3:检查访问控制限制
正如我们在上一步中了解到的,PAM 配置可以限制 su 访问。检查此类限制:
grep -v "^#" /etc/pam.d/su | grep pam_wheel
如果这返回包含 pam_wheel.so 的行,则 su 的访问权限可能被限制为特定组的成员。
步骤 4:检查系统日志
系统日志可以提供有关认证失败的详细信息:
sudo tail -n 20 /var/log/auth.log
查找与 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 权限执行 ls 命令,而无需切换到 root 用户。
正确配置 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 登录时。相反,用户应该使用他们的常规帐户登录,并在必要时使用 su 或 sudo。
检查是否禁用了通过 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 使用情况
查看日志以监视 su 的使用情况:
sudo grep "su:" /var/log/auth.log | tail -n 10
这显示了最近的 su 尝试,包括成功的和失败的。
考虑为多次失败的 su 尝试设置自动警报,这可能表明存在攻击。
使用带有破折号选项的 Su
当使用 su 切换到另一个用户(尤其是 root)时,使用破折号(-)选项来获得一个干净的环境:
su - username
这提供了一个登录 shell,其中包含目标用户的环境变量,这更安全,并防止了因继承原始用户的环境而可能导致的问题。
实践会话 - 安全使用 Su
让我们练习这些最佳实践:
- 不要使用
su -成为 root 然后运行命令,而是使用 sudo:
## 而不是:
## su -
## cat /etc/shadow
## 使用:
sudo cat /etc/shadow
- 使用干净的环境切换到 testuser:
su - testuser
- 退出并返回到你的原始用户:
exit
- 检查 auth 日志以获取 su 使用情况:
sudo grep "su:" /var/log/auth.log | tail -n 5
通过遵循这些最佳实践,你可以安全地使用 su 命令,同时最大限度地减少对系统的潜在安全风险。
总结
在这个实验中,我们探索了 Linux 中的 su 命令,并学习了如何解决常见的身份验证失败问题。我们涵盖了:
- 了解
su命令的基本用法及其工作原理 - 识别 su 身份验证失败的常见原因,包括密码错误、帐户限制和 PAM 配置问题
- 配置
su命令的访问控制以增强安全性 - 通过系统诊断来解决 su 身份验证失败问题
- 实施安全使用 su 的最佳实践,包括在可能的情况下使用 sudo、配置强大的密码策略以及定期审计 su 的使用情况
通过应用这些技术和最佳实践,你可以确保 su 命令正常运行,同时维护你的 Linux 系统的安全性。请记住,正确的身份验证管理是系统管理和安全性的一个关键方面。



