(以下步骤对所有节点操作)
环境准备
时间同步
ntpdate ntp1.tencent.com
OpenLDAP 两个机器上都要安装
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools
启动OpenLDAP服务
systemctl start slapd
systemctl enable slapd
查看版本
slapd -VV
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap -R /var/lib/ldap/
chmod 700 -R /var/lib/ldap
设置OpenLDAP 的管理员密码(密码为Admin@123#!)
slappasswd -s Admin@123#!
{SSHA}6D/mgKyIa4jPyFE81eJhZOwXHxMvwozr
生成changepwd.ldif 文件
cat >changepwd.ldif <<EOF
#this is OpenLDAP admin password
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}6D/mgKyIa4jPyFE81eJhZOwXHxMvwozr EOF
导入 changepwd.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif
温馨提示:如果上面的命令出现下面报错:
[root@openldap-master opt]# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={0}config,cn=config" ldap_modify: Inappropriate matching (18) additional info: modify/add: olcRootPW: no equality matching rule
解决办法:修改modify.ldif中对应选项的"add"为"replace"即可
导入基本模式
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f \ /etc/openldap/schema/inetorgperson.ldif
生成配changedomain.ldif 文件
cat > changedomain.ldif << EOF
#this id DB domain config
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=admin,dc=daemon,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=daemon,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=daemon,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}6D/mgKyIa4jPyFE81eJhZOwXHxMvwozr
EOF
注:olcRootPw 中的密码要与生成配changedomain.ldif 文件 一样。
ldapadd -Y EXTERNAL -H ldapi:/// -f changedomain.ldif
温馨提示:如果上面的命令出现下面报错:
....... ldap_modify: Inappropriate matching (18) additional info: modify/add: olcRootPW: no equality matching rule
解决办法:将chdomain.ldif文件中的"add"全部替换成"replace",然后重新执行上面命令即可!
cat >disable_anamouse.dif << EOF
dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon
dn: cn=config
changetype: modify
add: olcRequires
olcRequires: authc
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcRequires
olcRequires: authc
EOF
导入配置
ldapadd -Y EXTERNAL -H ldapi:/// -f disable_anamouse.dif
生成基础域信息
cat >base.ldif << EOF
#this base domain
dn: dc=daemon,dc=com
o: daemon.com
dc: daemon
objectClass: top
objectClass: dcObject
objectclass: organization
dn: cn=admin,dc=daemon,dc=com
cn: admin
objectClass: organizationalRole
description: Directory Manager
EOF
导入配置
ldapadd -x -D cn=admin,dc=daemon,dc=com -w Admin@123#! -f base.ldif
很多场景下,我们需要快速的查询某一个用户是属于哪一个或多个组的(member of)。memberOf 正是提供了这样的一个功能:如果某个组中通过 member 属性新增了一个用户,OpenLDAP 便会自动在该用户上创建一个 memberOf 属性,其值为该组的 dn。遗憾的是,OpenLDAP 默认并不启用这个特性,因此我们需要通过相关的配置开启它。
注意:
生成memberof.ldif文件
cat >memberof.ldif << EOF
#this is enable memberof
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModuleLoad: memberof
olcModulePath: /usr/lib64/openldap
dn: olcOverlay=memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
EOF
生成refint1.ldif文件
cat >refint1.ldif << EOF
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
EOF
生成refint2.ldif 文件
cat> refint2.ldif<< EOF
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
EOF
执行导入配置
ldapadd -Y EXTERNAL -H ldapi:/// -f memberof.ldif
ldapmodify -Y EXTERNAL -H ldapi:/// -f refint1.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f refint2.ldif
查看是否加载memberof模块
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn|grep memberof
生成logLevel.ldif文件
cat> loglevel.ldif<< EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF
导入logLevel.ldif
ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif
创建slapd.log文件
touch /var/log/openldap/slapd.log
vim /etc/rsyslog.conf +73 #"+73"表示指定位到文件73行
.......
local4.* /var/log/slapd.log
添加LDAP密码审计模块
cat> auditlog<< EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {1}auditlog
dn: olcOverlay=auditlog,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcAuditLogConfig
olcAuditlogFile: /var/log/openldap/auditlog.log
EOF
导入配置
touch /var/log/openldap/auditlog.log
ldapmodify -Y EXTERNAL -H ldapi:/// -f auditlog.ldif
重启系统日志服务与ldap服务
systemctl restart rsyslog
systemctl restart slapd
systemctl status slapd
[root@openldap-master opt]# tail -f /var/log/slapd.log May 17 18:24:38 openldap-master slapd[26195]: daemon: shutdown requested and initiated. May 17 18:24:38 openldap-master slapd[26195]: slapd shutdown: waiting for 0 operations/tasks to finish May 17 18:24:38 openldap-master slapd[26195]: slapd stopped. May 17 18:24:38 openldap-master slapd[26399]: @(#) $OpenLDAP: slapd 2.4.44 (Apr 12 2018 19:17:38) $#012#011mockbuild@x86-01.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd May 17 18:24:39 openldap-master slapd[26402]: slapd starting
通过OpenLDAP服务端定制用户密码策略,需要在服务端加载ppolicy模块。
添加 ppolicy.la模块
cat >policy.ldif << EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {3}ppolicy.la
EOF
导入配置
ldapadd -y EXTERNAL -H ldapi:/// -f ppolicy.ldif
创建ou
cat >ou.ldif << EOF
dn: ou=shangjiankeji,dc=daemon,dc=com
ou: shangjiankeji
objectClass: organizationalUnit
objectClass: top
dn: ou=People,dc=daemon,dc=com
ou: People
objectClass: organizationalUnit
objectClass: top
EOF
创建两个OU:shangjiankeji和People
ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f ou.ldif
创建group
cat > group.ldif << EOF
dn: cn=ops,ou=Group,dc=daemon,dc=com
cn: ops
objectClass: top
objectClass: groupOfUniqueNames
uniqueMember:
dn: cn=dev,ou=Group,dc=daemon,dc=com
cn: dev
objectClass: top
objectClass: groupOfUniqueNames
uniqueMember:
EOF
创建两个组ops和dev组
ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w ' Admin@123#! ' -f group.ldif
创建 user
cat > user.ldif << EOF
dn: uid=user01,ou=People,dc=daemon,dc=com
cn: user01
objectClass: top
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: posixaccount
loginShell: /bin/bash
sn: user01
homeDirectory: /home/dev
uid: user01
mail: user01@daemon.com
mobile: 0
uidNumber: 1001
gidNumber: 0
userPassword: 123456
dn: uid=user02,ou=People,dc=daemon,dc=com
cn: user02
objectClass: top
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: posixaccount
loginShell: /bin/bash
sn: user02
homeDirectory: /home/dev
uid: user02
mail: user02@daemon.com
mobile: 0
uidNumber: 1002
gidNumber: 0
userPassword: 123456
EOF
创建 两个用户user01、user02
ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f user.ldif
将用户user01加入dev组,user02 加入ops组
cat > add-group.ldif << EOF
dn: cn=dev,ou=Group,dc=daemon,dc=com
changetype: modify
add: uniqueMember
uniqueMember: uid=user01,ou=People,dc=daemon,dc=com
dn: cn=ops,ou=Group,dc=daemon,dc=com
changetype: modify
add: uniqueMember
uniqueMember: uid=user02,ou=People,dc=daemon,dc=com
EOF
ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f add-group.ldif
查看用户的memoberof 属性
ldapsearch -x -H ldap://127.0.0.1 -b dc=daemon,dc=com -D "cn=admin,dc=daemon,dc=com" -W memberOf
注意:memberOf 属性是 groupOfNames objectClass 的一部分。我们不能同时使用 posixGroup 和 groupOfNames,因为它们都是 STRUCTURAL 对象类(一个条目只能有一个 STRUCTURAL 对象类)。
在master上启用添加syncprov模块来实现主从复制功能点,通过ldif文件来增加syncprov模块,无需重启ldap server。
添加syncprov模块
cat >mod_syncprov.ldif << EOF
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la
EOF
导入配置
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
生成syncprov.ldif 文件
cat> syncprov.ldif << EOF
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
EOF
注:
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
同样,在slave上也需要配置syncrepl,因为syncrepl实现的主从复制是单向的,即master的所有操作都会同步到slave上,slave无法同步到master上,为了避免master与slave上的数据不一致,slave上禁止对ldap信息的增删改操作,只允许查询操作。因为是单向的,故slave需要一些master的认证信息,以便从master同步数据。
生成syncrepl.ldif 文件
cat > syncrepl.ldif<< EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://172.28.1.6:389/
bindmethod=simple
binddn="cn=admin,dc=daemon,dc=com"
credentials=Admin@123#!
searchbase="dc=daemon,dc=com"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="5 5 300 +"
attrs="*,+"
interval=00:00:00:3
EOF
参数说明:
导入配置
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
注:这里为docker安装
前提条件:请安装docker环境
cat >restart_ldap_php_admin.sh << EOF
#/bin/bash
docker rm -f ldap-php-admin || echo "ok"
docker run --name ldap-php-admin \
-p 8080:80 \
--privileged \
--restart=always \
--env PHPLDAPADMIN_HTTPS=false \
--env PHPLDAPADMIN_LDAP_HOSTS=172.28.1.6 \
--detach osixia/phpldapadmin:stable
EOF
参数说明:
具体参数详见 :osixia/docker-phpLDAPadmin: A docker image to run phpLDAPadmin 🐳 (github.com)
这里为docker安装.
前提条件:
mkdir /data/openldap/self-password/conf -p
docker run -d --name self-password docker.io/ltbproject/self-service-password:1.4.3
docker cp self-assword:/var/www/conf/config.inc.php /data/openldap/self-password/conf
chmod -R 777 /data/openldap/self-password/conf
编辑config.inc.php 配置文件
找到以下内容:
$debug = false;
# LDAP
$ldap_url = "ldap://172.28.1.6:389"; ##ldap masterIP地址
$ldap_starttls = false;
$ldap_binddn = "cn=admin,dc=daemon,dc=com"; #ldap 域管理员
$ldap_bindpw = 'Admin@123#!'; # ldap管理员密码
// for GSSAPI authentication, comment out ldap_bind* and uncomment ldap_krb5ccname lines
//$ldap_krb5ccname = "/path/to/krb5cc";
$ldap_base = "dc=daemon,dc=com"; #域信息
$ldap_login_attribute = "uid"; #用户登录uid
$ldap_fullname_attribute = "cn"; #用户名称
$ldap_filter = "(&(objectClass=person)($ldap_login_attribute={login}))";
$ldap_use_exop_passwd = false;
$ldap_use_ppolicy_control = false;
……………………
$hash = "MD5"; ## 这里为密码的加模式,默认为明文"clear" ,为了安全一定要修改为MD5 或其它加密模式。
允许授权php操作ldap,否则无法通过自助修改密码服务修改用户密码
在ldap 主节点操作
cat >ldap_php.ldif << EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword
by self =xw
by anonymous auth
by * none
olcAccess: {1}to * by * read
EOF
导入配置 :
ldapadd -Y EXTERNAL -H ldapi:/// -f ldap_php.ldif
生成自助修改密码 启动脚本
cat >restart_self-service-password.sh << EOF
#!/bin/bash
docker rm -f self-password || echo "OK"
docker run -d --name self-password -p 80:80 \
-v /data/openldap/self-password/conf:/var/www/conf \
docker.io/ltbproject/self-service-password:1.4.3
EOF
启动
sh restart_self-service-password.sh
通过ldapadmin工具修改后的密码为密文
(任意节点操作)
1.下载cfssl工具
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/bin/cfssl-certinfo
chmod +x /usr/bin/cfssl /usr/bin/cfssljson /usr/bin/cfssl-certinfo
2.创建证书临时目录
mkdir /data/openldap/ssl && cd /data/openldap/ssl
# ca配置文件
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"ldap": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
expiry 为证书的有效时间,这里为10年。
# 自签名ca的证书申请
cat > ldap-ca-csr.json << EOF
{
"CN": "ldap",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "ldap",
"OU": "LDAP Security"
}
]
}
EOF
# ldap证书申请资料
cat > ldap-csr.json << EOF
{
"CN": "ldap",
"hosts": [
"127.0.0.1",
"172.28.0.0/16",
"ldap.ops.prod.daemon.tech"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "ldap",
"OU": "LDAP Security"
}
]
}
EOF
注意:
生成CA自签名证书
cfssl gencert -initca ldap-ca-csr.json | cfssljson -bare ca
# LDAP证书签名,ldap需要的文件为:ca证书,ldap证书,ldap私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=ldap ldap-csr.json | cfssljson -bare ldap
# 查看生成的证书
# 其中 ldap-key.pem ldap.pem ca.pem 是我们需要的
ls ldap-key.pem ldap.pem ca.pem
(所有节点操作)
1.将生成的证书上传至LDAP服务器
注:/etc/openldap/certs 为ldap默认存放目录
cp ca.pem /etc/openldap/certs/ca-bundle.crt
cp ldap.pem /etc/openldap/certs/server.crt
cp ldap-key.pem /etc/openldap/certs/server.key
chown ldap.ldap /etc/openldap/certs -R
2.生成mod_ssl.ldif文件
cat > mod_ssl.ldif << EOF
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/ca-bundle.crt
dn: cn=config
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/server.crt
dn: cn=config
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
EOF
执行
ldapmodify -Y EXTERNAL -H ldapi:/// -f mod_ssl.ldif
注意:该 命令大概率会失败,报如下错误
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0modifying entry "cn=config" ldap_modify: Other (e.g., implementation specific) error (80)
需要检查/etc/openldap/certs目录下的ldap.crt、ldap.key、CA.pem这三个文件的权限是否为644,可能还会继续出现该错误,如果出现,则忽略跳过,执行下面的。
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config"
执行ldapmodify命令出现的结果: modifying entry "cn=config"ldap_modify: Inappropriate matching (18) additional info: modify/add: olcTLSCACertificateFile: no equality matching rule
如报上述错误,暂时不知原因,可以跳过进行以下步骤
l直接编辑/etc/openldap/slapd.d/cn=config.ldif文件
注:一般情况下不直接修改
更改服务配置文件/etc/openldap/ldap.conf
vim /etc/openldap/ldap.conf
# 配置认证方式
TLS_REQCERT never
设置是否验证客户端发起的tls连接。
重启openldap server服务
systemctl start slapd
#查看重启后的服务状态
systemctl status slapd
配置 LDAP Server 的SSL/TLS的安全性
cat >tls.1.2.ldif << EOF
dn: cn=config
changetype: modify
add: olcTLSProtocolMin
olcTLSProtocolMin: 3.3
dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: ECDHE-RSA-AES256-SHA384:AES256-SHA256:!RC4:HIGH:!MD5:!aNULL:!EDH:!EXP:!SSLV2:!eNULL
dn: cn=config
changetype: modify
add: olcTLSDHParamFile
olcTLSDHParamFile: /etc/openldap/certs/slapd.dh.params
EOF
注:
创建DH参数文件
openssl dhparam -out /etc/openldap/certs/slapd.dh.params.tmp 1024
mv /etc/openldap/certs/slapd.dh.params.tmp /etc/openldap/certs/slapd.dh.params
ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.1.2.ldif
使用TLS=required配置OpenLDAP
注:
此步骤为强制启用TLS加密 ,只允许 客户端通过加密码端口(默认636)进行连接。如果想手动指定 ,请忽略该步骤。
cat > force-ssl.ldif << EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1
EOF
注:执行命令导入配置到/etc/openldap/slapd.d/cn=config/ olcDatabase={2}hdb.ldif文件中
ldapmodify -v -Y EXTERNAL -H ldapi:/// -f force-ssl.ldif
修改/etc/sysconfig/slapd文件
增加ldaps:///
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"
systemctl restart slapd
systemctl status slapd
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。