Freeradius:其余模块的不带用户密码属性的请求

时间:2019-08-25 17:53:59

标签: freeradius

我正在尝试使用其余后端进行身份验证来设置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:
    }
}
}

缺少什么?需要做些什么才能使我可以从访问点接收密码?

谢谢

2 个答案:

答案 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'方法。

通常有两种方法可以验证用户身份:

  1. 将其凭据提交给外部身份验证服务器(在此示例中,通过调用rest.authenticate)。
  2. 从外部服务器获取其“已知有效”密码的副本,并将其与用户提交的密码进行比较(在此示例中,通过调用rest.authorize)。

您需要确定将使用哪种方法。

如果采用方法1,则用户需要以纯文本形式发送密码,以便可以将其提交给身份验证服务器。

如果采用第2种方法,则需要从另一台服务器以纯文本格式检索用户密码的副本。

两种方法都有优点和缺点,选择哪种方法会影响您可以使用哪些EAP(可扩展身份验证协议)方法。

无线身份验证

Protocol layering

在您的示例中,您使用的是WPA / 2-Enterprise,在这种情况下,在AP和无线客户端之间运行的身份验证框架将是802.1X。

使用802.1X,AP和无线客户端通过称为EAPOL(局域网上的EAPOL)的协议交换身份验证数据包。 802.1X和EAPOL允许无线客户端在交换加密密钥(WPA四次握手)之前以及无线客户端可以交换常规(非EAPOL)数据包之前,将凭据提交到身份验证服务器(通常为RADIUS服务器)与AP(例如DHCP数据包)。

通过无线身份验证,EAPOL和RADIUS主要充当EAP的传输,并在身份验证尝试期间承载用户凭据的EAP。

EAP和FreeRADIUS

当接入点转发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模块中的默认服务器,您应该对其进行修改以设置如何验证用户凭据的虚拟服务器。

方法1

EAP-TTLS实际上可以运行许多不同的内部身份验证方法,甚至可以运行EAP的另一层。这是因为EAP-TTLS允许RADIUS属性空间中的多个属性在其TLS包装器中发送。

但是,一般而言,大多数请求者默认将运行PAP作为内部身份验证方法,因此,当您看到综合请求发送到内部虚拟服务器时,它将仅包含User-Name和{ {1}}个属性。

删除User-Password的“授权和身份验证”部分中的所有现有文本。

要么将原始示例中的文本复制到“授权和身份验证”部分中,要么...我不确定您是否需要两次调用REST模块(坦白地说,自从我从事v3以来已经很长时间了),可能想尝试:

sites-available/inner-tunnel

方法2

对于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