我遇到了一个问题,我在 Freeradius 中无法理解 用户 文件。
我的目标只是使用密码“test”验证外部用户“shad”。
我在/etc/raddb/users 中添加了以下行:
shad 明文密码 ==“测试”
结果是拒绝。如果我改变 “==” 运营商到 ":="认证成功。
所以我的问题如下:
为什么我不能使用 “==” 运算符而 FreeRadius 文档说明:
"属性==值
作为检查项,它匹配请求中是否存在命名属性,并且具有给定的值。”
还有一个问题。
在某些资源中,我遇到了这样的问题:
shad Auth-Type := Local, User-Password == "test"
我试过了,它不起作用。响应是拒绝与日志:
[爸爸] 警告!未找到该用户的“已知正确”密码。因此,身份验证可能会失败。
最佳答案
用户文件的工作原理
对于下面的答案,对指的是属性值对 (AVP),即由属性、运算符和值组成的元组。
可以从用户文件访问三个属性(对)列表。这些绑定(bind)到服务器当前正在处理的请求,并且它们不会在多个请求/响应轮次中持续存在。
用户文件模块确定将用于插入/搜索的列表、条目中列出的对和运算符。
条目的第一行包含必须匹配才能使用条目的检查对。第一行还包含控制对,如果所有检查对匹配,您希望插入到控制列表中的那些。
注意:这些对以哪个顺序列出并不重要。除非所有检查对评估为真,否则不会插入控制对。
检查和控制对由使用的运算符区分。如果使用赋值运算符,即 ':=' 或 '=' 则该对将被视为控制对。如果使用了诸如 '>'、'<'、'=='、'>='、'<='、'=~' 等等式运算符,则该对将被视为检查对。
同一条目中的后续行仅包含回复对。如果所有检查对都匹配,则回复对将被插入到回复列表中。
明文密码
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/