我遇到过一个问题,我在Freeradius 用户文件中无法理解。 我的目标是用密码“test”验证外部用户“shad”。 我在/ etc / raddb / users中添加了以下行: shad Cleartext-Password ==“test” 结果是拒绝。如果我将“==”运算符更改为“:=”身份验证成功。 所以我的问题如下: 为什么我不能使用“==”运算符,而FreeRadius文档告诉: “属性==价值 作为检查项,如果请求中存在命名属性,它将匹配,并且具有给定值。“
还有一个问题。 在一些资源中我遇到过这样的问题: shad Auth-Type:=本地,用户密码==“测试” 我试过但它不起作用。响应是拒绝日志: [pap]警告!没有为用户找到“已知良好”密码。验证可能因此而失败。
答案 0 :(得分:24)
对于下面的答案,对是指属性值对(AVP),即由属性,运算符和值组成的元组。
可以从users文件访问三个属性(对)列表。这些列表与特定请求相关联。
用户文件模块确定它将用于插入/搜索的列表,该列表将在条目和运算符中列出。
条目的第一行包含必须匹配的 check 对,以便使用该条目。它还包含 control 对,如果所有 check 对匹配,您希望将其插入到控制列表中。
注意:列出对的顺序并不重要。除非所有检查对评估为true,否则不会插入 control 对。< / p>
检查和控制对由使用的运算符区分。如果使用赋值运算符,即&#39;:=&#39;或者&#39; =&#39;然后该对将被视为 control 对。如果是等等运算符,例如&#39;&gt;&#39;&#39;&lt;&#;;&#39; ==&#39;,&#39;&gt; =&#39; ,&#39;&lt; =&#39;,&#39; =〜&#39;如果使用,该对将被视为 check 对。
同一条目中的后续行仅包含回复对。如果所有检查对匹配,回复对将被插入回复列表。
Cleartext-Password严格来说是 control 对。它不应出现在任何其他列表中。
Cleartext-Password是一组属性中的一个,应该包含&#39;引用&#39; (或称为“#good;&#39;”)密码,即用户密码的本地副本。此集合中另一对的示例是SSHA-Password - 这包含用户密码的salted SHA哈希值。
服务器中的模块搜索参考密码对,该模块处理使用&#39;用户密码&#39;对,&#39; rlm_pap&#39;。
用户密码严格来说是请求对。它不应出现在任何其他列表中。
用户密码包含在NAS的请求中。它包含用户提供给NAS的密码的纯文本版本。为了对用户进行身份验证,模块需要将User-Password的内容与Cleartext-Password等 control 对进行比较。
在设置参考密码时的用户文件条目中,您会看到如下条目:
my_username Cleartext-Password := "known_good_password"
也就是说,如果用户名与左侧的值匹配(my_username),则插入控制对Cleartext-Password,其值为&#34; known_good_password&#34;。
回答第一个问题的原因:
shad Cleartext-Password == "test"
不起作用,这是因为您告诉文件模块在请求列表中搜索,对于请求列表中不存在的对,并且不应该存在于请求列表中。
你现在可能在想哦,我会使用User-Password ==&#34; test&#34;相反,它会起作用。不幸的是,它没有赢。如果密码匹配,则条目将匹配,但用户仍将被拒绝,请参阅下面的原因。
Auth-Type严格来说是控制对。它不应出现在任何其他列表中。
服务器中有三个主要部分用于处理请求&#39;授权&#39;,&#39;验证&#39;,&#39; post-auth&#39;。
授权是信息收集部分。这是完成数据库查找以授权用户和检索引用密码的地方。它也是确定Auth-Type的地方,也就是我们想要为用户执行的身份验证类型。
Authenticate是调用特定模块执行身份验证的位置。该模块由Auth-Type确定。
Post-Auth主要用于记录和应用更多策略,在Post-Auth中运行的模块由在Authenticate中运行的模块返回的响应确定。
授权中的模块检查请求,如果他们认为可以对用户进行身份验证,并且未设置Auth-Type,则会将其设置为自己。
rlm_pap模块将设置Auth-Type =&#39; pap&#39;如果它在请求中找到用户密码。
如果未设置Auth-Type,请求将被拒绝。
所以要回答你的第二个问题,你要强制执行pap验证,这是错误的,你应该让rlm_pap设置Auth-Type,然后你要对密码进行相等性检查而不是设置rlm_pap使用的控制对。
当rlm_pap在身份验证中运行时,它会查找&#39;引用&#39;上面描述的密码,如果找不到密码,它会拒绝请求,这就是上面发生的事情。
还有一个魔法&#39; Auth-Type,&#39; Accept&#39;,它完全跳过身份验证部分,只接受用户。如果您希望用户在没有rlm_pap的情况下进行明文密码比较,您可以使用:
shad Auth-Type := Accept, User-Password == "test"