我正在尝试使用其余后端进行身份验证来设置Radius服务器。我以以下项目为例:https://github.com/fgsants/REST-API-FreeRADIUS
一切都已经设置好了,如果我使用以下命令模拟半径登录,一切都会正常工作
radtest bar passwd 127.0.0.1 10 testing123
其余后端先接收/user/:username/mac?action=authorize
,然后再接收/user/:username/mac?action=authenticate&password=passwd
。
当我将AP配置为使用此Radius服务器时,请求似乎与预期不同,并且身份验证失败。尝试通过AP登录时,这是radius服务器的输出:
(0) Received Access-Request Id 105 from 172.21.0.1:46358 to 172.21.0.3:1812 length 126
(0) User-Name = "bar"
(0) NAS-IP-Address = 192.168.0.21
(0) NAS-Identifier = "RalinkAP1"
(0) NAS-Port = 0
(0) Called-Station-Id = "1A-0D-2C-1B-49-11"
(0) Calling-Station-Id = "D4-9A-20-70-F4-0E"
(0) Framed-MTU = 1400
(0) NAS-Port-Type = Wireless-802.11
(0) EAP-Message = 0x0201000801626172
(0) Message-Authenticator = 0xbffda6639904c9026259be2a45b378c4
(0) # Executing section authorize from file /etc/freeradius/3.0/sites-enabled/default
(0) authorize {
rlm_rest (rest): Reserved connection (0)
(0) rest: Expanding URI components
(0) rest: EXPAND http://rest:3000
(0) rest: --> http://rest:3000
(0) rest: EXPAND /user/%{User-Name}/mac?action=authorize
(0) rest: --> /user/bar/mac?action=authorize
(0) rest: Sending HTTP GET to "http://rest:3000/user/bar/mac?action=authorize"
(0) rest: Processing response header
(0) rest: Status : 204 (No Content)
rlm_rest (rest): Released connection (0)
Need 5 more connections to reach 10 spares
rlm_rest (rest): Opening additional connection (5), 1 of 27 pending slots used
rlm_rest (rest): Connecting to "http://rest:3000"
(0) [rest] = ok
(0) if (ok) {
(0) if (ok) -> TRUE
(0) if (ok) {
(0) update control {
(0) Auth-Type := rest
(0) } # update control = noop
(0) } # if (ok) = noop
(0) } # authorize = ok
(0) Found Auth-Type = rest
(0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default
(0) Auth-Type rest {
(0) rest: ERROR: You set 'Auth-Type = REST' for a request that does not contain a User-Password attribute!
(0) [rest] = invalid
(0) } # Auth-Type rest = invalid
(0) Failed to authenticate the user
(0) Using Post-Auth-Type Reject
(0) Post-Auth-Type sub-section not found. Ignoring.
(0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default
(0) Delaying response for 1.000000 seconds
Waking up in 0.2 seconds.
Waking up in 0.7 seconds.
(0) (0) Discarding duplicate request from client ipv4 port 46358 - ID: 105 due to delayed response
(0) Sending delayed response
(0) Sent Access-Reject Id 105 from 172.21.0.3:1812 to 172.21.0.1:46358 length 20
Waking up in 3.9 seconds.
(0) Cleaning up request packet ID 105 with timestamp +15
Ready to process requests
半径服务器似乎没有从AP接收密码:
(0) User-Name = "bar"
(0) NAS-IP-Address = 192.168.0.21
(0) NAS-Identifier = "RalinkAP1"
(0) NAS-Port = 0
(0) Called-Station-Id = "1A-0D-2C-1B-49-11"
(0) Calling-Station-Id = "D4-9A-20-70-F4-0E"
(0) Framed-MTU = 1400
(0) NAS-Port-Type = Wireless-802.11
(0) EAP-Message = 0x0201000801626172
(0) Message-Authenticator = 0xbffda6639904c9026259be2a45b378c4
所以以后授权失败:
(0) rest: ERROR: You set 'Auth-Type = REST' for a request that does not contain a User-Password attribute!
这是我的配置文件:
server default {
listen {
type = auth
ipaddr = *
port = 0
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
listen {
ipaddr = *
port = 0
type = acct
limit {
}
}
authorize {
rest
if (ok) {
update control {
Auth-Type := rest
}
}
}
authenticate {
Auth-Type rest {
rest {
updated = 1
}
if (updated) {
ok
}
}
}
preacct {
preprocess
acct_unique
suffix
}
accounting {
detail
rest
}
post-auth {
update {
&reply: += &session-state:
}
}
}
缺少什么?需要做些什么才能使我可以从访问点接收密码?
谢谢
答案 0 :(得分:1)
我花了很多时间,试图弄清楚,作为我的新手,这件事对于Freeradius应该是如何工作的。我还使用了nodejs rest api,并且能够通过第二种方法成功,但是为了做到这一点,我必须在内部隧道文件内添加一些位,如下所示:
authorize {
update control {
MS-CHAP-Use-NTLM-Auth := No
}
rest
inner-eap
}
authenticate {
inner-eap
Auth-Type PAP {
pap
}
Auth-Type MS-CHAP {
mschap
}
}
答案 1 :(得分:0)
FreeRADIUS模块具有多种“方法”,每种方法都处理RADIUS数据包的不同方面。
当授权部分中列出模块时,将调用“授权”方法。 authorize方法用于收集其他信息以授权用户。
当authenticate部分中列出某个模块,并且authorize部分中的模块指定通过设置control:Auth-Type = <module>
使用此特定模块来验证用户身份时,将调用'authenticate'方法。
通常有两种方法可以验证用户身份:
rest.authenticate
)。rest.authorize
)。您需要确定将使用哪种方法。
如果采用方法1,则用户需要以纯文本形式发送密码,以便可以将其提交给身份验证服务器。
如果采用第2种方法,则需要从另一台服务器以纯文本格式检索用户密码的副本。
两种方法都有优点和缺点,选择哪种方法会影响您可以使用哪些EAP(可扩展身份验证协议)方法。
在您的示例中,您使用的是WPA / 2-Enterprise,在这种情况下,在AP和无线客户端之间运行的身份验证框架将是802.1X。
使用802.1X,AP和无线客户端通过称为EAPOL(局域网上的EAPOL)的协议交换身份验证数据包。 802.1X和EAPOL允许无线客户端在交换加密密钥(WPA四次握手)之前以及无线客户端可以交换常规(非EAPOL)数据包之前,将凭据提交到身份验证服务器(通常为RADIUS服务器)与AP(例如DHCP数据包)。
通过无线身份验证,EAPOL和RADIUS主要充当EAP的传输,并在身份验证尝试期间承载用户凭据的EAP。
当接入点转发RADIUS数据包中的EAP数据时,它将EAP数据包拆分为253字节的块并将这些块封装在EAP-Message属性中。
当FreeRADIUS扮演身份验证服务器的角色时,它需要重新组装这253个字节的块并运行与无线客户端协商的任何EAP方法的状态机。
为简化编写处理EAP身份验证的配置,FreeRADIUS使用了两个虚拟服务器。 “外部”服务器处理身份验证尝试的RADIUS部分,“内部”服务器处理身份验证尝试的EAP部分。
除非您要实施复杂的策略,否则外部服务器需要调用的唯一模块是“ eap”。
在您的配置中,从“授权”和“认证”部分中删除所有内容,仅保留eap模块:
authorize {
eap
}
authenticate {
eap
}
在授权部分中调用eap模块时,eap模块检查请求中是否存在一个或多个EAP-Message属性,并且它们设置control:Auth-Type = EAP
,以便在身份验证部分也很有效。
在authenticate部分中调用eap模块时,eap模块将所有EAP-Message属性重新组合到单个数据包中,并运行EAP状态机,视情况调用EAP子模块以运行不同的EAP方法。 / p>
哪种EAP方法首先运行由default_eap_type
中的raddb/mods-available/eap
确定。
如果您使用的是方法1(用户提交纯文本凭据),则需要使用EAP-TTLS之类的EAP方法,该方法会将纯文本凭据包装在TLS包装器中(以防止它们被获取)。
如果要使用方法1,请设置default_eap_type = ttls
。
如果使用方法2(外部服务器提供纯文本凭据),则可以使用更多的EAP方法。 PEAP(受保护的EAP)是在消费类设备(电话,笔记本电脑,VoIP电话等)中实现最广泛的EAP方法。像TTLS一样,PEAP使用TLS包装器来保护凭据交换,但不是明文发送用户密码,而是使用MSCHAPv2进行凭据交换,这意味着凭据绝不会以明文形式通过网络发送。
实际上,由于MSCHAPv2被认为已损坏,因此MSCHAPv2仅提供了比TTLS有限的额外保护,但是如果您的旧客户端运行Windows 7,则可能要使用PEAP,因为仅在Windows 8中添加了EAP-TTLS支持。
如果要使用方法2,请设置default_eap_type = peap
。
用于基于TLS的EAP方法(例如TTLS和PEAP)的FreeRADIUS子模块通过单独的“内部”虚拟服务器运行综合请求(内部生成)。
此请求的目的是表示TLS包装程序的解密和解码内容,并使该内容对其他模块(例如rest,ldap,pap等)可用,它们可以解释这些格式
在名为sites-available/inner-tunnel
的默认配置中包含一个内部虚拟服务器示例。该虚拟服务器被配置为默认EAP模块中的默认服务器,您应该对其进行修改以设置如何验证用户凭据的虚拟服务器。
EAP-TTLS实际上可以运行许多不同的内部身份验证方法,甚至可以运行EAP的另一层。这是因为EAP-TTLS允许RADIUS属性空间中的多个属性在其TLS包装器中发送。
但是,一般而言,大多数请求者默认将运行PAP作为内部身份验证方法,因此,当您看到综合请求发送到内部虚拟服务器时,它将仅包含User-Name
和{ {1}}个属性。
删除User-Password
的“授权和身份验证”部分中的所有现有文本。
要么将原始示例中的文本复制到“授权和身份验证”部分中,要么...我不确定您是否需要两次调用REST模块(坦白地说,自从我从事v3以来已经很长时间了),可能想尝试:
sites-available/inner-tunnel
对于PEAP,TLS包装器内容表示另一个“内部” EAP对话。要处理此对话,我们需要首先获取用户的密码,然后调用inner-eap模块。
注意:inner-eap是EAP模块的另一个实例,但是仅启用了适合在另一个EAP对话中使用的EAP方法。 inner-eap应该在authorize {
if (&User-Password) {
update control {
Auth-Type = rest
}
}
}
authenticate {
rest {
update = 1
}
if (update) {
ok
}
}
中可用,您可能需要将此文件从mods-available/eap_inner
链接到mods-available
。
删除mods-enabled
的“授权和身份验证”部分中的所有现有文本。
在“授权”部分中列出其余模块,然后列出“ inner-eap”模块:
sites-available/inner-tunnel
当您的API端点收到请求时,您需要返回一个authorize {
rest
inner-eap
}
属性以及用户的明文密码。
在“身份验证”部分中,仅列出内eap模块:
control:Cleartext-Password