我正在研究如何将 PAM 模块设计为我自己的 JAAS LoginModule 的指南。令我惊讶的一件事是,尽管用于访问散列密码的方法大多与散列方法本身正交,但我无法找到任何可以充分利用此属性的 PAM 模块。是因为我忽略了一些安全问题,还是只是一些尚未探索的问题?
为了进一步解释我的意思,假设我们有 3 种不同的方法来访问散列密码(LDAP、SQL、普通文件)和 2 种散列方法(MD5、SHA1)。目前,每种访问方法都有一个或多个 PAM 模块,每个模块都实现一种或多种这些散列方法。添加新的哈希方法(比如 BCrypt)意味着所有这些访问方法都需要修改以支持新的哈希类型。更好的设计是为每种访问方法使用一个 PAM 模块,使用用户名简单地检索散列密码,然后使用一组单独的 PAM 模块进行散列验证,并在模块之间共享散列值(如密码是)。因此,如果我使用数据库存储密码,并使用 MD5 验证密码,我的配置将如下所示:
password required pam_sql.so
password required pam_md5.so
在此配置中,pam_sql 从数据库中检索散列密码(如果用户名不存在,则失败)。然后 pam_md5 将散列密码与要测试的密码进行比较,如果不匹配则失败。在使用 Bcrypt 的不同配置中,我只需将 pam_md5 替换为 pam_bcrypt,而无需等待 pam_sql 的开发人员将其更新为新的哈希方法。