【发布时间】: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