AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-1080606

TNM's questions

Martin Hope
TNM
Asked: 2024-03-15 18:20:22 +0800 CST

Freeradius:将属性从模块启动的虚拟服务器传递到主服务器

  • 5

我目前在一个问题上停留了相当长一段时间。我们有一个 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)

另请注意,这是我第一次发表此类帖子。对于给您带来的不便,我深表歉意。

freeradius
  • 1 个回答
  • 28 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve