CentOS 7 下 OpenLDAP 安装配置

目标是ldap1和ldap2做成高可用LDAP为集群中所有节点提供身份验证服务。

一、LDAP服务端,ldap1和ldap2均需安装配置

安装OpenLDAP并导入基本定义

yum install -y openldap openldap-clients openldap-servers
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap:ldap /var/lib/ldap
systemctl enable slapd.service
systemctl start slapd.service
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/nis.ldif

修改LDAP基本配置

  1. 创建db.ldif,内容见后
  2. olcRootDN就是LDAP的超级用户
  3. 用slappasswd生成密码的哈希填入olcRootPW中做为olcRootDN的密码
  4. 修改dc=为自己的域
  5. monitor默认所有用户均可读取,通过添加olcAccess改为只有root和RootDN可以读取
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcSuffix
    olcSuffix: dc=yaoge123,dc=com
    
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcRootDN
    olcRootDN: cn=Manager,dc=yaoge123,dc=com
    
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcRootPW
    olcRootPW: {SSHA}lY3iu244B87mEjUzSyHboD3x0tjTRHCV
    
    dn: cn=config
    changetype: modify
    replace: olcLogLevel
    olcLogLevel: stats2 shell sync
    
    dn: olcDatabase={1}monitor,cn=config
    changetype: modify
    replace: olcAccess
    olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
      by dn.base="cn=Manager,dc=yaoge123,dc=com" read
      by * none
  6. 用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f db.ldif

生成证书并设置TLS

  1. OpenLDAP默认使用明码传输,为了加密数据必须生成证书并配置TLS
  2. 在一个安全的服务器上生成CA的私钥和证书,有效期20年
    openssl req -new -x509 -nodes -out ca-cert.pem -keyout ca-key.pem -days 7305
  3. 在LDAP服务器生成私钥和证书请求,证书CN需为客户端访问使用的地址(域名、机器名、IP)
    openssl req -new -nodes -out cert.csr -keyout key.pem
  4. 用CA签发证书,有效期20年
    openssl x509 -req -in cert.csr -CAkey ca-key.pem -CA ca-cert.pem -out cert.pem -set_serial 01 -days 7305
  5. 把CA证书、服务器私钥和证书放到/etc/openldap/certs下,并修改属主和权限
    mv ca-cert.pem cert.pem key.pem /etc/openldap/certs/
    chown -R ldap:ldap /etc/openldap/certs/{ca-cert,cert,key}.pem
    chmod 644 /etc/openldap/certs/ca-cert.pem
    chmod 644 /etc/openldap/certs/cert.pem
    chmod 600 /etc/openldap/certs/key.pem
  6. 创建certs.ldif
    dn: cn=config
    changetype: modify
    replace: olcTLSCACertificateFile
    olcTLSCACertificateFile: /etc/openldap/certs/ca-cert.pem
    
    dn: cn=config
    changetype: modify
    replace: olcTLSCertificateFile
    olcTLSCertificateFile: /etc/openldap/certs/cert.pem
    
    dn: cn=config
    changetype: modify
    replace: olcTLSCertificateKeyFile
    olcTLSCertificateKeyFile: /etc/openldap/certs/key.pem
  7. 用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f certs.ldif
  8. 修改LDAP服务端配置/etc/sysconfig/slapd,只启用ldapi和ldaps
    SLAPD_URLS="ldapi:/// ldaps:///"
  9. 重启LDAP服务
    systemctl restart slapd.service
  10. 验证TLS,可以看到证书链中有CA和LDAP服务器两个证书,最后显示Verify return code: 0 (ok)
    openssl s_client -connect ldap1:636 -showcerts -state -CAfile /etc/openldap/certs/ca-cert.pem
    
  11. ldap1已完成,从3.生成私钥和证书请求开始为ldap2配置,注意签发证书时set_serial需要不同,签发证书有效期需在CA证书有效期内
  12. 检查证书
    openssl req -in cert.csr -noout -text  //查看证书请求文件
    openssl x509 -in cert.pem -noout -text  //查看证书

