ITPub博客

首页 > Linux操作系统 > Linux操作系统 > linux操作系统用户密码过期问题

linux操作系统用户密码过期问题

翻译 Linux操作系统 作者:yaxian68 时间:2020-09-29 09:33:20 0 删除 编辑

       翻译原文: http://www.deer-run.com/~hal/sysadmin/pam_cracklib.html

  标准的Unix可重用密码并不是一个好的身份验证系统。但是,对于大多数企业而言,与迁移到备用身份验证系统(例如两因素令牌身份验证或基于智能卡的系统)相关的成本过高。因此,网站通常会保留其供应商提供的“最低公分母”选项。

  为了提高标准可重用密码的安全性,“最佳做法”告诉我们要求用户定期更改其密码,对新密码强制使用最小长度和良好的“规则”(例如要求使用大小写混合且非字母数字)字符),甚至保留以前用户密码的“历史记录”,这样用户就不会“重复”。有趣的是,Unix系统在提供此功能方面通常落后于其他操作系统,尤其是在涉及需要强密码的基于规则的系统以及保持密码历史记录的功能方面。为了解决此缺点,为Linux系统开发了PAM模块pam_cracklib。

  我承认,在最长的时间里,我认为pam_cracklib几乎没有用。但事实证明,这并非没有用,只是文献记载不充分。为了纠正此问题,我将根据对现有文档的研究,以下内容提供以下文章:pam_cracklib 源代码(如有疑问,请阅读源代码)以及值得信赖的Knoppix(Debian)GNU / Linux系统。

  启用pam_cracklib

  该pam_cracklib 模块通过系统标准的PAM配置界面中启用。在Debian系统上,这是/etc/pam.d/common-password 文件(但是 在RedHat派生的系统上是/etc/pam.d/system-auth,我们不能都相处吗?)。典型的配置如下所示:

  需要密码pam_cracklib.so retry = 3 minlen = 6 difok = 3

  需要密码pam_unix.so md5 use_authtok

  第一行启用pam_cracklib 模块并设置几个模块参数。“ retry = 3 ”表示在passwd 程序中止之前,用户有三次机会选择一个好的密码。用户始终可以重新运行passwd 程序,然后重新开始。“ minlen = 6 ”设置密码中的最小字符数。实际上,由于Linux系统通常使用MD5密码哈希(不限于8个字符的密码,例如旧的DES56哈希),因此您可能需要考虑将“ minlen ”参数增加一些。我们将在本文的稍后部分回到这个概念。“ difok = 3”设置必须与以前的密码不同的最小字符数。如果增加“ minlen ”,则可能还希望增加该值。

  第二行调用标准的pam_unix模块。这里的“ md5 ”参数是启用标准Linux MD5密码哈希值的因素,尽管您可以选择使用旧式DES56哈希值来与旧版Unix系统向后兼容。“ use_authtok ”告诉pam_unix不要打扰自己的内部密码检查,该检查会重复pam_cracklib中的许多检查,而是接受pam_cracklib彻底检查后用户输入的密码。

  简单检查

  默认情况下,pam_cracklib 对新密码执行许多基本检查:

  新密码是旧密码又是字母反转(“ password”与“ drowssap”)还是旋转(“ password”与“ asswordp”)?

  新密码是否仅因大小写不同而与旧密码不同(“密码”与“密码”)?

  新密码中是否至少有一些最小字符数不包含在旧密码中?这是“ difok ”参数起作用的地方。

  如果打开“ obscure ”标志,则与在pam_unix模块中获得的检查是相同的,但是由于我们已经在使用pam_cracklib ,因此不需要这样做。

  长度和强度

  虽然“ minlen ”参数控制密码的最小长度,但是事情并不像看起来的那么简单。这是因为pam_cracklib 结合了密码长度和密码“强度”(使用大小写和非字母字符)的概念。

  “ minlen ”实际上是由所有小写字母组成的密码所需的最小长度。但是,由于使用大小写字母,数字和非字母数字字符,用户获得了“长度积分”。默认情况下,通常每种类型的字符您最多只能获得“ 1个积分”。因此,如果管理员设置“ minlen = 12”,则用户使用所有四种类型的字符时仍可以使用8个字符的密码。实际上,由于使用小写字母会获得信誉,因此所有小写密码的实际最小长度为minlen-1。

  实际上,可以自定义任何特定类别的字符的最大信用额度。四个参数“ lcredit ”,“ ucredit ”,“ dcredit ”和“ ocredit ”分别用于设置小写,大写,数字(数字)和非字母数字(其他)字符的最大信用额。 。例如,您可以 在/etc/pam.d/common-password 文件的pam_cracklib行上添加以下参数:

  lcredit = 0 ucredit = 1 dcredit = 1 ocredit = 2

  换句话说,小写字符根本不是特殊字符,因此您在这里不会获得任何荣誉。另一方面,如果用户在密码中输入两个或多个非字母数字字符,我们会给予额外的荣誉。还有一点是大写字符和数字的最高信用。请注意,无论您将“ minlen ”设置为什么,以及给用户提供多少“信用”,pam_cracklib都绝不会让用户选择少于六个字符的密码-这是一个硬编码的内部最小值。

  请注意,您也可以对“ lcredit ”,“ ucredit ”,“ dcredit ”和“ ocredit ”使用负值。负值迫使用户使用一定数量的每种类型的字符。例如,“ ocredit = -2 ”将要求所有用户的密码中至少包含两个非字母数字字符。

  使用这些值并找到对您的站点有意义的内容,但是作为起点,对于使用MD5密码哈希的计算机,我可能会建议“ minlen = 13 difok = 4 ”。这意味着用户可以拥有的最小密码是9个字符,并且仅在他们使用所有四个字符集的情况下。许多密码破解工具不会尝试计算长度超过8个字符的字符串。

  字典检查

  pam_cracklib 还会根据用户自己的容易猜到的密码的内部字典来检查用户的密码。在Debian系统上,pam_cracklib的字典存在于/ var / cache / cracklib中 ,并由

  / usr / sbin / update-cracklib 脚本每晚重建一次。其他Linux发行版可能具有其他更新字典的机制(据我所知,RedHat不提供任何用于执行此操作的工具)。

  该更新Cracklib的 脚本搜索了一些输入文件,包括目录的/ usr /本地/字典和在/ usr / local / share下/字典。因此,添加您自己的单词就像将它们放在这些目录之一中的文件中并运行update-cracklib或等待cron为您完成操作一样容易。请注意,如果要将其他目录添加到update-cracklib的搜索路径,则可以通过修改/etc/cracklib/cracklib.conf 文件(至少在Debian系统上)来实现。

  密码“历史”

  pam_cracklib 能够查询用户的密码“历史”,并且不允许他们重复使用旧密码。但是,可以通过pam_unix 模块启用实际存储用户旧密码的功能。

  第一步是确保创建一个空的/ etc / security / opasswd文件来存储旧的用户密码。如果您在启用PAM配置文件中的历史记录功能之前忘记执行此操作,则所有用户密码更新都会失败, 因为pam_unix模块将由于缺少该文件而不断从密码历史记录代码中返回错误。

  将opasswd 文件与/ etc / shadow文件一样对待,因为它最终将包含用户密码哈希(尽管不再使用的旧用户密码):

  触摸/ etc / security / opasswd

  chown root:root / etc / security / opasswd

  chmod 600 / etc / security / opasswd

  一旦你得到了opasswd 文件中设置,通过添加选项启用密码历史检查“记得= <X> ”到 了pam_unix在配置行/etc/pam.d/common-password 文件。这是我在Knoppix机器上设置的方法:

  需要密码pam_cracklib.so retry = 3 minlen = 12 difok = 4

  需要密码pam_unix.so md5记住= 12 use_authtok

  “记住”参数的值是您要为用户存储的旧密码数。事实证明,内部最多有400个以前的密码,因此,高于400的值都等于400。在抱怨此限制之前,请考虑一下,即使您的网站强迫用户每30天更改一次密码,也代表400个以前的密码超过 30年的密码历史记录。即使对于最旧的旧系统,这也足够了。

  启用密码历史记录后,opasswd文件将开始填充如下所示的用户条目:

  hal:1000:<n> :<hash1> ,<hash2> ,...,<hashn>

  前两个字段是用户名和用户ID。 第三个字段中的<n>表示当前为用户存储的旧密码的数量-每次将新的哈希添加到用户的密码历史记录中时,此值都会增加一个,直到<n>最终等于密码的值为止。在pam_unix 配置行上设置的“记住”参数。 <hash1>,<hash2>,...,<hashn> 实际上是用户旧密码的MD5密码哈希。

  密码过期

  此时,您可能想知道如何使系统在一段时间后自动强制用户更改密码。这实际上不是pam_cracklib的工作。相反,这些参数 在大多数Linux系统上的/etc/login.defs文件中设置。 PASS_MAX_DAYS 是用户必须更改密码的频率。 PASS_MIN_DAYS是在允许用户再次更改新密码之前,用户被迫使用新密码保留多长时间。 PASS_WARN_AGE是在密码到期日期之前警告用户其密码即将到期的天数。这些参数的值选择完全取决于站点策略。

  请注意,这些参数仅适用于使用默认系统useradd 程序创建的新帐户。如果您使用其他机制在系统上创建帐户,则必须使用chage 命令(这不是输入错误)才能在用户帐户上手动设置这些参数。而且,如果您使用诸如LDAP或NIS之类的命名服务进行帐户管理,那么您将完全依靠自己。

  顺便说一句,如果您曾经想知道/ etc / shadow文件中所有这些额外的字段是做什么的,那么答案是它们存储了用户的密码到期/年龄信息。

  结论

  希望本文能阐明pam_cracklib的功能和一般的Linux密码系统的一些更神秘的角落。如果pam_cracklib似乎比您的特定操作系统的变体密码强制执行程序的限制,考虑到某些类Unix操作系统(如Solaris -至少通过的Solaris 9)没有任何这种类型的功能,比其他标准密码过期/老化例程。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69920900/viewspace-2724950/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-03-08

  • 博文量
    11
  • 访问量
    3334