需求是要使用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: shezho@gmail.com