简介
在本实验中,你将学习如何通过实施和强制执行稳健的密码策略,掌握增强 Linux 系统安全性的关键技术。你将配置系统级规则来强化密码复杂度要求,包括设置最小长度,并要求密码同时包含大写字母、小写字母和数字等不同类型的字符。你还将设置密码有效期策略,定期强制用户更换密码,从而降低密码泄露带来的风险。这些配置将通过修改系统核心配置文件来完成。
除了建立密码策略外,你还将确保这些严格的密码要求会应用于新用户账户。随后,实验将从主动防护转向被动检测,指导你如何监控系统身份验证日志。通过分析这些日志,你将能够识别重复登录失败等可疑活动,这类活动可能表明系统正在遭受暴力破解攻击或其他未经授权的访问尝试。
配置 Linux 本地密码复杂度和有效期策略
在本步骤中,你将学习如何通过配置稳健的密码策略来增强 Linux 系统的安全性。强密码策略是一项基础安全控制,主要涵盖两个关键方面:复杂度和有效期。复杂度规则要求密码包含多种字符类型,避免密码过于容易猜测;有效期规则则强制定期更换密码,从而降低凭据泄露带来的风险。你将使用 Linux 的标准工具修改系统级配置文件并应用这些策略。
首先,了解密码复杂度设置。在 Ubuntu 等现代 Debian 系统中,密码质量由 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
enforce_for_root
下面解释这些选项:
minlen = 10:将密码的最小长度设置为 10 个字符。dcredit = -1:要求至少包含一个数字。负数表示「至少需要一个」。ucredit = -1:要求至少包含一个大写字母。lcredit = -1:要求至少包含一个小写字母。enforce_for_root:禁止管理员绕过密码质量检查。由于sudo adduser会以 root 权限为新用户设置密码,因此必须启用此选项。
添加完成后,按 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 开头,然后再次提示你输入新密码。
BAD PASSWORD: The password fails the dictionary check
New password:
该密码违反了多项规则,系统会在再次提示输入密码前报告其中一个拒绝原因。
需要注意的是,警告本身并不代表密码一定会被拒绝;只有当命令再次提示你输入新密码时,才说明密码没有通过检查。你在步骤 1 中添加的 enforce_for_root 设置可以确保特权 adduser 进程无法接受弱密码。
提示:如果你不小心创建了用户,可以使用
sudo deluser testuser删除该用户,然后重新尝试。
现在输入符合所有要求的密码。当系统提示时,输入 N7vQ2mR9xK4p,然后按 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(切换用户)命令,尝试切换到自己的 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 模块强制执行密码复杂度规则,包括设置最小密码长度,以及要求密码至少包含一个数字、一个大写字母和一个小写字母,从而降低凭据被轻易猜出的风险。
此外,你还了解了如何确保这些强密码策略在创建新用户账户时生效。实验还介绍了监控系统身份验证日志、检测并分析安全事件这一项关键技能,例如识别重复登录失败记录,因为这类记录可能表明系统正在遭受攻击。



