介绍
在本实验中,你将学习通过实施和强制执行强大的密码策略来增强 Linux 系统安全性的关键技术。你将配置系统范围内的规则,强制执行密码复杂度,要求最小长度和不同字符类型的组合,例如大写字母、小写字母和数字。你还将设置密码老化策略,以确保凭据定期更改,通过修改核心系统配置文件来降低与密码泄露相关的风险。
除了制定策略外,你还将确保这些强大的密码要求应用于新用户账户。然后,实验将从主动安全措施转向被动检测,教你如何监控系统身份验证日志。通过分析这些日志,你将能够识别可疑活动,例如重复的登录失败尝试,这可能是暴力破解攻击或其他未经授权的访问尝试的迹象。
配置本地 Linux 密码策略的复杂性和有效期
在这一步中,你将学习如何通过配置强大的密码策略来加强 Linux 系统的安全性。强大的密码策略是强制执行两个关键方面——复杂性和有效期——的基本安全控制措施。复杂性规则通过要求混合使用字符类型来确保密码不易被猜测,而有效期规则则强制用户定期更改密码,从而降低凭证泄露的风险。你将使用标准的 Linux 实用工具来修改系统范围的配置文件并应用这些策略。
首先,我们来探讨密码复杂性。在现代基于 Debian 的系统(如 Ubuntu)上,密码质量由 pam_pwquality 模块管理。其配置存储在 /etc/security/pwquality.conf 文件中。
让我们从检查默认设置开始。使用 cat 命令查看配置文件内容。我们将使用 grep 来过滤掉注释行和空行,使输出更清晰。
grep -vE '^#|^$' /etc/security/pwquality.conf
你可能会看到一些默认设置,或者该文件可能没有活动的配置。现在,我们将强制执行更严格的策略。我们需要使用管理员权限编辑此文件,因此我们将使用 sudo 配合 nano 编辑器。
sudo nano /etc/security/pwquality.conf
将以下行添加到文件中以强制执行我们的新策略。这些设置要求密码至少包含 10 个字符,并且至少包含一个数字、一个大写字母和一个小写字母。
minlen = 10
dcredit = -1
ucredit = -1
lcredit = -1
我们来分解一下这些选项:
minlen = 10: 将密码可接受的最小长度设置为 10 个字符。dcredit = -1: 要求至少包含一个数字。负数表示“至少一个”。ucredit = -1: 要求至少包含一个大写字符。lcredit = -1: 要求至少包含一个小写字符。
添加这些行后,保存文件并按 Ctrl+X,然后按 Y,再按 Enter 退出 nano。
现在,我们来配置密码有效期。这些设置定义了密码的最大和最小生命周期。新用户账户的默认值存储在 /etc/login.defs 中。
使用 grep 在此文件中查找相关设置。
grep -E 'PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE' /etc/login.defs
你将看到默认值,其中 PASS_MAX_DAYS 通常被设置为一个非常大的数字,实际上禁用了过期。
## PASS_MAX_DAYS Maximum number of days a password may be used.
PASS_MAX_DAYS 99999
## PASS_MIN_DAYS Minimum number of days allowed between password changes.
PASS_MIN_DAYS 0
## PASS_WARN_AGE Number of days warning is given before a password expires.
PASS_WARN_AGE 7
我们来强制执行一个 9000 天的过期策略。使用 sudo nano 打开文件。
sudo nano /etc/login.defs
找到 PASS_MAX_DAYS 这一行,将其值从 99999 更改为 9000。你也可以将 PASS_MIN_DAYS 设置为 7,以防止用户过于频繁地更改密码。
## PASS_MAX_DAYS Maximum number of days a password may be used.
PASS_MAX_DAYS 9000
## PASS_MIN_DAYS Minimum number of days allowed between password changes.
PASS_MIN_DAYS 7
## PASS_WARN_AGE Number of days warning is given before a password expires.
PASS_WARN_AGE 14
保存文件并退出 nano。/etc/login.defs 中的这些设置适用于在此更改之后创建的用户。要将策略应用于现有用户,例如我们的 labex 用户,我们使用 chage 命令。
首先,检查 labex 用户的当前有效期信息。
sudo chage -l labex
输出将显示密码永不过期。
Last password change : Jul 22, 2023
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 标志的 chage 为 labex 用户将最大天数设置为 9000。
sudo chage -M 9000 labex
再次检查用户有效期信息以验证更改。
sudo chage -l labex
你现在会看到 Password expires 日期已更新,并且最大天数设置为 9000,成功应用了有效期策略。
Last password change : Jul 22, 2023
Password expires : Jan 01, 2048
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 9000
Number of days of warning before password expires : 7
你现在已成功在你的 Linux 系统上配置了密码复杂性和有效期策略。
为新用户账户强制执行强密码
在这一步中,你将验证你在上一步配置的密码复杂度和有效期策略是否已对新用户账户生效。测试此功能的最佳方法是创建一个新用户,并尝试设置一个违反这些规则的密码。这将演示 pam_pwquality 模块和系统的默认设置如何协同工作,从新账户创建的那一刻起就保护它们的安全。
我们将使用 adduser 命令,这是一个在基于 Debian 的系统中创建用户的用户友好型交互式脚本。让我们创建一个名为 testuser 的新用户。
sudo adduser testuser
系统将立即提示你为新用户设置密码。这就是我们将测试策略的地方。
首先,我们尝试设置一个简单、弱的密码,它违反了我们的策略。当系统提示输入新密码时,输入 password 并按 Enter。
Adding user `testuser' ...
Adding new group `testuser' (1001) ...
Adding new user `testuser' (1001) with home directory `/home/testuser' ...
Copying files from `/etc/skel' ...
New password:
由于 password 违反了我们的规则(它太短,不包含大写字母或数字),系统将拒绝它。让我们看看它给出的原因。
BAD PASSWORD: The password contains less than 1 digits
系统拒绝了该密码,并指出缺少数字。它违反了多项策略,但这是它报告的第一项。
系统将再次提示你。现在,让我们尝试一个满足长度要求但仍违反复杂性规则的密码。输入 12345 并按 Enter。
BAD PASSWORD: The password contains less than 1 uppercase letters
New password:
提示:如果你不小心创建了用户,可以使用
sudo deluser testuser来删除该用户并重试。
系统再次拒绝了该密码。这次是因为密码缺少数字。它也缺少大写字母,因此不符合我们的复杂性要求。现在,让我们提供一个满足所有标准的密码。当被提示时,输入 StrongPass2025 并按 Enter。系统会要求你重新输入以确认。
New password:
Retype new password:
passwd: password updated successfully
成功!系统接受了强密码。接下来,它会询问有关用户的其他信息。你可以简单地对每个提示按 Enter 键以接受默认值。
Changing the user information for testuser
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
用户 testuser 现已创建。你可以使用 id 命令来验证用户是否存在。
id testuser
这将显示用户的 ID、组 ID 和组成员身份。
uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)
接下来,让我们确认我们在 /etc/login.defs 中设置的密码有效期策略是否已自动应用于此新用户。使用 chage 命令查看 testuser 的有效期信息。
sudo chage -l testuser
输出将显示 Maximum number of days between password change(两次密码更改之间的最大天数)设置为 9000,与我们的配置完全一致。
Last password change : Jul 22, 2023
Password expires : Jan 01, 2048
Password inactive : never
Account expires : never
Minimum number of days between password change : 7
Maximum number of days between password change : 9000
Number of days of warning before password expires : 14
最后,为了保持系统整洁,让我们删除测试用户。deluser 命令将删除用户账户。
sudo deluser testuser
系统将确认用户已被删除。
Removing user `testuser' ...
Warning: group `testuser' has no more members.
Done.
你已成功创建了一个新用户,测试了密码策略的执行情况,并验证了默认的有效期规则已应用。
监控身份验证日志以检测失败的登录尝试
在本步骤中,你将学习如何监控系统认证日志以检测潜在的安全威胁,例如暴力破解攻击。系统管理的一个关键部分是定期审查日志以发现可疑活动。失败的登录尝试是未经授权访问尝试的关键指标。你将模拟一次失败的登录,然后使用标准的 Linux 命令查找并分析相应的日志条目。
在像 Ubuntu 这样的基于 Debian 的系统上,认证事件(包括成功和失败的)通常记录在 /var/log/auth.log 文件中。读取此文件需要管理员权限。
首先,让我们生成一次失败的登录尝试。我们可以安全地做到这一点,方法是使用 su(Substitute User,切换用户)命令尝试切换到我们自己的用户账户 labex,但故意提供错误的密码。
su labex
系统将提示你输入密码。键入任何不正确的密码,例如 wrongpassword,然后按 Enter。
Password:
su: Authentication failure
让我们再做一次,以创建失败的模式。
su labex
再次输入不正确的密码。现在我们已经生成了一些日志数据,让我们检查认证日志文件。我们将使用 sudo 和 tail 命令来查看 /var/log/auth.log 的最后几行,这是记录最新事件的地方。
sudo tail /var/log/auth.log
你将看到与你失败的 su 尝试相关的几行新内容。输出将与此类似,显示时间戳、进程(su)和失败消息。
Jul 22 16:45:01 labex-vm su[12345]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost= user=labex
Jul 22 16:45:01 labex-vm su[12345]: FAILED SU (to labex) labex on /dev/pts/0
Jul 22 16:45:15 labex-vm su[12346]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost= user=labex
Jul 22 16:45:15 labex-vm su[12346]: FAILED SU (to labex) labex on /dev/pts/0
手动搜索日志可能非常耗时。更有效的方法是使用 grep 来过滤特定关键字。让我们搜索所有包含“authentication failure”的行。
sudo grep "authentication failure" /var/log/auth.log
此命令将仅显示匹配模式的行,从而轻松发现你刚刚创建的失败尝试。
现在,让我们创建一个简单的 shell 脚本来自动化此监控过程。此脚本将检查日志中的失败情况并报告摘要。在你的 ~/project 目录中,使用 nano 创建一个名为 log_monitor.sh 的新文件。
nano log_monitor.sh
将以下 Bash 脚本输入编辑器。此脚本使用带 -c 标志的 grep 来计算失败的登录尝试次数,然后打印状态消息。
#!/bin/bash
LOG_FILE="/var/log/auth.log"
FAILURE_COUNT=$(sudo grep -c "authentication failure" $LOG_FILE)
echo "--- Authentication Log Monitor ---"
if [ "$FAILURE_COUNT" -gt 0 ]; then
echo "WARNING: Found $FAILURE_COUNT failed login attempts."
else
echo "OK: No failed login attempts found."
fi
echo "--------------------------------"
保存文件并按 Ctrl+X,然后按 Y,最后按 Enter 退出 nano。
接下来,使用 chmod 命令使你的新脚本可执行。
chmod +x log_monitor.sh
最后,运行你的监控脚本以查看结果。
./log_monitor.sh
由于你生成了失败的登录,脚本将检测到它们并显示警告消息以及确切的计数。
--- Authentication Log Monitor ---
WARNING: Found 2 failed login attempts.
--------------------------------
你现在已经学会了如何模拟、检测和创建用于失败认证尝试的基本监控脚本,这是维护系统安全的一项关键技能。
总结
在本实验中,你学习了如何通过配置强大的本地密码策略来增强 Linux 系统安全性。你修改了 /etc/security/pwquality.conf 文件,使用 pam_pwquality 模块来强制执行密码复杂性规则。这包括设置最小密码长度,并要求包含至少一个数字、一个大写字母和一个小写字母,以防止易于猜测的凭据。
此外,你还探讨了如何确保在创建新用户账户时应用这些强密码策略。本实验还涵盖了监控系统认证日志以检测和分析安全事件的关键技能,例如重复的失败登录尝试,这可能表明存在潜在攻击。



