Freeradius用户运营商

Atl*_*las 9 authentication radius freeradius

我遇到了一个问题,我在Freeradius 用户文件中无法理解.我的目标是用密码"test"验证外部用户"shad".我在/ etc/raddb/users中添加了以下行: shad Cleartext-Password =="test" 结果为Reject.如果我将"=="运算符更改为":="身份验证成功.所以我的问题是:为什么我不能用"=="而FREERADIUS文档讲述了运营商: "属性==值作为检查项目,它匹配如果指定的属性存在于请求,并给定值".

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

先感谢您.最好的祝福.

Arr*_*ell 26

用户文件的工作原理

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

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

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

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

条目的第一行包含必须匹配的检查对,以便使用该条目.它还包含控制对,如果所有检查对都匹配,则需要将控制对插入到控制列表中.

注意:列出对的顺序无关紧要.除非所有检查对都评估为真,否则不会插入控制对.

检查控制对由所使用的操作员区分.如果使用赋值运算符,即':='或'=',则该对将被视为控制对.如果使用等于运算符,例如'>','<','==','> =','<=','=〜',则该对将被视为检查对.

同一条目中的后续行仅包含回复对.如果所有检查对都匹配,则回复对将插入回复列表中.

明文密码

Cleartext-Password严格来说是一个控制对.它不应出现在任何其他列表中.

Cleartext-Password是一组属性之一,应包含"引用"(或"已知良好")密码,即用户密码的本地副本.此集合中另一对的示例是SSHA-Password - 它包含用户密码的salted SHA哈希.

服务器中的模块搜索引用密码对,该模块使用"用户密码"对"rlm_pap"处理对用户的验证.

用户密码

用户密码严格来说是一对请求.它不应出现在任何其他列表中.

用户密码包含在NAS的请求中.它包含用户提供给NAS的密码的纯文本版本.为了验证用户,模块需要将用户密码的内容与像Cleartext-Password这样的控制对进行比较.

在设置参考密码时的用户文件条目中,您将看到以下条目:

my_username Cleartext-Password := "known_good_password"
Run Code Online (Sandbox Code Playgroud)

也就是说,如果用户名与左侧的值(my_username)匹配,则插入控制对Cleartext-Password,其值为"known_good_password".

回答第一个问题的原因:

shad Cleartext-Password == "test"
Run Code Online (Sandbox Code Playgroud)

不起作用,这是因为您告诉文件模块在请求列表中搜索,对于请求列表中不存在的对,并且应该永远不存在于请求列表中.

你现在可能会想到哦,我将使用User-Password =="test"代替它,它会起作用.不幸的是,它不会.如果密码匹配,则条目将匹配,但用户仍将被拒绝,请参阅下面的原因.

验证型

Auth-Type严格来说是一个控制对.它不应出现在任何其他列表中.

服务器中有三个主要部分用于处理请求'authorize','authenticate','post-auth'.

授权是信息收集部分.这是完成数据库查找以授权用户和检索引用密码的地方.它也是确定Auth-Type的地方,也就是我们想要为用户执行的身份验证类型.

Authenticate是调用特定模块以执行身份验证的位置.该模块由Auth-Type确定.

Post-Auth主要用于日志记录,并且应用更多策略,在Post-Auth中运行的模块由在Authenticate中运行的模块返回的响应确定.

授权中的模块检查请求,如果他们认为可以对用户进行身份验证,并且未设置Auth-Type,则会将其设置为自己.

如果在请求中找到用户密码,rlm_pap模块将设置Auth-Type ='pap'.

如果未设置Auth-Type,则拒绝该请求.

所以要回答你的第二个问题,你正在强制进行pap身份验证,这是错误的,你应该让rlm_pap设置Auth-Type,然后你要对密码进行相等性检查,而不是设置rlm_pap使用的控制对.

当rlm_pap在身份验证中运行时,它会查找上面描述的一组"引用"密码的成员,如果找不到,则拒绝该请求,这就是上面发生的情况.

还有一个'魔术'Auth-Type,'Accept',完全跳过身份验证部分,只接受用户.如果你想在不使用rlm_pap的情况下进行明文密码比较,你可以使用:

shad Auth-Type := Accept, User-Password == "test"
Run Code Online (Sandbox Code Playgroud)

  • 只是想指出,这个答案被低估了,它在解释工作流程为正式文档方面做得更好(至少对我而言)!谢谢。 (2认同)