创建自己的域

  1. 创建一个文本文件base.ldif,内容见后
  2. 修改dc为自己的域名
    dn: dc=yaoge123,dc=com
    dc: yaoge123
    objectClass: top
    objectClass: domain
    
    dn: ou=People,dc=yaoge123,dc=com
    ou: People
    objectClass: top
    objectClass: organizationalUnit
    
    dn: ou=Group,dc=yaoge123,dc=com
    ou: Group
    objectClass: top
    objectClass: organizationalUnit
  3. 用ldapadd导入,输入RootDN密码
    ldapadd -x -W -D cn=Manager,dc=yaoge123,dc=com -H ldapi:/// -f base.ldif

LDAP复制

  1. OpenLDAP 2.4支持5种复制方式,其中MirrorMode提供LDAP读写高可用性,双机Active-Active Hot-Standby,前端写入一个服务器即可,双机互相同步复制,只有一个服务器的情况下也支持写入
  2. 创建mod_syncprov.ldif
    dn: cn=module,cn=config
    objectClass: olcModuleList
    cn: module
    olcModulePath: /usr/lib64/openldap
    olcModuleLoad: syncprov.la
  3. 用ldapadd导入
    ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
  4. 创建syncprov.ldif
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    add: olcDbIndex
    olcDbIndex: entryCSN,entryUUID eq
    
    dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
    changeType: add
    objectClass: olcOverlayConfig
    objectClass: olcSyncProvConfig
    olcOverlay: syncprov
    olcSpCheckpoint: 100 10
    olcSpSessionLog: 100
  5. 用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
  6. 创建syncuser.ldif,创建用于同步的用户,用slappasswd生成密码的哈希填入userPassword中做为同步用户的密码
    dn: cn=ldapreader,dc=yaoge123,dc=com
    objectClass: simpleSecurityObject
    objectClass: organizationalRole
    cn: ldapreader
    description: LDAP reader user 
    userPassword: {SSHA}95M+f4bXaOF4DwJ5HdMY75kkqNXEFJRU
  7. 用ldapadd导入,输入RootDN密码
    ldapadd -x -W -D cn=Manager,dc=yaoge123,dc=com -H ldapi:/// -f syncuser.ldif
  8. 创建ldap1sync.ldif,credentials需为同步用户的密码
    dn: cn=config
    changeType: modify
    add: olcServerID
    olcServerID: 1
    
    dn: olcDatabase={2}hdb,cn=config
    changeType: modify
    add: olcSyncrepl
    olcSyncrepl: rid=001 provider=ldaps://ldap2 bindmethod=simple binddn="cn=ldapreader,dc=yaoge123,dc=com" credentials=yaoge123 searchbase="dc=yaoge123,dc=com" schemachecking=on type=refreshAndPersist retry="60 +" tls_cacert=/etc/openldap/certs/ca-cert.pem
    -
    add: olcMirrorMode
    olcMirrorMode: TRUE
  9. 在ldap1上用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f ldap1sync.ldif
  10. 创建ldap2sync.ldif,credentials需为同步用户的密码
    dn: cn=config
    changeType: modify
    add: olcServerID
    olcServerID: 2
    
    dn: olcDatabase={2}hdb,cn=config
    changeType: modify
    add: olcSyncrepl
    olcSyncrepl: rid=001 provider=ldaps://ldap1 bindmethod=simple binddn="cn=ldapreader,dc=yaoge123,dc=com" credentials=yaoge123 searchbase="dc=yaoge123,dc=com" schemachecking=on type=refreshAndPersist retry="60 +" tls_cacert=/etc/openldap/certs/ca-cert.pem
    -
    add: olcMirrorMode
    olcMirrorMode: TRUE
  11. 在ldap2上用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f ldap2sync.ldif
  12. 修改其中一个服务器上的LDAP,查看另一个服务器是否自动同步。
  13. 如果同步有问题,用调试模式运行ldap
    /usr/sbin/slapd -u ldap -g ldap -h "ldapi:// ldaps://" -d -1

