AFAIK,/etc/passwd 的第二个字段可以是
- x:密码在阴影中
- 散列密码
如果我在字段中输入少于 8 个字符的字符串怎么办?我不希望任何人使用此帐户的密码。
答案1
如果/etc/shadow
存在,则不应使用/etc/passwd
文件的密码哈希字段。您应该使用等效字段来/etc/shadow
代替。
如果您在密码哈希字段中放入无效字符串(无论正在使用的字段是 in/etc/shadow
还是 in /etc/passwd
),密码身份验证将被禁用。但是,放入非标准长度的字符串会是意外的:我认为最好使用密码哈希函数不使用的字符。非标准长度的密码哈希字符串可能会被认为是批量编辑密码文件时的复制/粘贴错误,但使用标准集之外的字符显然是故意的。
您还应该知道 的含义passwd -l
已更改。
2008 年 8 月之前,该passwd -l <username>
命令通常等效于:
OLDPW="$(grep ^<username>: /etc/shadow | cut -d : -f 2)"
echo "<username>:!$OLDPW" | chpasswd -e
usermod --expiredate 1 <username>
特别是,源代码包passwd
中的命令shadow
正是这样做的。
8月22日,命令由“锁定账户”改为“仅锁定密码”。换句话说,更改后命令现在只执行与此等效的操作:
OLDPW="$(grep ^<username>: /etc/shadow | cut -d : -f 2)"
echo "<username>:!$OLDPW" | chpasswd -e
因此它仍然像以前一样在加密密码前加上感叹号,但不再将整个帐户标记为禁用。
源代码包shadow
曾经是/现在是许多发行版命令的上游源passwd
,因此更改最终发生在许多发行版中。例如,RHEL 5 具有旧行为,但 RHEL 6 遵循新行为。
Busybox 的passwd
命令有一个单独的代码库,所以我不知道他们遵循哪种行为。快速搜索 BusyBox 的文档似乎表明它根本不包括密码/帐户老化功能。
但是,如果您发现运行passwd -l <username>
还禁用了该用户的 SSH 密钥身份验证(即旧行为),则可以仅通过将密码设置为密码散列函数无法生成的任何值来锁定密码。例如,像这样:
echo "username:!" | chpasswd -e
这应该是一种将用户帐户设置为“仅基于非密码的身份验证”状态的非常通用的方法。
一个相对常见的约定似乎是使用感叹号(单独或作为密码哈希字段的任何先前内容的前缀)来指示锁定的密码,并使用星号(替换密码哈希字段的整个内容)来标记锁定的密码。帐户作为系统帐户,不应使用passwd -u
.但是,即使密码哈希字段具有无效值,其他身份验证机制(例如 SSH 密钥)也可以发挥作用。