Freeradius用户运营商

时间:2012-12-01 09:24:07

标签: authentication radius freeradius

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

还有一个问题。 在一些资源中我遇到过这样的问题: shad Auth-Type:=本地,用户密码==“测试” 我试过但它不起作用。响应是拒绝日志: [pap]警告!没有为用户找到“已知良好”密码。验证可能因此而失败。

1 个答案:

答案 0 :(得分:24)

用户文件的工作方式

对于下面的答案,对是指属性值对(AVP),即由属性,运算符和值组成的元组。

可以从users文件访问三个属性(对)列表。这些列表与特定请求相关联。

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

用户文件模块确定它将用于插入/搜索的列表,该列表将在条目和运算符中列出。

条目的第一行包含必须匹配的 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-类型

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"