环境:centos6.4 openldap 2.4.23 iptables selinux关闭 理论知识:

实践: 一. openldap安装

  1. Yum安装 yum install -y openldap openldap-servers openldap-clients

  2. 准备配置文件 cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

  3. 修改server配置文件slapd.conf # ldap.conf是客户端的配置文件 vim /etc/openldap/slapd.conf

  1. 设置目录树的后缀 suffix "dc=dianping,dc=com"
  2. 设置管理员DN rootdn "cn=admin,dc=example,dc=com"
  3. 设置管理员密码 rootpw redhat 或机密格式, 加密格式可通过 slappasswd命令来生成 rootpw {SSHA}j6OO++o76F2yhww2Cg/+Hy8oDPixx6C3
  4. 设置ldap日志,在argsfile下面添加 loglevel 1 修改系统日志配置文件 vim /etc/rsyslog.conf # centos5版应该是syslog.conf local4.* /var/log/ldap.log service rsyslog restart
  5. 修改完配置文件后用以下命令生成新的配置文件,以后不再特殊说明 service slapd start rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap:ldap /etc/openldap/slapd.d/ service slapd restart
  1. 修改权限 chown -R ldap.ldap /etc/openldap/* chown -R ldap.ldap /var/lib/ldap/*

  2. 启动 service slapd start
    netstat -tulnp | grep slapd # 查看是否监听389

  3. 初始化库测试库

vim example.ldif

dn:dc=dianping,dc=com objectclass:dcObject objectclass:organization o:dianping, Inc. dc:dianping

dn:cn=admin,dc=dianping,dc=com objectclass:organizationalRole cn:admin

导入到ldap中 ldapadd -x -W -D "cn=admin,dc=dianping,dc=com" -f example.ldif #会提示导入的数据 测试查找 ldapsearch -x -b "dc=dianping,dc=com" "(objectclass=*)"

  1. 用phpldapadmin测试(也可以安装ldap browser或者ldap administrator) 下载地址 phpldapadmin.sourceforge.net/ 安装简介:1). 放到apache+php定义的vhost的RootDocument中 2). 修改配置文件 cd ldapadmin/config/;cp config.php.example;config.php 278行开始配置: $servers = new Datastore(); $servers->newServer('ldap_pla'); $servers->setValue('server','name','dc'); $servers->setValue('server','host','localhost'); $servers->setValue('server','port',389); $servers->setValue('server','base',array('dc=dianping,dc=com')); $servers->setValue('login','auth_type','session'); $servers->setValue('login','bind_id','cn=admin,dc=dianping,dc=com'); # 初始登录的id,以下两行可以不定义 $servers->setValue('login','bind_pass','redhat'); # 初始登录的密码

  2. 访问定义的ldapadmin vhost 点击登录,登录dn: cn=admin,dc=dianping,dc=com 密码:redhat ##上面如果设置了,应该会默认填写着的

  3. 下载migrationtools,迁移主机的passwd shadow group等到ldap中 yum -y install migrationtools cd /usr/share/migrationtools/ vim migrate_common.ph # 71行左右 $DEFAULT_MAIL_DOMAIN = "dianping.com"; $DEFAULT_BASE = "dc=dianping,dc=com";

  4. 利用perl脚本转换为ldif ./migrate_base.pl > /tmp/base.ldif ./migrate_passwd.pl /etc/passwd > /tmp/passwd.ldif ./migrate_group.pl /etc/group > /tmp/group.ldif

  5. 导入到ldap中 # 删除/var/lib/ldap下面的数据库文件,重启slapd再导入 ldapadd -x -W -D "cn=admin,dc=dianping,dc=com" -f /tmp/base.ldif ldapadd -x -W -D "cn=admin,dc=dianping,dc=com" -f /tmp/passwd.ldif ldapadd -x -W -D "cn=admin,dc=dianping,dc=com" -f /tmp/group.ldif 重启slapd,在phpldapadmin中查看

二. 客户端使用ldap作为auth # centos6.3

  1. 安装LDAP客户端及依赖组件 yum -y install openldap openldap-clients nss-pam-ldapd pam_ldap

  2. 增加BIND策略,避免LDAP无法连接时无法开机 echo "bind_policy soft" >> /etc/openldap/ldap.conf

  3. 自动创建目录设置 echo "session required pam_mkhomedir.so skel=/etc/skel umask=0077" >> /etc/pam.d/system-auth

  4. 设置LDAP启用 备份一下: authconfig --savebackup=auth.bak 启用新的:
    authconfig --enableldap --enableldapauth --enablemkhomedir --enableforcelegacy --disablesssd --disablesssdauth --ldapserver=192.168.2.128 --ldapbasedn="dc=dianping,dc=com " --update

    启用tls --enableldapstarttls --enableldaptls --ldaploadcacert=file:///etc/openldap/cacerts/cacert.pem

  5. 客户端登陆测试,如果不能登陆服务器端tail -f /var/log/ldap.log查看

三。 扩展一下

  1. 客户端支持sudo 服务器端 (1) 拷贝sudo schema cp /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema ## 拷贝schema (2) 配置文件导入schema vim /etc/openldap/slapd.conf include /etc/openldap/schema/sudo.schema rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap:ldap /etc/openldap/slapd.d/* service slapd restart (3) 建立sudo.ldif实例 注: 导入ldap server中的有个ldapuser的用户,还有个test用户组 vim sudo.ldif dn: ou=Sudoers,dc=dianping,dc=com objectClass: top objectClass: organizationalUnit ou: Sudoers

dn: cn=defaults,ou=Sudoers,dc=dianping,dc=com objectClass: top objectClass: sudoRole cn: defaults sudoOption: !visiblepw sudoOption: always_set_home sudoOption: env_reset sudoOption: requiretty

dn: cn=ldapuser,ou=Sudoers,dc=dianping,dc=com ## dn
objectClass: top
objectClass: sudoRole cn: ldappuser ## 对应的是用户名或者组 sudoCommand: ALL ## 可以执行的命令 sudoHost: ALL ## 可以登录的Host sudoOption: !authenticate ## 是否需要输入密码 sudoRunAsUser: ALL ## 以哪个用户执行 sudoUser: ldapuser ## 用户或者组

dn: cn=%test,ou=Sudoers,dc=dianping,dc=com objectClass: top objectClass: sudoRole cn: %test sudoCommand: /bin/su sudoHost: 192.168.2.134 sudoOption: !authenticate sudoRunAsUser: ALL sudoUser: %test

(2) 客户端 vi /etc/sudo-ldap.conf
uri ldap://192.168.2.128 # 如果有备用后面跟备用的 Sudoers_base ou=Sudoers,dc=dianping,dc=com vi /etc/nsswitch.conf 增加 Sudoers: ldap files

(3) sudo测试

  1. 用户家目录是挂载着NFS NFS Server设置 (1) 安装nfs yum -y install nfs-utils portmap (2) vim /etc/exportfs /home *(rw,sync) (3) 启动nfs,关闭防火墙 service nfs start service iptables stop

客户端设置: (1) 配置autofs服务 vim /etc/auto.master /home auto.nfs

  vim /etc/auto.nfs 
  * -fstype=nfs,rw,sync 192.168.2.128:/home/&    
  # 说明,上面的*表示要挂载的某用户的目录,后面的&表示用户名。 

(2) 启动或重启autofs服务 service autofs start|restart

(3) 重新登录测试,mount查看

  1. 允许用户修改密码 服务器端设置 (1) 编辑配置文件slapd.conf, 注意:需要加载 database config之前 vim /etc/openldap/slapd.conf
access to attrs=userPassword 
  by self write 
  by anonymous auth 
  by dn.base="cn=admin,dc=dianping,dc=com" write 
  by * none 


access to * 
  by self write 
  by dn.base="cn=admin,dc=dianping,dc=com" write 
  by * read       

(2) 重新生成配置文件 rm -rf /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap:ldap /etc/openldap/slapd.d/* service slapd restart

(3) 客户端修改密码测试 ldappasswd -D 'cn=admin,dc=dianping,dc=com' -W -S 'uid=ldapuser,ou=People,dc=dianping,dc=com' ## 以rootdn修改 ldappasswd -D 'uid=ldapuser,ou=People,dc=dianping,dc=com' -W -S 'uid=ldapuser,ou=People,dc=dianping,dc=com' ## 以普通用户修改

  是不是很麻烦,其实passwd命令也是可以的 
  passwd  


  Changing password for user ldapuser. 
  Enter login(LDAP) password:  
  New password:  
  Retype new password:  
  LDAP password information changed for ldapuser 
  passwd: all authentication tokens updated successfully. 

三。 使用openssl加密

服务器端:

  1. 下载生成证书的perl脚本 yum install openssl-perl openssl-devel

  2. 清空/etc/pki/CA下面的内容,否则脚本不会正常执行 rm -rf /etc/pki/CA/*

  3. 编辑openssl.conf 设置默认参数,以防写错 vim /etc/pki/tls/openssl.conf [ CA_default ] dir = /etc/pki/CA
    ...其它的默认 default_days = 3650 [ req_distinguished_name ] countryName_default = CN stateOrProvinceName_default = BeiJing localityName_default = BeiJing 0.organizationName_default = dianping.inc organizationalUnitName_default = Tech

  4. 生成CA证书 cd /etc/pki/tls/misc ./CA.pl -newca # 会提示输入密码,设置一个, 完成后会在CA中生成CA证书cacert.pem # 提示的参数默认即可

  5. 为ldap服务器生成证书 ./CA.pl -newreq-nodes # 会提示输入一些信息,需要注意的是Common Name需要是客户端连接ldap服务器用的域名或者ip

  6. 为ldap证书签名 ./CA.pl -sign

  7. 将证书移动到/etc/openldap/cacerts目录,修改权限 mv new* /etc/openldap/cacerts cd /etc/openldap/cacerts cp /etc/pki/CA/cacert.pem . chown ldap:ldap * chmod 644 newcert.pem chmod 600 newkey.pem

  8. 修改配置文件slapd.conf,添加如下 TLSCipherSuite HIGH:MEDIUM:+SSLv2:+TLSv1:+SSLv3 TLSCACertificateFile /etc/openldap/cacerts/cacert.pem TLSCertificateFile /etc/openldap/cacerts/newcert.pem TLSCertificateKeyFile /etc/openldap/cacerts/newkey.pem TLSVerifyClient allow

说明: 
never:默认选项,不验证客户端证书。 
allow:检查客户端证书,没有证书或证书错误,都允许连接。 
try:检查客户端证书,没有证书(允许连接),证书错误(终止连接)。 
demand | hard | true:检查客户端证书,没有证书或证书错误都将立即终止连接。 
  1. 以ldaps方式运行slapd, 两种方法
1) slapd -h 'ldaps:///' 
2) 修改 /etc/sysconfig/ldap 
    SLAPD_LDAP=no          # 不启用389 
    SLAPD_LDAPS=yes        # 启用636 
   然后service slapd restart 


netstat -tulnp | grep slapd  # 查看是不是636端口 
  1. 修改客户端配置文件
    vim /etc/openldap/ldap.conf
TLS_REQCERT allow 
TLS_CACERT /etc/openldap/cacerts/cacert.pem 
TLS_CACERTDIR /etc/openldap/cacerts 
URI ldaps://192.168.2.128 
BASE dc=dianping,dc=com 
  1. 客户端测试
    ldapwhoami -v -x -Z # 匿名测试,最后显示success就是对的 ldapsearch -x -b "dc=dianping,dc=com" -H ldaps://192.168.2.128 # search测试

四。 主从复制 1) 一主多从 2) 双主mirror模式 测试服务器: 主: 192.168.2.131 从: 192.168.2.128

  1. 基于tls的主从模式
 1)  两台机器上安装openldap server,并配置加密,两端的证书一致(不一致貌似有问题) 
     yum -y install openldap-server openldap 


 2)  修改主配置文件slapd.conf,添加,并重启 
     modulepath /usr/lib/openldap 
     modulepath /usr/lib64/openldap 
     moduleload syncprov.la               # 默认没有load 
      
     index entryCSN,entryUUID        eq   # 加索引 


     overlay syncprov                      
     syncprov-checkpoint 100 10 
     syncprov-sessionlog 100 

 3)  修改从配置文件slapd.conf,并重启 注意,后面的注释不能有,下面是tab 
     moduleload syncprov.la                 # 默认没有load 
     modulepath /usr/lib/openldap 
     modulepath /usr/lib64/openldap 
      
    syncrepl rid=125 
        provider=ldaps://192.168.2.131:636         
        searchbase="dc=dianping,dc=com" 
        type=refreshOnly 
        interval=00:00:01:00                # 同步间隔,分别是天时分秒 
        filter="(objectClass=*)" 
        schemachecking=off 
        bindmethod=simple                   # 认证            
        binddn="cn=admin,dc=dianping,dc=com" 
        credentials=redhat                  # 密码 
        retry="60 +"                        # 重试时间 


 4) 主上面添加记录测试从是否复制过来 
 主配置文件slapd.conf 
    include     /etc/openldap/schema/corba.schema 
    include     /etc/openldap/schema/core.schema 
    include     /etc/openldap/schema/cosine.schema 
    include     /etc/openldap/schema/duaconf.schema 
    include     /etc/openldap/schema/dyngroup.schema 
    include     /etc/openldap/schema/inetorgperson.schema 
    include     /etc/openldap/schema/java.schema 
    include     /etc/openldap/schema/misc.schema 
    include     /etc/openldap/schema/nis.schema 
    include     /etc/openldap/schema/openldap.schema 
    include     /etc/openldap/schema/ppolicy.schema 
    include     /etc/openldap/schema/collective.schema 
    allow bind_v2 
    pidfile     /var/run/openldap/slapd.pid 
    argsfile    /var/run/openldap/slapd.args 
    loglevel    1 
    modulepath /usr/lib/openldap 
    modulepath /usr/lib64/openldap 
    moduleload syncprov.la 
    database config 
    access to * 
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage 
        by * none 
    database monitor 
    access to * 
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read 
            by dn.exact="cn=Manager,dc=my-domain,dc=com" read 
            by * none 
    database    bdb 
    suffix      "dc=dianping,dc=com" 
    checkpoint  1024 15 
    rootdn      "cn=admin,dc=dianping,dc=com" 
    rootpw      redhat 
    directory   /var/lib/ldap 
    index entryCSN,entryUUID                eq    
    index objectClass                       eq,pres 
    index ou,cn,mail,surname,givenname      eq,pres,sub 
    index uidNumber,gidNumber,loginShell    eq,pres 
    index uid,memberUid                     eq,pres,sub 
    index nisMapName,nisMapEntry            eq,pres,sub 
    TLSCipherSuite   HIGH:MEDIUM:+SSLv2:+TLSv1:+SSLv3 
    TLSCACertificateFile   /etc/openldap/cacerts/cacert.pem 
    TLSCertificateFile     /etc/openldap/cacerts/newcert.pem 
    TLSCertificateKeyFile  /etc/openldap/cacerts/newkey.pem 
    TLSVerifyClient         allow 
    overlay syncprov                      
    syncprov-checkpoint 100 10 
    syncprov-sessionlog 100    
     
  从配置文件slapd.conf 
    include     /etc/openldap/schema/corba.schema 
    include     /etc/openldap/schema/core.schema 
    include     /etc/openldap/schema/cosine.schema 
    include     /etc/openldap/schema/duaconf.schema 
    include     /etc/openldap/schema/dyngroup.schema 
    include     /etc/openldap/schema/inetorgperson.schema 
    include     /etc/openldap/schema/java.schema 
    include     /etc/openldap/schema/misc.schema 
    include     /etc/openldap/schema/nis.schema 
    include     /etc/openldap/schema/openldap.schema 
    include     /etc/openldap/schema/ppolicy.schema 
    include     /etc/openldap/schema/collective.schema 
    allow bind_v2 
    pidfile     /var/run/openldap/slapd.pid 
    argsfile    /var/run/openldap/slapd.args 
    loglevel    1 
    modulepath /usr/lib/openldap 
    modulepath /usr/lib64/openldap 
    moduleload syncprov.la 
    database config 
    access to * 
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage 
        by * none 
    database monitor 
    access to * 
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read 
            by dn.exact="cn=Manager,dc=my-domain,dc=com" read 
            by * none 
    database    bdb 
    suffix      "dc=dianping,dc=com" 
    checkpoint  1024 15 
    rootdn      "cn=admin,dc=dianping,dc=com" 
    rootpw      redhat 
    directory   /var/lib/ldap 
    index objectClass                       eq,pres 
    index entryCSN,entryUUID         eq 
    index ou,cn,mail,surname,givenname      eq,pres,sub 
    index uidNumber,gidNumber,loginShell    eq,pres 
    index uid,memberUid                     eq,pres,sub 
    index nisMapName,nisMapEntry            eq,pres,sub 
    TLSCipherSuite   HIGH:MEDIUM:+SSLv2:+TLSv1:+SSLv3 
    TLSCACertificateFile   /etc/openldap/cacerts/cacert.pem 
    TLSCertificateFile     /etc/openldap/cacerts/newcert.pem 
    TLSCertificateKeyFile  /etc/openldap/cacerts/newkey.pem 
    TLSVerifyClient         allow 
    syncrepl rid=125 
            provider=ldaps://192.168.2.131:636 
            searchbase="dc=dianping,dc=com" 
            type=refreshOnly 
            interval=00:00:01:00 
            filter="(objectClass=*)" 
            schemachecking=off 
            bindmethod=simple 
            binddn="cn=admin,dc=dianping,dc=com" 
            credentials=redhat 
            retry="60 +"     
  1. 双主mirror模式,双向同步 mirror模式就是互为主从,任何一个写都会复制到另一个上面 master1 192.168.2.128 master2 192.168.2.131
 1)  master1的配置文件片段 
    overlay syncprov 
    syncprov-checkpoint 100 10 
    syncprov-sessionlog 100 


    serverID 1 


    syncrepl        rid=001 
                    provider=ldaps://192.168.2.131:636 
                    bindmethod=simple 
                    binddn="cn=admin,dc=dianping,dc=com" 
                    credentials=redhat 
                    searchbase="dc=dianping,dc=com" 
                    schemachecking=on 
                    type=refreshAndPersist 
                    retry="60 +" 


    mirrormode      on 


 2) master2的配置文件片段,与master1配置文件基本相同,只是serverid和provider不同而已 
    overlay syncprov 
    syncprov-checkpoint 100 10 
    syncprov-sessionlog 100 


    serverID 2 


    syncrepl        rid=001 
                    provider=ldaps://192.168.2.128 
                    bindmethod=simple 
                    binddn="cn=admin,dc=dianping,dc=com" 
                    credentials=redhat 
                    searchbase="dc=dianping,dc=com" 
                    schemachecking=on 
                    type=refreshAndPersist 
                    retry="60 +" 

    mirrormode      on 

  3) 重启,测试添加条目 

五、 权限控制

passwd 直接修改吗 serverfault.com/questions/303256/ldap-password-information-update-failed-insufficient-access-50