![警告密码过期而不强制更改](https://linux22.com/image/35426/%E8%AD%A6%E5%91%8A%E5%AF%86%E7%A0%81%E8%BF%87%E6%9C%9F%E8%80%8C%E4%B8%8D%E5%BC%BA%E5%88%B6%E6%9B%B4%E6%94%B9.png)
这很简单。我想弄清楚/etc/login.defs
和/或中的更改的组合是什么/etc/pam.d/system-auth-ac
。我需要执行以允许以下行为:
我希望用户的密码有效期为 60 天。
60 天后,系统需要在用户登录时对他们大喊大叫,告诉他们需要尽快更改密码。
系统不得妨碍用户对系统的访问。
这必须适用于现有用户(非系统帐户
UID >=500
)以及任何新创建的用户。
理由:有限用户将无法管理系统帐户密码,只能管理系统管理员。因此,用户不应该因为管理员错过密码更改而阻碍对系统的访问。帐户数量相当少(也许 9 个或 10 个),但我们都是人,我们时不时会忘记做一些事情。
我不确定是否login.defs
或PAM
提供这个。该文档让我相信,您可以让系统强制用户在密码过期时更改其密码,或者您可以让密码根本不会过期。第三种选择是将密码期限设置为某个较大的值,例如 9,999 天,然后开始警告用户其密码将在 9,936 天后过期,但这也不是我真正需要的。我已经完成了其他类型的PAM
配置,所以这不是我第一次绕街区旅行。我只是被这个问题困住了。
PAM
那么,这可以用/来完成login.defs
,还是我需要另一个实用程序来代替它们?
答案1
如果您不反对使用自定义脚本,请尝试将此作为pam_exec
脚本:
#! /bin/bash
LAST_DATE=$(date -d "$(chage -l $PAM_USER | awk -F: '/Last password/{print $2}')" '+%s')
TODAY=$(date '+%s')
MAX_AGE=60
if (( (($TODAY - $LAST_DATE) / 86400) > $MAX_AGE ))
then
echo "Please change your password!"
fi
将其保存在某处(例如,/usr/local/bin/pass-warn.sh
),然后添加一行/etc/pam.d/sshd
:
session optional pam_exec.so stdout /usr/local/bin/pass-warn.sh
答案2
如果您设置了密码有效期,那么pam_unix.so
密码过期后将拒绝其身份验证。要执行您想要的操作,您可以在他们的登录脚本中添加一些内容。例如,我可以将以下内容添加到/etc/profile.d
:
#!/bin/bash
maxDays=30
dayLastChanged=$(passwd -S $(whoami) | awk '{print $3}')
currentTimestamp=$(date "+%s")
lastChangeTimestamp=$(date -d $dayLastChanged "+%s")
timestampDifference=$(( $currentTimestamp - $lastChangeTimestamp ))
maxSeconds=$(( $maxDays * 86400 ))
if [[ $timestampDifference -gt $maxSeconds ]]; then
echo "Yo, you need to change your password bud. Otherwise the guys with white-on-white ties are coming for you."
fi