强制Ubuntu系统所有用户使用复杂密码,最直接有效的方法是修改PAM(Pluggable Authentication Modules,可插拔认证模块)配置。具体操作是编辑/etc/pam.d/common-password文件,在password requisite pam_pwquality.so开头的行中添加或调整参数,例如minlen=12(最小长度)、minclass=3(至少包含三类字符:小写字母、大写字母、数字和符号)、retry=3(重试次数)等。这能从根本上提升整个系统的密码安全基线。对于已存在的用户,管理员可以通过chage命令设置密码最长使用期限,并强制用户下次登录时更改密码。

为什么必须强制复杂密码?Ubuntu默认策略的不足

许多人认为Ubuntu作为Linux发行版已经足够安全,这是一个误区。默认安装的Ubuntu系统对用户密码的复杂性要求非常宽松,可能只检查长度,甚至不强制要求数字或特殊字符。在暴力破解和字典攻击日益猖獗的今天,简单的密码如“password123”或用户生日会在几秒内被攻破。一旦某个普通用户账号被破解,攻击者就可能利用权限提升漏洞(如未及时修补的CVE漏洞)或读取敏感配置文件,进而控制整个服务器,导致数据泄露、服务中断或被植入恶意软件。因此,通过PAM模块强制执行一套统一的、严格的密码策略,不是可选建议,而是系统安全管理的底线要求。

深入核心:PAM模块工作机制与关键配置文件

PAM是Linux身份验证的基石,它采用模块化设计,将认证过程与具体应用程序分离。当用户执行loginsusudo或修改密码时,相关程序(如passwd)会调用PAM。PAM根据配置文件决定调用哪些模块、按什么顺序执行以及如何处理成功或失败。与密码复杂度直接相关的主要是pam_pwquality模块(在旧版系统中可能是pam_cracklib)。其核心配置文件是/etc/pam.d/common-password。该文件中的一行配置,可能决定了整个系统的密码强度。理解其语法“type control module-path module-arguments”至关重要,例如“password requisite pam_pwquality.so retry=3”意味着密码管理必须通过pam_pwquality模块检查,失败则立即拒绝,且有3次重试机会。

手把手配置:定制你的企业级密码策略

下面是一个综合性的配置示例。在修改前,请务必使用sudo cp /etc/pam.d/common-password /etc/pam.d/common-password.backup进行备份。然后使用sudo nano /etc/pam.d/common-password编辑文件,找到包含pam_pwquality.so的行并进行修改:

# 将原有行替换或修改为如下内容(参数可根据需要调整):
password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1 minclass=3 enforce_for_root reject_username difok=7 remember=5

# 参数详解:
# retry=3:允许用户重试3次。
# minlen=12:密码最小长度为12个字符。
# dcredit=-1:至少包含1位数字(-1表示至少1个,-2表示至少2个,以此类推)。
# ucredit=-1:至少包含1个大写字母。
# ocredit=-1:至少包含1个特殊字符(符号)。
# lcredit=-1:至少包含1个小写字母。
# minclass=3:密码中至少包含上述4种字符类型中的3种。
# enforce_for_root:对root用户同样强制执行此策略(至关重要!)。
# reject_username:密码中不能包含当前用户名。
# difok=7:新密码必须与旧密码至少有7个字符不同。
# remember=5:PAM将记住最近5次密码,防止用户循环使用旧密码。

保存文件后,此策略将立即生效。下次任何用户(包括root)使用passwd命令修改密码时,都必须遵守这些规则。你可以创建一个测试用户来验证策略是否生效。

策略加固:结合chage命令管理密码生命周期

仅有复杂度要求还不够,定期更换密码是纵深防御的关键一环。使用chage命令可以管理用户密码的过期时间。强制所有用户90天更换一次密码,并提前7天收到警告的命令是:sudo chage -M 90 -W 7 用户名。更高效的做法是,可以先修改/etc/login.defs文件中的PASS_MAX_DAYS 90PASS_WARN_AGE 7,这会对之后创建的新用户生效。然后,使用一个循环命令批量修改现有用户:

# 修改/etc/login.defs中的默认值后,对现有用户批量操作
sudo awk -F: '$1 !~ /^#/ && $1 !~ /^\+/ && $1 != "root" {print $1}' /etc/passwd | sudo xargs -I {} sudo chage -M 90 -W 7 {}

若要强制某个用户下次登录时必须更改密码,可使用sudo chage -d 0 用户名。这些措施与PAM复杂度策略相结合,构成了完整的密码生命周期管理。

高级场景与排错:应对特殊需求与常见问题

在实际部署中,你可能会遇到特殊需求。例如,为某些服务账户(用于运行应用程序的非登录账户)设置例外。不建议直接放宽全局策略,更好的做法是为这些服务账户设置超长、超复杂的随机密码(使用openssl rand -base64 24生成),并禁用其登录Shell(将/etc/passwd中该用户的shell改为/usr/sbin/nologin)。另一个常见问题是,配置后用户无法修改密码。首先检查/etc/pam.d/common-password文件的语法,确保没有拼写错误。使用pam-auth-update命令可以交互式地管理PAM配置模块。查看认证日志/var/log/auth.log能获得具体的失败原因,例如“Password too short”或“Password lacks enough character classes”。

超越密码:PAM策略与多因素认证(MFA)的整合展望

强制复杂密码是安全的重要一步,但非绝对安全。在高级威胁面前,应考虑引入多因素认证(MFA)。Ubuntu的PAM体系可以无缝集成Google Authenticator等TOTP模块或U2F安全密钥。例如,安装libpam-google-authenticator后,在/etc/pam.d/sshd文件中添加auth required pam_google_authenticator.so,即可为SSH登录启用基于时间令牌的双因素认证。这形成了“你知道的(密码)+ 你拥有的(手机/密钥)”的双重保障。未来,结合基于证书的认证或生物特征识别,PAM的模块化架构能让Ubuntu系统的身份验证能力持续演进,应对不断变化的安全挑战。

总之,通过精细配置PAM的pam_pwquality模块,并辅以chage密码生命周期管理,管理员可以构建一道坚固的密码安全防线。这项配置是服务器上线前的标准动作,也应纳入日常安全审计的检查清单。安全是一个过程,而非一个状态,从强制一个复杂的密码开始,是构建可信系统环境的坚实第一步。