我目前在一个问题上停留了相当长一段时间。我们有一个 freeradius 服务器,可以处理来自计算机的 eap_tls 请求和电话的 mab 身份验证。为了实现这一目标,我们创建了一个主服务器(sites-enabled/freerad)。它工作正常并能够正确验证用户身份,但我们想要详细记录信息,这就是问题开始的地方。
您会看到,记录访问接受请求很简单,因为只有一种方法可以成功验证用户身份,但是有不止一种方法可以拒绝它们(我们有证书黑名单、正则表达式匹配、Idap 身份验证以及在同一请求中使用的其他内容) )。我们想知道用户被拒绝的确切原因。
我计划的方法是根据拒绝用户的内容将属性的值 (control:Tmp- String-1) 设置为消息。该属性的值在虚拟服务器 (sites-enabled/check-eap-tls) 中给出,它本身由 eap 模块调用作为 tls 虚拟服务器(我们希望它只处理一次请求)。然后,我们的 linelog 模块应该获取该值并使用它来形成日志,从而将失败的确切原因传输到日志中。
日志行模块在该属性中找不到任何值。此外,主服务器也没有找到任何内容。我测试了在主服务器的授权部分设置属性,它确实有效,但是我无法根据拒绝的确切原因设置错误消息,因为这个原因是在 check-eap-tls 服务器中定义的。避免这种情况的一种方法是将属性从虚拟服务器 check-eap-tls 传递到主服务器。我在网上查了一下,找不到任何相关信息,因此请求您的帮助。
这是我的主服务器的配置:
listen {
type = "auth"
ipaddr = 192.168.64.164
port = 1819
}
authorize {
rewrite_calling_station_id_dot
if ( &User-Name == "bob") {
update control {
&Auth-Type := eap
}
}
else {
ldap-phone
if (ok) {
update control {
&Tmp-String-0 = "ok"
}
}
elsif (notfound) {
update control {
&Tmp-String-0 = "notfound"
}
}
else {
update control {
&Tmp-String-0 = "fail"
}
}
update control {
&Auth-Type := ldap-phone
}
}
}
authenticate {
Auth-Type eap {
eap
}
Auth-Type ldap-phone {
if (&control:Tmp-String-0 == "ok") {
update reply {
&cisco-avpair := "device-traffic-class=voice"
}
accept
}
elsif (&control:Tmp-String-0 == "notfound") {
update control {
&Tmp-String-1 := "Invalid User"
}
reject
}
else {
update control {
&Tmp-String-1 := "Error ldap-phone module Failed"
}
reject
}
}
}
post-auth {
Post-Auth-Type Reject {
update reply {
&Tunnel-Private-Group-Id := 105
&Tunnel-Type := 13
&Tunnel-Medium-Type := 6
}
auth_log
linelog_access
remove_reply_message_if_eap
}
Post-Auth-Type Accept {
update control {
&Tmp-String-1 := "Login OK"
}
auth_log
linelog_access
remove_reply_message_if_eap
}
auth_log
linelog_access
remove_reply_message_if_eap
}
}
以下是由 eap 模块作为 tls 服务器启动的 check-eap-tls 虚拟服务器的配置:
server check-eap-tls {
authorize {
#CHECK IF MATCH WITH BLACKLIST
CN-blacklist
if (ok) {
update control {
&Auth-Type := Reject
&Tmp-String-1 := "Invalid Certificate"
}
}
#CHECK IF MATCH WITH REGEXP
elsif !("%{TLS-Client-Cert-Common-Name}" =~ /^[A-z.]*@example\.org/) {
update control {
&Auth-Type := Reject
&Tmp-String-1 := "Invalid Certificate"
}
}
#CHECK IF MATCH WITH MAC
else {
ldap-vlan
if (updated) {
update control {
&Auth-Type := Accept
}
}
elsif (notfound) {
update control {
&Auth-Type := Reject
&Tmp-String-1 := "Invalid User"
}
}
else {
update control {
&Auth-Type := Reject
&Tmp-String-1 := "Error ldap-vlan module Failed"
}
}
}
}
post-auth {
update reply {
&Tunnel-Type := 13
&Tunnel-Medium-Type := 6
}
}
}
这是测试连接的调试输出。它是故意被拒绝的(证书已被列入黑名单)。请注意,这只是请求的最后一个数据包,因为它是这种情况下唯一重要的数据包:
注意:我无法发布完整的调试日志,无论哪种方式,这都表明 linelog 确实正在运行,只是没有获取属性的值并将其默认为“未知”字符串
(7) linelog_access: EXPAND messages.%{%{reply:Packet-Type}:-default}
(7) linelog_access: --> messages.Access-Reject
(7) linelog_access: EXPAND %t : Auth: (8 CHIFFRES) %{%{control:Tmp-String-1}:-unknown}: [%{%{User-Name}:-unknown}] (from client %{%{control:Client-Shortname}:-unknown} port %{%{NAS-Port}:-unknown} cli %{%{Calling-Station-Id}:-unknown})
(7) linelog_access: --> Fri Mar 15 10:57:11 2024 : Auth: (8 CHIFFRES) unknown: [bob] (from client test port REDACTED cli REDACTED)
(7) linelog_access: EXPAND /var/log/freeradius/linelog-access
(7) linelog_access: --> /var/log/freeradius/linelog-access
(7) [linelog_access] = ok
这是用于生成日志的 linelog_access 模块的配置:
linelog linelog_access {
#
# Used if the expansion of "reference" fails.
#
delimiter = "\n"
format = ""
filename = ${logdir}/linelog-access
permissions = 0600
reference = "messages.%{%{reply:Packet-Type}:-default}"
messages {
Access-Accept = "%t : Auth: (8 CHIFFRES) %{%{control:Tmp-String-1}:-unknown}:>
Access-Reject = "%t : Auth: (8 CHIFFRES) %{%{control:Tmp-String-1}:-unknown}:>
default = "%t : Auth: (8 CHIFFRES) %{%{control:Tmp-String-1}:-unknown}: [%{%{>
Access-Challenge = "%t - Sent challenge: %{User-Name} ;"
}
}
最后,这是linelog产生的日志:
Fri Mar 15 10:57:11 2024 : Auth: (8 CHIFFRES) unknown: [bob] (from client test port REDACTED cli REDACTED)
应该是这样的:
Fri Mar 15 10:57:11 2024 : Auth: (8 CHIFFRES) Invalid Certificate: [bob] (from client test port REDACTED cli REDACTED)
另请注意,这是我第一次发表此类帖子。对于给您带来的不便,我深表歉意。
我通过在更改 Tmp-String-1 变量的值后立即在每个单独的服务器中启动 linelog 模块来解决此问题,而不是在验证后部分中启动该模块。