通过 freeRADIUS 进行 2FA,忽略密码

通过 freeRADIUS 进行 2FA,忽略密码

我的任务是设置 freeRADIUS 来提示用户输入他们的第二个身份验证因素(例如 Google Authenticator OTP),但不先检查用户的密码。

我完全是盲人,之前没有 RADIUS 经验。我们有一个 Web 应用程序,提示用户登录,因此密码验证已经完成。然后,我们需要提示用户输入第二个身份验证因素才能执行某些操作。我们不想反复要求用户输入密码(显然,在本地缓存密码是不行的),所以我们想做的是以某种方式配置 freeRADIUS,以便它能够:

  • 忽略我们在初始请求中传递的密码值
  • 返回质询响应,提示用户输入第二个身份验证因素(例如 OTP)

这可行吗?正如我所说,我之前没有任何 RADIUS 经验,所以如果这是一个愚蠢的问题,请原谅。

答案1

我自己解决了这个问题。如果有人感兴趣的话,这与 /etc/pam.d/radiusd 中的配置有关

首先,按照以下教程之一将 Google Authenticator 设置为 freeRADIUS 服务器上的第二个因素:
https://networkjutsu.com/freeradius-google-authenticator/ https://www.supertechguy.com/help/security/freeradius-google-auth/

当需要对 /etc/pam.d/radiusd 进行更改时,请使用以下配置之一:

  1. 提示输入密码和 Google Auth OTP:

    身份验证必备 pam_google_authenticator.so forward_pass身份
    验证必需 pam_unix.so use_first_pass
    帐户必需 pam_unix.so 审计
    帐户必需 pam_permit.so

  2. 仅提示输入 Google Auth OTP(即无需密码):

    身份验证需要 pam_google_authenticator.so
    帐户需要 pam_unix.so 审计
    帐户需要 pam_permit.so

请注意,这不会发送质询响应 - 它只是意味着首先不需要输入密码。

答案2

Radius 是一种网络身份验证/授权/记帐协议。它在 OSI 模型的第 3 层运行。

您的 Web 应用程序在第 7 层运行。

所以这里有点不匹配。您可能使用 Radius 来验证网络连接(例如 WiFi 或网络端口),但您的 Web 应用程序需要基于 http 的东西。

我做了一些假设,但听起来好像您有一个 Radius 服务器用于对网络上的用户进行身份验证,并且利用相同的用户数据库对 Web 应用程序中的用户进行身份验证。无论 Web 应用程序是否使用 Radius 协议对用户进行身份验证,您的用户在网页中输入用户名和密码时都不会使用 Radius,因此 Radius 不会帮助您完成此操作 - 它需要在 Web 应用程序中完成。

如果您的 Web 应用程序可以访问 Radius 服务器,则可能可以确定哪个用户已通过身份验证,并据此授权/OTP 提示,但这是 Web 应用程序逻辑。FreeRadius 中的任何配置都无法为您实现这一点。

因此,我建议你退一步考虑一下你的用户数据存储在哪里。虽然你可能正在针对 freeRadius 服务器进行身份验证,但 Radius 只是一个协议,后端有一个用户数据库。这可能是 LDAP 服务器、SQL 数据库、pam 或只是一个纯文本文件。

假设您有一个通用的用户数据库,那么您可以将某种 Oauth/SAML 单点登录应用程序(Okta 和 PingID 是一些商业示例)添加到每个服务的身份验证流程中,以便在一个地方的登录会在另一个地方生效。有了 SSO,您可以修改 Web 应用程序以在某些时候要求第二个因素(它必须知道用户现有的 OTP 密钥,或者您可以要求他们为此目的设置另一个密钥),或者您可以使用某种策略并重新进行身份验证(如果您使用的 SSO 技术支持的话)。

总之,我看不出单独使用 freeRadius 就能做到这一点,即使你能做到,你也不应该这么做。而且,要完成授权部分,你总是需要修改应用程序,除非你实施一些可怕的中间人代理,这会完全危及安全。

相关内容