我已经设置了 FreeRADIUS、PAM 和 Google Authtenicator。FreeRADIUS 调用 PAM,PAM 又调用 Google pam_google_authenticator.so 库。一切顺利。
但是,这并不是真正的双因素身份验证,因为只需要 Google App 中的 OTP。要获得两个 2FA,我想使用本地 Linux 密码。由于这是通过 RADIUS 进行的,因此我无法提示输入两个密码,而需要将它们合并为一个。根据 Google Auth README 和我发现的各种博客,我应该在 PAM 中执行此操作:
auth requisite pam_google_authenticator.so forward_pass
auth required pam_unix.so use_first_pass
然后我可以在同一提示符下输入密码和 OTP,例如 MyPass123456
但它从来都不起作用。通过调试,我可以看到 pam_unix.so 检查并接受了用户的密码,但还是失败了。如果我删除第二行,或者将“auth”更改为“account”(我发现的一个建议),auth 可以工作,但本地密码会被忽略。
我的 PAM 配置中是否缺少了某些内容?
答案1
通过谷歌搜索,我发现https://bugs.launchpad.net/percona-server/+bug/1274821描述了类似的问题。如那里所记录的,这有效:
auth requisite pam_google_authenticator.so forward_pass
auth required pam_unix.so use_first_pass
account required pam_unix.so audit
account required pam_permit.so
尽管为什么这样做对我来说仍然是个谜,因为 MySQL 问题是关于以非 root 身份使用 PAM,并且我已将 FreeRADIUS 设置为以 root 身份运行。
答案2
如果您将“auth”更改为“account”,则 pam_unix 不再用于身份验证。
你是什么意思
pam_unix.so 检查并接受用户的密码,但仍然失败
您为这项服务配置的 pam 是什么样子的?由于“必需”意味着堆栈会一直处理到最后,所以它可能会中断后pam_unix。
您可能还会考虑使用另一个双因素身份验证后端,它可以自行处理这两个因素...... https://www.howtoforge.com/two-factor-authentication-with-otp-using-privacyidea-and-freeradius-on-centos
答案3
尝试以下配置:
身份验证必备 pam_google_authenticator.so forward_pass 身份验证充分 pam_unix.so use_first_pass
auth
但是,如果没有看到pam 配置文件中的所有条目,真的很难说。
答案4
您能提供整个 pam 配置文件吗?如果您在 pam_unix.so 之后使用 pam_deny.so,则必须将配置更改为:
auth [success=1 default=ignore] pam_unix.so use_first_pass
它指定如果模块返回成功则必须跳过下一行。
身份验证的完整配置:
auth requisite pam_google_authenticator.so forward_pass
auth [success=1 default=ignore] pam_unix.so use_first_pass
auth requisite pam_deny.so
auth required pam_permit.so
首先,pam_google_authenticator 模块提取 TOTP 并进行验证。
其次,pam_unix 模块验证密码,如果成功则跳过第三行。