需求是要使用windows active directory上的现有账号来认证freeradius的客户端,freeradius使用ldap bind来连接windows ad, bind 成功则认证通过,过程中windows ad并不返回用户的密码给freeradius.
过程中碰到几处容易出问题的地方:
1. 为了启用ldap bind认证,需要编辑/usr/local/etc/raddb/sites-available/default文件。
Authorize部分添加如下配置:
ldap
if ((ok || updated) && User-Password) {
update {
control:Auth-Type := ldap
}
}
authenticate部分uncomment如下配置:
Auth-Type LDAP {
ldap
}
2. 对ldap module的配置:
将mods-available 目录下的ldap拷贝到mods-enabled目录下,修改如下内容:
ldap {
.....
server = ‘1.2.3.4‘ #此处是自己要使用的windows AD的域名或者ip
identity = "cn=zhangsan,ou=lab,dc=test,dc=com" #此处是查询windows ad时所用的账号名
password = zhangsan123 #此处是查询windows ad所用账号的密码
base_dn = ‘ou=lab,dc=test,dc=com‘ #此处是待认证账号在windows AD里面的base DN,就是父目录。
.......
}
user {
.....
filter = "(CN=%{%{Stripped-User-Name}:-%{User-Name}})" #修改查询用户时的filter,windows AD #一般改为CN=
......
}
3. 如果需要对windows AD 返回来的结果中的某些属性值进行修改然后再返回给认证客户端,可以在default文件的post-auth部分进行配置,如下的实例:
post-auth {
........
foreach reply:My-Local-String {
if("%{Foreach-Variable-0}" =~ /CN=[lab]-[0-9 a-z A-Z]+/) {
update reply {
NS-User-Group += "%{0}"
}
}
}
..........
}
ldap文件也需要稍作修改:
update {
......
reply:My-Local-String += ‘memberOf‘
........
}
以上的例子把freeradius本来要返回的My-Local-String属性数组转换为NS-User-Group属性返回给radius client,条件是该属性是CN=lab-xxxxx的形式开头的。实际上是返回用户在windows AD里的组属性,但是不是所有的组都返回,只有那些以lab-xxxxxx形式命名的组才返回。
之所以要进行这种转换,是因为例子中的这种radius client设备能识别的组属性的名字是NS-User-Group,但windows AD里对应的组属性的名字是memberOf,所以要转换,否则client不认识。
=================================
contact author: [email protected]