zoukankan      html  css  js  c++  java
  • 12-openldap使用AD密码

    阅读视图

    本文严重参考

    Openldap 整合windows AD认证

    本文其他参考

    OpenLDAP使用AD密码

    Configuring OpenLDAP pass-through authentication to Active Directory

    一、需求概述及解决方案

    1. 需求概述

    Openldap是开源的目录服务实现,windows AD是微软的目录服务现实。现状是有的场景(应用、客户端)跟openldap结合比较容易,有的场景又是必须要用AD,所以几乎不可能弃用其中的任意一种。但同时维护两套系统意味着维护工作大量增加(不仅仅只是增加一倍,要考虑信息分别维护、同步etc等)、出错几率增加。

    其中的一种较成熟、使用比较多的解决方案是:openldap使用windows AD的认证,这样只需要在AD上维护一套用户密码即可。

    比较常用的场景,如图

    2. 流程图

    如上图,相关组件分四大部分:

    1. LDAP client:这个是实际调用ldap服务的系统,也可以是类似ldapsearch之类的client程序;
    2. Openldap:开源服务端,实际进程为slapd;
    3. Saslauthd:简单认证服务层的守护进程,该进程要安装在openldap服务器上;
    4. Active directory:即windows AD,这个不用解释;

    二、AD域设置

    AD域设置设置很简单,如下:

    1. 在AD域的Users目录下新建一个用户saslauthd
    2. 新建一个技术运营部,新建一个用户user10
    3. 在Users新建一个用户test1

    三、Saslauthd安装配置

    1. 安装Saslauthd

    在openldap-server服务器上安装Saslauthd

    [root@0 ~]# yum install cyrus-sasl
    
    [root@0 ~]# rpm -ql cyrus-sasl
    /etc/sysconfig/saslauthd    # 配置文件
    /run/saslauthd
    /usr/lib/systemd/system/saslauthd.service   # 启动脚本
    /usr/sbin/pluginviewer
    /usr/sbin/saslauthd   # 守护进程
    /usr/sbin/testsaslauthd   # 测试程序
    /usr/share/doc/cyrus-sasl-2.1.26
    /usr/share/doc/cyrus-sasl-2.1.26/LDAP_SASLAUTHD
    /usr/share/man/man8/pluginviewer.8.gz
    /usr/share/man/man8/saslauthd.8.gz
    /usr/share/man/man8/sasldblistusers2.8.gz
    /usr/share/man/man8/saslpasswd2.8.gz
    /usr/share/man/man8/testsaslauthd.8.gz
    

    2.【可选】测试sasl本身

    1. 创建1个帐号及密码
    
    [root@0 ~]# useradd test
    [root@0 ~]# passwd test
    Changing password for user test.
    New password: 
    BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
    Retype new password: 
    passwd: all authentication tokens updated successfully.
    
    2. 配置saslauthd使用shadow认证并启动saslauthd进程
    [root@0 ~]# grep -Ev "^$|^#" /etc/sysconfig/saslauthd
    SOCKETDIR=/run/saslauthd
    MECH=shadow
    FLAGS=
    [root@0 ~]# systemctl restart saslauthd
    
    3. 使用testsaslauthd进行验证
    [root@0 ~]# testsaslauthd -u test -p password
    0: OK "Success."
    

    这里如密码正确应该出现认证成功,密码错误则失败,到这里可理解sasl本身OK的。后续配置还会用 testsaslauthd 程序测试、调试。验证OK后可删除用户。

    3. 配置sasl关联到ad域

    1. 【可选】先用ldap客户端测一下windowad域是否可用,用户密码是否正确。如果验证失败,就需要排查openldap的问题了。
    [root@0 ~]# ldapsearch -x -H ldap://192.168.244.31 -D "CN=administrator,CN=Users,DC=windows,dc=com" -w Aa123456 -b "DC=windows,DC=COM"  | less  
    # extended LDIF
    #
    # LDAPv3
    # base <DC=windows,DC=COM> with scope subtree
    # filter: (objectclass=*)
    # requesting: ALL
    #
    
    # windows.com
    dn: DC=windows,DC=com
    objectClass: top
    objectClass: domain
    objectClass: domainDNS
    distinguishedName: DC=windows,DC=com
    ...省略
    
    1. 配置sasl访问ad
    1. 修改/etc/sysconfig/saslauthd, 如下
    [root@0 ~]# grep -Ev "^$|^#" /etc/sysconfig/saslauthd
    SOCKETDIR=/run/saslauthd
    MECH=shadow
    FLAGS="-O /etc/saslauthd2ad.conf"
    
    [root@0 ~]# cat /etc/saslauthd2ad.conf    # 该文件需要新建立
    ldap_servers: ldap://192.168.244.31
    ldap_search_base: DC=windows,DC=com
    ldap_timeout: 10
    ldap_filter: sAMAccountName=%U
    ldap_bind_dn: CN=saslauthd,CN=Users,DC=windows,DC=com   # 第二步骤建立的用户
    ldap_password: Aa123456
    ldap_deref: never
    ldap_restart: yes
    ldap_scope: sub
    ldap_use_sasl: no
    ldap_start_tls: no
    ldap_version: 3
    ldap_auth_method: bind
    
    3. 重启saslauthd服务
    

    该文件的主要参数:

    ldap_servers: LDAP URI, windowsAD地址

    ldap_bind_dn: DN for connection ,一个windows AD用户的DN,实际不需要admin的

    ldap_password: Password for connection,密码

    ldap_search_base: Search base

    ldap_filter: Search filter ,%U 表示user, %u 表示user@domain

    测试testsaslauthd -u administrator -p 密码 ,这里就是使用AD域的用户-密码认证了,并不只是写到配置文件里面的administrator,而是所有AD用户都已经可以用testsaslauthd程序测试验证。可进一步AD里面加用户、或改密码测试。需注意AD修改密码,老密码依然可用5分钟。如验证不通过检查 sasl的配置。重启sasl即可清楚密码缓存。

    四、openldap-server配置

    1. 检查Openldap

    如果是编译的必须要有编译参数 ./configure --enable-spasswd;如没有需要重新编译,否则不支持之后形如 userPassword: {SASL}user@domain的语法配置。

    本文采用yum安装,默认是支持的。

    2. 配置openldap使用Saslauthd

    在openldap的配置文件/etc/openldap/slapd.conf加入如下两行
    sasl-host localhost
    sasl-secprops none
    这两行配置是告诉openldap使用本机的sasl
    
    再修改/新建sasl的配置文件
    [root@0 ~]# cat /etc/sasl2/slapd.conf    
    mech_list: plain
    pwcheck_method: saslauthd
    saslauthd_path: /var/run/saslauthd/mux
    
    这个配置文件相当于sasl的前端,意思是来自于slapd的请求,让saslauthd接手处理。注意这两个配置文件文件名是相同的,但却是不同软件包的配置文件。如果slapd是用非root的OS用户启动的,那还要将用户加到组里。(本次实验是用root启动saslauthd)
    usermod -a -G sasl ldap
    

    3. openldap新建测试用户

    cat << EOF | ldapadd -x -D "cn=Manager,dc=windows,dc=com" -W 
    dn: uid=user10,ou=people,dc=windows,dc=com
    uid: user10
    cn: user10
    objectClass: account
    objectClass: posixAccount
    objectClass: top
    objectClass: shadowAccount
    shadowMin: 0
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    uidNumber: 30010
    gidNumber: 30005
    homeDirectory: /home/user10
    userPassword: {SASL}user10
    
    如上userPassword配置, openldap就会将用户user10转发给sasl程序认证, 而sasl又会进一步转发给windows AD。也可同样原理参照, 新建test1用户
    
    测试如下
    [root@0 ~]# testsaslauthd -u user10 -p Acc123456
    0: OK "Success."
    [root@0 ~]# ldapsearch -w Acc123456 -H ldap://xyz.com -D "uid=user10,ou=people,dc=xyz,dc=com" -b "uid=user10,ou=people,dc=xyz,dc=com" 
    # extended LDIF
    #
    # LDAPv3
    # base <uid=user10,ou=people,dc=xyz,dc=com> with scope subtree
    # filter: (objectclass=*)
    # requesting: ALL
    #
    
    # user10, people, xyz.com
    dn: uid=user10,ou=people,dc=xyz,dc=com
    uid: user10
    cn: user10
    objectClass: account
    objectClass: posixAccount
    objectClass: top
    objectClass: shadowAccount
    shadowMin: 0
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    uidNumber: 30010
    gidNumber: 30005
    homeDirectory: /home/user10
    userPassword:: e1NBU0x9dXNlcjEw
    
    # search result
    search: 2
    result: 0 Success
    
    # numResponses: 2
    # numEntries: 1
    

    五、配置TLS加密

    本人并没有配置, 所以忽略。

    解决方案有这么几种:

    Ø外层网络层加密,比如×××隧道

    Ø使用windows安全认证如NTLM 、Kerberos

    Ø启用SSL/TLS镶套协议

    本文采用TLS方案

    D.Windowsad启用TLS

    Windows AD启用TLS支持需要先安装证书服务,即 AD CS,建议在功能里面安装相关管理工具。安装完成后执行 certutil -dcinfo verify ,再用ldp.exe程序本地验证。


    通过后在用ldapsearch远程验证。这个有几个注意点,过程如下:

    4.导出windows证书,并配置给ldapsearch

    windows的证书导出如图:

    讲导出的文件传到ldapsearch所在服务器

    修改配置文件(ldap客户端配置文件和openldap客户端配置文件是不同的)

    /usr/local/openldap2.4/etc/openldap/ldap.conf

    加入 TLS_CACERT /etc/openldap/certs/ca2.crt

    5.可能需要修改/etc/hosts

    192.168.0.101 WIN-QLMQQENMPLO.test.com

    因为会验证主机名是否与证书里的字段匹配,所以不能用ip地址访问

    测试命令:

    ldapsearch -x -H ldaps://WIN-QLMQQENMPLO.test.com -D "CN=blake,CN=Users,DC=test,DC=com" -w 密码 -b "CN=administrator,CN=Users,DC=test,DC=com"

    注意连接协议是ldaps,默认636端口,不再是ldap

    这里OK了再继续。否则后面也容易出问题

    E.Sasl配置TLS

    修改配置文件/etc/saslauthd2ad.conf

    [root@localhost log]# cat /etc/saslauthd2ad.conf

    ldap_servers: ldaps://WIN-QLMQQENMPLO.test.com/

    ldap_search_base: CN=Users,DC=test,DC=com

    ldap_filter: sAMAccountName=%U

    ldap_bind_dn: CN=administrator,CN=Users,DC=test,DC=com

    ldap_password: 密码

    ldap_tls_cacert_file: /etc/openldap/certs/ca-test.cer

    这里和前面的配置有2点不同,一是协议变为ldaps,而是最后一行指定了证书。就是前面从windows导出的证书。这里的逻辑是:自签名的ssl/tls证书,ldaps要求把自签名用到的ca证书配置给客户端。Ldapsearch程序修改ldap.conf文件,sasl则修改本文件。

    使用testsaslauthd -u administrator -p 密码 命令验证

    F.Openldap配置TLS

    Openldap服务端也可以配置TLS,配置文件是slapd.conf

    比如 /usr/local/openldap2.4/etc/openldap/slapd.conf

    增加3行

    TLSCACertificateFile /etc/openldap/certs/ca.crt

    TLSCertificateFile /etc/openldap/certs/ldap.crt

    TLSCertificateKeyFile /etc/openldap/certs/ldap.key.pem

    这里第一行是自签名用到的ca证书(可以不是本机,可以用前面的windows服务器来签证书),第二行是本机服务器证书,第三行是本机服务器证书密钥。证书的概念这里不详细讲解。

    之后,用命令开启TLSslapd -4 -h "ldap:/// ldaps:///"

    特别注意,这里要验证openldapTLS的话又比较麻烦

    可以先openssl s_client -connect localhost:636看一下证书对不对

    然后配置ldapsearch 1.合并证书,即ldap.conf 配置文件里面,TLS_CACERT 参数指定的文件,直接用cat命令讲两个ca证书合并(一个是前面windows的,一个是签发给openldap的) 2.修改/etc/hosts 192.168.0.107 ldap

    测试验证命令:ldapsearch -w 密码 -H ldaps://ldap -D "cn=blake,ou=users,dc=saybot,dc=com" -b "cn=blake,ou

    =users,dc=saybot,dc=com"

    G.概念总结

    TLS的配置整体比较麻烦,把握以下概念:

    ØLdap协议是389端口,明文;TLS加密后协议是ldaps ,636端口

    ØWindowsad开启ldaps(TLS)安装活动目录证书(AD CS)服务

    Ø证书有2种,1是服务器证书,2是签发服务器证书的ca证书

    Ø自签名的情况下,客户端需要额外配置ca证书(第二种)

  • 相关阅读:
    《Unix/Linux系统编程》第九章学习笔记
    第1、2章学习笔记
    第11章学习笔记(20191213兰毅达)
    第7、8章学习笔记(20191213兰毅达)
    sort(20191213兰毅达)
    # 电子公文传输系统团队项目 团队作业(一):团队展示
    第10章学习笔记(20191213兰毅达)
    MyOD(选做)(20191213兰毅达)
    2019-2020-1 20191213兰毅达《信息安全专业导论》第十二周学习总结
    2019-2020-1 20191213兰毅达《信息安全专业导论》第十一周学习总结
  • 原文地址:https://www.cnblogs.com/cishi/p/9398079.html
Copyright © 2011-2022 走看看