迁移已有用户

  1. 安装迁移工具
    yum install -y migrationtools
  2. vi /usr/share/migrationtools/migrate_common.ph,修改默认dc
    # Default DNS domain
    $DEFAULT_MAIL_DOMAIN = "yaoge123.com";
    
    # Default base
    $DEFAULT_BASE = "dc=yaoge123,dc=com";
    
  3. 处理一下passwd和group,把系统账号都去掉,对于RHEL7/CentOS7来说,系统账号都是<1000的,migrate_passwd.pl会从/etc/shadow提取密码信息
    grep ":10[0-9][0-9]" /etc/passwd > passwd
    grep ":10[0-9][0-9]" /etc/group > group
    /usr/share/migrationtools/migrate_passwd.pl passwd users.ldif
    /usr/share/migrationtools/migrate_group.pl group groups.ldif
  4. 导入LDAP中,输入RootDN密码
    ldapadd -x -W -D "cn=Manager,dc=yaoge123,dc=com" -H ldapi:/// -f users.ldif
    ldapadd -x -W -D "cn=Manager,dc=yaoge123,dc=com" -H ldapi:/// -f groups.ldif
    
  5. 创建index.ldif,做一些索引,最好日志中没有bdb_equality_candidates
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    add: olcDbIndex
    olcDbIndex: uid,uidNumber,gidNumber,member,memberUid eq
  6. 导入LDAP中
    ldapmodify -Y EXTERNAL -H ldapi:/// -f index.ldif

修改LDAP ACL:

  1. 密码和密码修改时间,RootDN可管理,自己可写,同步用户可读,匿名和普通用户只能Bind进行认证
  2. 其它所有RootDN可管理,匿名和普通用户可读
  3. 以上ACL保证了密码安全性,做成一个access.ldif文件
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcAccess
    olcAccess: {0}to dn.children="dc=nnlmhpcc" attrs=userPassword,shadowLastChange
      by dn="cn=Manager,dc=nnlmhpcc" manage
      by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
      by dn="cn=ldapreader,dc=nnlmhpcc" read
      by self write
      by * auth
    olcAccess: {1}to *
      by dn="cn=Manager,dc=nnlmhpcc" manage
      by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
      by * read
    
  4. 导入LDAP中,输入RootDN密码
    ldapmodify -Y EXTERNAL -H ldapi:/// -f access.ldif
  5. 确认匿名和普通用户无法查看密码,两台LDAP同步正常(含密码),用户自己可以自己修改密码
  6. 如果有问题,用ldapmodify -Y EXTERNAL -H ldapi:/// -f导入下面的文件打开ACL的日志检查,检查完别忘了把ACL日志关掉
    dn: cn=config
    changetype: modify
    replace: olcLogLevel
    olcLogLevel: acl stats stats2 shell sync

LDAP认证的客户端:

  1. 安装nss-pam-ldapd
    yum install -y nss-pam-ldapd
  2. 配置普通用户使用LDAP认证,因为已经使用ldaps故需disableldaptls,bashdn下必须包含People和Group
    authconfig --enableldap --enableldapauth --ldapserver="ldaps://ldap1,ldaps://ldap2" --ldapbasedn="dc=yaoge123,dc=com" --disableldaptls --ldaploadcacert=http://www.yaoge123.com/ca-cert.pem --updateall
  3. 测试用户登录、修改密码是否正常。

对于虚拟化部署的ldap1和ldap2,需要添加规则让两个虚机不在同一个主机上运行。

集群节点较多时,slapd会报错Too many open files。参考http://smilejay.com/2016/06/centos-7-systemd-conf-limits/和http://www.cnblogs.com/chris-cp/p/6667753.html,修改slapd的Max open files限制, 查看限制:

grep files /proc/`pidof slapd`/limits

 

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据