传统上,当客户端登录时,它会发送凭证(用户名+密码)而不进行任何进一步处理。然后,服务器检查其用户数据库中是否存在与提供的凭证匹配的条目。
为了在数据库被泄露时使密码恢复更加困难,密码以哈希形式存储。这意味着客户端或服务器对密码进行哈希处理,然后检查凭证是否匹配。
但是,如果客户端进行哈希处理,它实际上就变得毫无用处了。为什么?因为哈希密码现在被用作密码。有人可以窃取数据库,读取哈希并将其与用户名一起发送,并且仍然获得访问权限。
这就是为什么必须在服务器上进行散列的原因,这样如果事先不知道密码就不可能登录。
但是,我找不到任何使用 PAM 模块来实现这一点的方法,以便 vsftpd 使用它进行登录。请注意,我不想使用普通的哈希函数,因为它们不适合密码。我需要使用 KDF,例如 scrypt 或 bcrypt。
我是否必须编写自己的 PAM 模块或是否必须根据需要生成 htpasswd 哈希?
tl;dr 如何使用 vsftpd 的服务器端密码哈希执行用户身份验证?
答案1
crypt()
PAM 使用的可能仅支持 BCRYPT 而不支持 SCRYPT(或两者都不支持)。在所有情况下,您只需要在编码密码时设置方法,而不是在检查密码时设置方法。
由于 vsftp 使用系统密码文件,因此您需要重新配置 PAM 以使用 BCRYPT。这取决于实际使用的 unix/linux。只要您的 passwd 文件包含$2y$
带前缀的密码哈希(您可以使用最近的密码htpasswd -B
哈希生成它们),您就大功告成了。
一些 Linux 支持authconfig --passalgo=blowfish --update
其他,您需要找到正确的 PAM 配置文件并将 blowfish 添加到密码行:
password sufficient /lib/security/pam_unix.so nullok use_authok blowfish shadow