目标是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基本配置
- 创建db.ldif,内容见后
- olcRootDN就是LDAP的超级用户
- 用slappasswd生成密码的哈希填入olcRootPW中做为olcRootDN的密码
- 修改dc=为自己的域
- 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
- 用ldapmodify导入
ldapmodify -Y EXTERNAL -H ldapi:/// -f db.ldif
生成证书并设置TLS
- OpenLDAP默认使用明码传输,为了加密数据必须生成证书并配置TLS
- 在一个安全的服务器上生成CA的私钥和证书,有效期20年
openssl req -new -x509 -nodes -out ca-cert.pem -keyout ca-key.pem -days 7305
- 在LDAP服务器生成私钥和证书请求,证书CN需为客户端访问使用的地址(域名、机器名、IP)
openssl req -new -nodes -out cert.csr -keyout key.pem
- 用CA签发证书,有效期20年
openssl x509 -req -in cert.csr -CAkey ca-key.pem -CA ca-cert.pem -out cert.pem -set_serial 01 -days 7305
- 把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
- 创建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
- 用ldapmodify导入
ldapmodify -Y EXTERNAL -H ldapi:/// -f certs.ldif
- 修改LDAP服务端配置/etc/sysconfig/slapd,只启用ldapi和ldaps
SLAPD_URLS="ldapi:/// ldaps:///"
- 重启LDAP服务
systemctl restart slapd.service
- 验证TLS,可以看到证书链中有CA和LDAP服务器两个证书,最后显示Verify return code: 0 (ok)
openssl s_client -connect ldap1:636 -showcerts -state -CAfile /etc/openldap/certs/ca-cert.pem
- ldap1已完成,从3.生成私钥和证书请求开始为ldap2配置,注意签发证书时set_serial需要不同,签发证书有效期需在CA证书有效期内
- 检查证书
openssl req -in cert.csr -noout -text //查看证书请求文件 openssl x509 -in cert.pem -noout -text //查看证书
创建自己的域
- 创建一个文本文件base.ldif,内容见后
- 修改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
- 用ldapadd导入,输入RootDN密码
ldapadd -x -W -D cn=Manager,dc=yaoge123,dc=com -H ldapi:/// -f base.ldif
LDAP复制
- OpenLDAP 2.4支持5种复制方式,其中MirrorMode提供LDAP读写高可用性,双机Active-Active Hot-Standby,前端写入一个服务器即可,双机互相同步复制,只有一个服务器的情况下也支持写入
- 创建mod_syncprov.ldif
dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulePath: /usr/lib64/openldap olcModuleLoad: syncprov.la
- 用ldapadd导入
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
- 创建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
- 用ldapmodify导入
ldapmodify -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
- 创建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
- 用ldapadd导入,输入RootDN密码
ldapadd -x -W -D cn=Manager,dc=yaoge123,dc=com -H ldapi:/// -f syncuser.ldif
- 创建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
- 在ldap1上用ldapmodify导入
ldapmodify -Y EXTERNAL -H ldapi:/// -f ldap1sync.ldif
- 创建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
- 在ldap2上用ldapmodify导入
ldapmodify -Y EXTERNAL -H ldapi:/// -f ldap2sync.ldif
- 修改其中一个服务器上的LDAP,查看另一个服务器是否自动同步。
- 如果同步有问题,用调试模式运行ldap
/usr/sbin/slapd -u ldap -g ldap -h "ldapi:// ldaps://" -d -1
迁移已有用户
- 安装迁移工具
yum install -y migrationtools
- vi /usr/share/migrationtools/migrate_common.ph,修改默认dc
# Default DNS domain $DEFAULT_MAIL_DOMAIN = "yaoge123.com"; # Default base $DEFAULT_BASE = "dc=yaoge123,dc=com";
- 处理一下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
- 导入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
- 创建index.ldif,做一些索引,最好日志中没有bdb_equality_candidates
dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcDbIndex olcDbIndex: uid,uidNumber,gidNumber,member,memberUid eq
- 导入LDAP中
ldapmodify -Y EXTERNAL -H ldapi:/// -f index.ldif
修改LDAP ACL:
- 密码和密码修改时间,RootDN可管理,自己可写,同步用户可读,匿名和普通用户只能Bind进行认证
- 其它所有RootDN可管理,匿名和普通用户可读
- 以上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
- 导入LDAP中,输入RootDN密码
ldapmodify -Y EXTERNAL -H ldapi:/// -f access.ldif
- 确认匿名和普通用户无法查看密码,两台LDAP同步正常(含密码),用户自己可以自己修改密码
- 如果有问题,用ldapmodify -Y EXTERNAL -H ldapi:/// -f导入下面的文件打开ACL的日志检查,检查完别忘了把ACL日志关掉
dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: acl stats stats2 shell sync
LDAP认证的客户端:
- 安装nss-pam-ldapd
yum install -y nss-pam-ldapd
- 配置普通用户使用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
- 测试用户登录、修改密码是否正常。
对于虚拟化部署的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