【问题标题】:Doing 2FA via Freeradius with our own 2FA app使用我们自己的 2FA 应用程序通过 Freeradius 进行 2FA
【发布时间】:2020-07-17 01:31:06
【问题描述】:

一些数据优先:

  • Freeradius v3.0.17
  • 作为 LDAP 的 Active Directory
  • 自行开发的OTP应用

我们想要通过 Freeradius 实现 2FA。我们正在对 MS AD 使用 ntlm_auth 身份验证,另一方面,我们有自己的 OTP 脚本(这在另一个解决方案中工作)。 起初我们有一个拆分 USER 和 Token 的策略,像这样 --> username:OTP。这是有效的。 此过程在默认站点的授权部分顶部调用

on policy.d/pol_usernamemultiotp.authorize:

pol_usernamemultiotp.authorize {
if ( &User-Name =~ /^(.*):([0-9]{6})$/) {
                update request {
                        Stripped-User-Name := "%{1}"
                        User-OTP := "%{2}"
                }
        }
}

ntlm_auth 工作正常。 当我们在 Default 的授权部分添加下一个代码时,身份验证会跳转到 Auth-Type := LDAP 并且不会通过 ntlm_auth。

    update control {
          Auth-Type := `/bin/bash /etc/freeradius/3.0/otpIB.sh '%{Stripped-User-Name}' '%{User-OTP}' '%{Client-IP-Address}'`
   }

   (this script returns "Accept" or "Reject" depending if the OTP is correct.)

我们还尝试将此更新控件放在默认的 Post-Auth 部分。但是,这就是问题所在。让我们向您展示 de Freeradius -X 日志

(0) mschap: Program returned code (0) and output 'NT_KEY: C1964544A5B93877F0D3FE7D9E5791D0'
(0) mschap: Adding MS-CHAPv2 MPPE keys
(0)     [mschap] = ok
(0)   } # authenticate = ok
(0) # Executing section post-auth from file /etc/freeradius/3.0/sites-enabled/default
(0)   post-auth {
(0)     update control {
(0)       Executing: /bin/bash /etc/freeradius/3.0/otpIB.sh '%{Stripped-User-Name}' '%{User-OTP}' '%{Client-IP-Address}':
(0)       EXPAND %{Stripped-User-Name}
(0)          --> fdelfranco
(0)       EXPAND %{User-OTP}
(0)          --> 770355
(0)       EXPAND %{Client-IP-Address}
(0)          --> 10.40.9.3
(0)       Program returned code (0) and output 'Reject'
(0)       Auth-Type := Reject
(0)     } # update control = noop
(0)     update {
(0)       No attributes updated
(0)     } # update = noop
(0)     policy remove_reply_message_if_eap {
(0)       if (&reply:EAP-Message && &reply:Reply-Message) {
(0)       if (&reply:EAP-Message && &reply:Reply-Message)  -> FALSE
(0)       else {
(0)         [noop] = noop
(0)       } # else = noop
(0)     } # policy remove_reply_message_if_eap = noop
(0)   } # post-auth = noop
(0) Sent Access-Accept Id 195 from 10.40.9.99:1812 to 10.40.9.3:21481 length 0
(0)   MS-CHAP2-Success 0xf9533d36433832463034413330323043344533314246333736383533364234324641453142383843383145
(0)   MS-MPPE-Recv-Key = 0x66e467b713b84475fa5ed19d93207ef3
(0)   MS-MPPE-Send-Key = 0x75f6cbee712186fe6ebeca98ea9ab063
(0)   MS-MPPE-Encryption-Policy = Encryption-Allowed
(0)   MS-MPPE-Encryption-Types = RC4-40or128-bit-Allowed
(0) Finished request

NTLM_AUTH 完美运行并提供访问接受,完全忽略脚本和 Auth-Type := 返回的拒绝!

为什么Radius会忽略脚本中的“拒绝”状态并授权用户??

有什么建议吗?

编辑:

今天,我们设法让这个东西在没有挑战的情况下工作,但工作正常。我们创建了某种新的身份验证类型,并将策略放在那里,当我们进行授权部分时,它会在默认文件的身份验证部分中调用此伪身份验证类型,然后在它调用我们的我们自己的策略,我们已经指出了我们自己的 shell 脚本,可以正确地进行一次性密码验证。

它与 Cisco VPN 客户端、Forti 客户端和用于 IPSEC 的 Mac OS 本机客户端配合得很好。

【问题讨论】:

    标签: freeradius one-time-password two-factor-authentication


    【解决方案1】:

    Auth-Type 必须设置为 reply,而不是 control

    【讨论】:

    • 谢谢伙计,但确实我们得到了我们想要的工作。不过谢谢你的回复。也许它可以帮助别人。
    • 原生windows客户端支持2fa吗?
    • 我真的不知道!我们在 Windows 上尝试此操作,但使用 Cisco VPN Client 并为 2FA 使用分隔符,它可以工作!在带有本机 VPN 配置的 Mac OS X 中,它也可以工作。所以我认为在 Windows 中它可能会起作用!不要忘记我们做了一些修改,它不是很标准所以......
    • 我也制作了不标准的东西,使用自定义半径服务器(不是 freeradius),将检查 cisco 客户端支持。本地客户端有时很愚蠢...
    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 2023-03-08
    • 1970-01-01
    • 2019-05-02
    • 2019-02-04
    • 1970-01-01
    • 2019-01-01
    • 2018-04-26
    相关资源
    最近更新 更多