authentication - Freeradius 用户运营商

标签 authentication radius freeradius

我遇到了一个问题,我在 Freeradius 中无法理解 用户 文件。
我的目标只是使用密码“test”验证外部用户“shad”。
我在/etc/raddb/users 中添加了以下行:
shad 明文密码 ==“测试”
结果是拒绝。如果我改变 “==” 运营商到 ":="认证成功。
所以我的问题如下:
为什么我不能使用 “==” 运算符而 FreeRadius 文档说明:
"属性==值
作为检查项,它匹配请求中是否存在命名属性,并且具有给定的值。”

还有一个问题。
在某些资源中,我遇到了这样的问题:
shad Auth-Type := Local, User-Password == "test"
我试过了,它不起作用。响应是拒绝与日志:
[爸爸] 警告!未找到该用户的“已知正确”密码。因此,身份验证可能会失败。

最佳答案

用户文件的工作原理
对于下面的答案,对指的是属性值对 (AVP),即由属性、运算符和值组成的元组。
可以从用户文件访问三个属性(对)列表。这些绑定(bind)到服务器当前正在处理的请求,并且它们不会在多个请求/响应轮次中持续存在。

  • 请求 - 包含通过网络从 NAS(网络访问服务器)收到的原始请求中的所有对。
  • 控制 - 最初不包含对,但填充了控制模块如何处理当前请求的对。这是通过用户文件或 unlang(虚拟服务器中使用的 FreeRADIUS 策略语言)完成的。
  • 回复 - 包含您要通过网络发送回 NAS 的对。

  • 用户文件模块确定将用于插入/搜索的列表、条目中列出的对和运算符。
    条目的第一行包含必须匹配才能使用条目的检查对。第一行还包含控制对,如果所有检查对匹配,您希望插入到控制列表中的那些。
    注意:这些对以哪个顺序列出并不重要。除非所有检查对评估为真,否则不会插入控制对。
    检查和控制对由使用的运算符区分。如果使用赋值运算符,即 ':=' 或 '=' 则该对将被视为控制对。如果使用了诸如 '>'、'<'、'=='、'>='、'<='、'=~' 等等式运算符,则该对将被视为检查对。
    同一条目中的后续行仅包含回复对。如果所有检查对都匹配,则回复对将被插入到回复列表中。
    明文密码
    Cleartext-Password 是严格的控制对。它不应出现在任何其他列表中。
    Cleartext-Password 是一组属性中的一个,它应该包含“引用”(或“已知的”)密码,即用户密码的本地副本。该集合中另一对的示例是 SSHA-Password - 它包含用户密码的加盐 SHA 哈希。
    引用密码对由能够使用“用户-密码”对验证用户的模块搜索(在控制列表中)。在这种情况下,该模块是“rlm_pap”。
    用户密码
    User-Password 严格来说是一个请求对。它不应出现在任何其他列表中。
    用户密码包含在来自 NAS 的请求中。它包含用户提供给 NAS 的密码的明文版本。为了对用户进行身份验证,模块需要将 User-Password 的内容与像 Cleartext-Password 这样的控制对进行比较。
    在设置引用密码时的用户文件条目中,您将看到如下条目:
    my_username Cleartext-Password := "known_good_password"
    
    也就是说,如果用户名与左侧的值 (my_username) 匹配,则插入值为“known_good_password”的控制对 Cleartext-Password。
    回答第一个问题的原因:
    shad Cleartext-Password == "test"
    
    不起作用,这是因为您告诉 files 模块在请求列表中搜索,寻找请求列表中不存在且永远不应该存在于请求列表中的对。
    您现在可能在想哦,我将使用 User-Password == "test"代替,它会起作用。不幸的是它不会。如果密码匹配,则条目将匹配,但用户仍将被拒绝,原因见下文。
    认证类型
    Auth-Type 是严格的控制对。它不应出现在任何其他列表中。
    服务器中有三个主要部分用于处理“授权”、“身份验证”、“后身份验证”请求。
    授权是信息收集部分。这是进行数据库查找以授权用户并检索引用密码的地方。这也是确定 Auth-Type 的地方,即我们要为用户执行的身份验证类型。
    身份验证是调用特定模块来执行身份验证的地方。模块由Auth-Type决定。
    Post-Auth 主要用于日志记录,并应用进一步的策略,Post-Auth 中运行的模块由 Authenticate 中运行的模块返回的响应决定。
    authorize 中的模块会检查请求,如果他们认为可以对用户进行身份验证,并且未设置 Auth-Type,则将其设置为自己。例如,如果 rlm_pap 模块在请求中找到用户密码,它将设置 Auth-Type = 'pap'。
    如果未设置 Auth-Type,则请求将被拒绝。
    因此,要回答您的第二个问题,您正在强制进行 pap 身份验证,这是错误的,您应该让 rlm_pap 通过在授权部分的 files 模块之后列出 pap 来设置 Auth-Type。
    当 rlm_pap 在身份验证中运行时,它会查找上述“引用”密码组中的一个成员,如果找不到,则拒绝请求,这就是上面发生的情况。
    还有一个“魔术”身份验证类型,“接受”,它完全跳过身份验证部分,只接受用户。如果您希望用于在没有 rlm_pap 的情况下进行明文密码比较,您可以使用:
    shad Auth-Type := Accept, User-Password == "test"
    

    关于authentication - Freeradius 用户运营商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658080/

    相关文章:

    c# - 使用 webAPI Bearer Token 的 SignalR 身份验证

    security - 如何将密码和账户管理外包给第三方?

    java - java servlet 容器的 RADIUS 模块

    freeradius - 如果语句的评估不一致

    attributes - RADIUS Vendor-Ids 的定义

    python - 为什么我在使用 cleaned_data 时没有得到干净的数据

    swift - UITextField 边框在 Swift 中指定半径

    c - 直接将字节写入 OpenSSL Connection,无需 TCP

    mysql - FreeRadius 断开用户

    php - PEAR Auth 真的是 PHP 身份验证的可行选择吗?