sky 发表于 2015-12-31 08:48:32

LDAP配置+主从+双主

环境:centos6.4   openldap 2.4.23iptables 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


4. 修改权限
chown -R ldap.ldap /etc/openldap/*
chown -R ldap.ldap /var/lib/ldap/*


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


6. 初始化库测试库


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=*)"


7. 用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');                # 初始登录的密码


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


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


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


11. 导入到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:   ldapfiles
   
(3) sudo测试


2. 用户家目录是挂载着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查看


3. 允许用户修改密码
服务器端设置
(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:检查客户端证书,没有证书或证书错误都将立即终止连接。


9. 以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端口

10. 修改客户端配置文件
    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




11. 客户端测试
    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"
      checkpoint1024 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"
      checkpoint1024 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 +"   


   2. 双主mirror模式,双向同步
   mirror模式就是互为主从,任何一个写都会复制到另一个上面
   master1192.168.2.128    master2192.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       

liuyu 发表于 2018-1-5 21:33:33

好牛逼哦学习学习

mzhe24 发表于 2018-4-20 15:41:26

感谢楼主分享!!!

冬之萤 发表于 2018-6-29 10:05:50

厉害,学习学习
页: [1]
查看完整版本: LDAP配置+主从+双主