password 这个词是一个糟糕的密码。每个人都知道,除了用户。几个PAM模块允许您对密码实施质量标准,以防止用户使用这种明显不好的密码。这些质量检查器不会消除坏密码,但会要求用户在创建坏密码时更有创意。
虽然每个人都同意 password 会让密码变得可怕,但让密码变得好的品质是一个有争议的话题。众所周知,即使是冷静理智的(calm and rational)系统管理员与其他冷静理性的系统管理员讨论密码质量措施,他们的平静理智的讨论也会升级为一场刀战。一些人完全反对今天使用的密码质量检查的概念。出于这个原因,我们不会讨论密码的哪些特征是好的。相反,我们将介绍允许您对用户施加特定偏见的PAM模块。
最常见的密码质量检查模块是pam_passwdcc。CentOS 7取消了pam_passwdgc,代之以pam_pwquality。Debian有这两种软件包。我们将使用pam_passwdcc解释密码质量检查的配置和概念,然后简要介绍pam_pwquality。
当用户更改密码时,测试密码的质量。这使得质量检查成为密码策略中为数不多的功能之一,就像这样。
password requisite pam_passwdqc.so
password required pam_unix.so
在大多数系统上,passwd(1)
有自己的PAM配置 /etc/pam.d/passwd 。系统默认文件中的更改不会影响 passwd(1)
,除非 /etc/pam.d/passwd 明确包含默认值。
当pam_unix确信密码应该更改时,它会更改 /etc/passwd 和相关文件。在pam_unix语句之前放置任何密码质量检查,以便在更改密码之前对其进行审核。
“用户应该多久更改一次密码?”这个问题与密码质量检查器密切相关。许多组织要求定期更改密码。其他人则认为,要求更改密码比保持不变更不安全。也许只有在首次登录时才能更改密码。
您不需要在PAM中设置密码过期策略,但正确配置的PAM需要尊重密码过期。我见过不止一个基于LDAP的网络不拒绝过期的密码。
BSD系统在 /etc/login.conf 中全局管理密码寿命,并使用 pw(8)
为单个用户管理密码寿命。Linux系统大多使用 chage(8)
。有关配置密码寿命的详细信息,请参阅操作系统手册。
所有密码质量检查器都有一些共同的概念。
不,不是“战士”、“牧师”、“小偷”等等。密码检查器将密码中的可能字符分为四类:小写字母、大写字母、数字和其他所有ASCII符号。第五个字符类用于非ASCII字符,但我们大多数人都不容易输入这些字符。您可以要求用户的密码最多包含四个类,并根据建议密码包含的类数来调整长度要求。
许多用户使用一个常见单词作为基础来构建密码。如果销售人员必须每月更改密码,他可能会在末尾增加一个数字,将hamster1替换为hamster2。密码检查器检查新旧密码之间的共同子字符串。您可以指定子字符串的大小。这些检查不会记录旧密码——记住,用户必须提供旧密码才能输入新密码,因此检查器可以访问这两个密码。如果 root 闯入并更改了用户的密码,这些子字符串检查将不起作用。
在过去的几十年里,类Unix系统的密码长度上限为8个字符。这在今天看来似乎很荒谬,但对于传统的DES密码哈希来说是必要的。即使在今天,附加(add-on)系统服务也可能对密码长度有最大限制。如果你在系统之间共享密码文件,其中一个系统可能仍然使用传统的哈希。您需要设置系统密码的最大长度。您还必须非常仔细地阅读密码检查器手册页。
如果你运行的软件限制了最大的密码长度,请修复或替换该软件。使用传统密码哈希的系统可能已经过时几十年了,任务关键,资金最少,而且理解得很差,没有人敢碰它们。大型企业和政府是这里最严重的灾区。试图更换系统要么会结束你的职业生涯,要么,如果你成功了,会加冕你为IT部门的黑魔王(Dark Lord)。
pam_passwdcc模块几乎出现在所有地方,除了最近版本的CentOS,并且长期以来一直是在密码更改期间检查新密码质量的标准工具。pam_passwdqc模块允许您定义密码长度要求、新旧密码之间必须不同的字符数、密码中必须包含的字符类型等。
Debian和FreeBSD都使用pam_passwdqc。它们之间唯一真正的区别是FreeBSD要求将所有选项都放置在PAM配置文件中,而Debian允许您将pam_passwdqc选项放在单独的文件中,即带有 config 选项的passwdqc.conf。
xxxxxxxxxx
password requisite pam_passwdqc config=/etc/passwdqc.conf
但是,每个中显示的实际配置选项都是相同的。我们将展示两者的示例。
启用pam_passwdqc后,任何时候任何人试图更改任何密码,都必须先通过质量检查。您可以通过 enforce 选项放松这种严格性。
如果设置 enforce=users
,则密码检查仅适用于无特权用户。root 用户可以为用户分配一个不足的密码。他们会收到警告,但密码会被更改。
如果设置 enforce=none
,pam_passwdqc会打印密码要求、警告和提示,但不会强制执行。
在这里,我告诉pam_passwdqc允许root违反密码标准。
xxxxxxxxxx
password requisite pam_passwdqc.so enforce=users
如果我定义了Debian配置文件,则此条目可以单独出现在一行中。
xxxxxxxxxx
enforce=users
现在,当老板打电话抱怨 GolfMaster 密码不可接受时,我可以成为 root 并为她设置密码。
我不建议您使用 enforce=none
,除非在实施新密码标准的警告期内。自愿标准是被忽视的标准。
pam_passwdqc使用字符类来规定密码的最小可接受长度。密码的字符类越少,密码必须越长。默认情况下,只包含两类字符的密码长度必须为24个字符。包含三类字符的密码长度必须为八个字符,而包含所有四类字符则将最小长度减少到七个字符。
复杂性检查有两个例外。密码开头的大写字母不算作额外的字符类。结尾也没有数字。密码Hamster1计为一个字符类,而1hamsteR包含三个字符类。你可以向用户解释这一点,或者告诉他们大写字母和数字需要在密码中间才能计数。不管怎样,他们都会诅咒你的名字。
使用 min 选项设置每种类型密码的最小长度。此选项需要五个逗号分隔的数字参数。这些参数中的任何一个也可以设置为禁用,以自动拒绝该类型的密码。
第一个参数规定了只有一个字符类的密码的最小长度。这默认为禁用,使pam_passwdqc拒绝任何仅由一个字符类组成的密码。
第二个参数给出了包含两个非密码的字符类的密码的最小长度。默认值为24。
第三个参数给出了密码的最小长度(以字符为单位)。我们将在下一节讨论密码短语。密码短语默认最小长度为11个字符。
第四个参数设置具有三个字符类的密码的最小长度。默认值为8。
最后,第五个参数给出了具有四个字符类的密码的最小长度。默认值为7。
这是一个奇怪的命令;为什么要使用它?参数按长度排序。只有两个字符类的密码需要很长才能保证安全。密码可以比这短一点。三个或四个字符类的密码可以更短。这些数字必须减少,否则pam_passwdqc将因错误而死亡。
您还可以使用max选项设置最大长度,默认为40,但密码太长通常不是问题。
以下示例中,我们禁用只有一两个字符类的密码。密码的最小长度为16个字符。三个字符类的密码最小长度为10,而四个字符类密码的最小长度为9:
xxxxxxxxxx
password requisite pam_passwdqc.so min=disabled,disabled,16,10,9 max=80
我将密码的最大长度定义为80,只是为了惹恼一位销售人员,他读了太多尼尔·斯蒂芬森的书,因此认为自己了解安全。
您可以将密码设置为 Lucas needs gelato 这样的短语,而不是单个密码!这是一个短语(passphrase),一系列单词而不是单个单词。令人惊讶的是,较长的密码短语实际上可能比包含随机字符的较短密码更安全。首先,你的用户不会经常写下来。您可以使用pam_passwdqc测试密码短语。
从用户的角度来看,密码短语的另一个优点是它们不需要有多个字符类。像 correct horse battery staple 这样的密码短语只包含一个字符类,但通过了质量检查。
passphrase 选项给出了密码短语作为密码必须包含的最小独立单词数。默认为3。如果一个密码短语没有足够的单词让pam_passwdqc将其视为密码,那么它只是一个包含空格的密码,并且会进行质量检查。
在这里,我使用Debian的passwdqc.conf要求密码必须是四个或更多的单词:
xxxxxxxxxx
passphrase=4
要求密码短语中包含更多单词可能会(但不一定)促使用户创建更长的密码短语。
pam_passwdqc模块有助于阻止用户使用具有 match 和 similar 选项的类似密码。
当用户更改密码时,pam_passwdqc会检查密码中的常见子字符串。它可以前后识别这些常见的字符串,例如hamster1与1retsmah,以及在不同情况下。match 选项给出了它在匹配字符串中查找的字符数。默认值为4,在旧密码和新密码之间查找四个或更多字符的常见字符串。
xxxxxxxxxx
match=4
虽然需要这些检查来防止用户使用可预测的密码方案,但它们可能会产生意想不到的结果。考虑将密码 !meowing6 更改为 homeowner!AtLast 。用户可能会很高兴终于买了一套房子,有足够的空间容纳他的六只猫,乍一看,这两个密码都足够了,但都包含 “meow” 这个字符串。
要关闭这些检查,请设置类似于permit的选项。它默认为拒绝。
xxxxxxxxxx
similar=permit
禁用相似性检查要么是个坏主意,要么是个糟糕的主意。
虽然pam_passwdqc有其他选项,但当您想调整整个策略的操作方式时,它们主要管理边缘情况。
pam_pwquality模块对密码质量采取了更复杂的方法。除了设置密码长度和不同字符类的要求外,它还有一个“信用”系统,如果密码遵循良好做法,则允许使用较短的密码。理论上,pam_pwquality可以识别糟糕的密码选择。(对于年长的系统管理员来说,这听起来可能很熟悉,因为pam_pwquality从古老的模块pam_cracklib中汲取了许多概念。)
常见的选项 use_first_pass 、 try_first_pass 和 pam_pwquality 的调试工作。当您第一次尝试此模块时,请大量使用调试选项。
您经常会看到 local_users-only 选项,它告诉模块只检查本地计算机密码文件中帐户的用户的密码。
使用 retry 选项设置pam_pwquality允许用户尝试创建可接受密码的次数。一旦用户多次尝试失败,pam_pwquality就会将其抛出。
最后,虽然 authtok_type 选项看起来令人印象深刻,但它只设置了一个用户可见的字符串来说明要更改的密码类型。它通常是空白的。
通常的pam_pwquality语句如下:
xxxxxxxxxx
password requisite pam_pwquality.so try_first_pass local_users_only \
retry=3 authtok_type=
pam_pwquality模块会立即拒绝所有类别的密码。如果新密码与旧密码相同,只是改变了大小写,则会被拒绝。如果它太小,或者太像旧的,它就会被拒绝。如果它是旧密码的旋转版本,如 hamster1 和 amster1h,则会被拒绝。最后,回文是完全不可接受的。
你可以对其中一些行为进行微调。我们将从建立最低要求开始,然后进入学分制度,然后涵盖适用于这两种制度的选项。其他配置选项可以放在PAM语句中,也可以放在 /etc/security/pwquality.conf 中。
您可以通过设置最小长度、所需字符类的数量以及每类字符的最小数量来设置对用户密码的限制。
minlen 选项设置密码的最小长度。增加最小长度很容易,但pam_pwquality有硬编码的下限。任何系统上的最小有效密码长度可能是6,但通过重新编译,这可能会减少到4。默认值为8。
minclass 选项设置密码中必须包含的最小字符类数。
使用 dcredit 选项设置密码中的最小位数。ucredit 选项指定大写字母的最小数目,而 lcredit 设置小写字母的最小数。最后, ocredit 设置了其他字符的最小数量。将最小值指定为负数——正值表示您使用的是信用系统(credits system)。在这里,我对用户密码提出了具体要求。为了清楚起见,我省略了通常的重试语句等。你肯定想把它们包括在生产中。
xxxxxxxxxx
password requisite pam_pwquality.so minlen=8 minclass=3 dcredit=-2 \
ucredit=-2 lcredit=-2 ocredit=-2
此语句要求用户至少有两个数字、两个小写字母、两个大写字母和另外两个字符。最小长度为8。虽然我将类的最小数量定义为三个,但并没有完全使用该设置——四个类中的每个类的最小值都超过了minclass语句。
定义的密码最低要求简化了对系统的攻击。如果入侵者试图猜测您系统的密码,他可以跳过所有不符合您密码标准的可能密码。为了让攻击者的生活更加艰难,请使用信用系统。
pam_pwquality信用系统允许您设置最小密码长度,但随后会为用户提供额外的信用,以包含多个不同的字符类。这为密码提供了灵活性,但允许人们在字符种类较多的情况下使用较短的密码。
系统管理员很难向用户解释传统的密码策略。我从未成功地向用户解释过信用(credits)。在现实世界中,我发现信用是系统管理员团队的奖励,而不是普通用户的奖励。
通过信用系统,用户在密码中包含的每个额外字符类都会获得信用。默认情况下,每个字符类都会额外提供一个信用字符。想想世界上最糟糕的密码,password 。它有八个字符长。用户因包含小写字符而获得一个额外的分数,因此它被记为有九个字符。如果将最小密码长度设置为九个字符,则 password 符合条件。(请注意,它会因为其他原因而被拒绝,但仅从长度上看,它是有效的。)
添加大写字母可以使密码缩短一个字符,例如 pAssword 。在那里输入一个数字,你可以将密码缩减到六个: pAssw0 。六个字符,每个字符加一个学分,包括小写、大写和数字字符。请记住,如果不重新编译,pam_pwquality将不接受少于六个字符的密码。
使用信用系统,不想混合字符的用户不必这样做。一个简单的八个字符的小写密码就足够了。
使用信用时,dcredit 、ucredit 、lcredit 和 ocredit 选项仍然分别适用于数字、大写、小写和其他字符。然而,他们并没有定义密码所需的这些类别的最小字符数,而是通过信用来定义用户包含该类型字符可以获得的最大信用数。将ocredit设置为3意味着用户在密码中包含非字母数字字符最多可以获得三个学分。每个默认值为1。
考虑这些 /etc/security/pwquality.conf 设置:
xxxxxxxxxx
minlen=16
ocredit=3
lcredit=0
密码的最小长度为16个字符。用户使用小写字符不会获得额外学分,但非字母数字字符最多可以获得三个学分。大写字符或数字没有特殊设置,因此它们各给一个信用。
首席执行官试图使用 passwordpassword 。仅就长度而言,就已经过去了——16个字符。添加一个大写字母会让她获得一个字符的信用,让她将密码修改为 passworDpasswor 。一个数字表示她多了一个字符,将其减少到14: passw0rDpassw0 。是的,有两个数字,但数字信用上限为一。不过,她非字母数字字符最多可以获得三个学分。所以 passw0rD!@# 只有11个字符,但加上信用,得分长度为16。
创建复杂密码的用户会获得更短的密码奖励。
无论您是定义需求还是使用信用,这些选项都适用。
difok 选项设置新密码中新字符的最小数量。默认值为5。新密码必须至少包含五个旧密码中没有的字符。如果你需要长密码,请增加密码。
maxrepeat 选项设置一个字符在一行中可以重复的最大次数。默认值为0,禁用检查。将此设置为1不允许连续两次使用相同的字符。
使用 maxclassrepeat ,您可以限制特定类的字符一起出现的数量。它通常设置为0,禁用检查。如果将其设置为4,则不允许使用包含随机字符串(如 alqkn 或 81930 )的密码,因为它们的长度超过4。您可以使用所有这些字符,但您必须将它们与在中间的其他字符类分开。
maxsequence 选项设置递增或递减序列的最大长度,如 abcde 或 876543 。默认值为0,禁用此检查。
如果 gecoscheck 字段设置为0以外的任何数字,pam_pwquality会将密码与用户的 /etc/passwd 条目进行比较。匹配 /etc/passwd 中长度超过三个字符的任何单词都会使pam_pwquality拒绝密码。
badwords 选项可以设置为禁止在密码中出现的空格分隔的单词列表。如果您使用此选项,我强烈建议您使用配置文件,而不是在 /etc/pam.d 文件中输入整个列表。
最后,enforce_for_root 告诉pam_pwquality即使对 root 帐户也要施加限制。通常,如果 root 愿意,她可以将用户的密码分配给密码。
使用pam_pwquality和pam_passwdqc,您可以强制用户创建不那么糟糕的密码。不过,不要指望他们会感谢你。