需求是要使用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]