前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第一章Open LDAP 主从同步塔建

第一章Open LDAP 主从同步塔建

原创
作者头像
Jerly.Yan
发布2022-01-11 18:42:22
3.6K0
发布2022-01-11 18:42:22
举报
文章被收录于专栏:用户8794315的专栏

1.安装openldap

(以下步骤对所有节点操作)

1.1 环境配置

环境准备

  • Centos 7.9
  • openLdap 2.44
  • master IP :172.28.1.6
  • slaveIP: 172.28.1.3
  • 域名:daemon.com

时间同步

代码语言:javascript
复制
ntpdate ntp1.tencent.com

OpenLDAP 两个机器上都要安装

代码语言:javascript
复制
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools

启动OpenLDAP服务

代码语言:javascript
复制
systemctl start slapd 
systemctl enable slapd

查看版本

代码语言:javascript
复制
slapd -VV

查看openldap版本
查看openldap版本
代码语言:shell
复制
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

1.2配置OpenLDAP 数据库

设置OpenLDAP 的管理员密码(密码为Admin@123#!)

代码语言:shell
复制
slappasswd -s Admin@123#! 
{SSHA}6D/mgKyIa4jPyFE81eJhZOwXHxMvwozr

生成changepwd.ldif 文件

代码语言:shell
复制
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

代码语言:javascript
复制
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"即可

导入基本模式

代码语言:shell
复制
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

执行导入schema
执行导入schema

1.3配置OpenLdap DB上的配置域信息

生成配changedomain.ldif 文件

代码语言:shell
复制
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 文件 一样。

代码语言:javascript
复制
ldapadd -Y EXTERNAL -H ldapi:/// -f changedomain.ldif

导入changedomain.ldif
导入changedomain.ldif

温馨提示:如果上面的命令出现下面报错:

....... ldap_modify: Inappropriate matching (18) additional info: modify/add: olcRootPW: no equality matching rule

解决办法:将chdomain.ldif文件中的"add"全部替换成"replace",然后重新执行上面命令即可!

1.4 关闭匿名用户访问

代码语言:shell
复制
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

导入配置

代码语言:javascript
复制
ldapadd -Y EXTERNAL -H ldapi:/// -f disable_anamouse.dif

生成基础域信息

代码语言:shell
复制
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

导入配置

代码语言:javascript
复制
ldapadd -x -D cn=admin,dc=daemon,dc=com -w Admin@123#! -f base.ldif
  • -w 为管理员的密码: Admin@123#!

1.5开启memeberof

很多场景下,我们需要快速的查询某一个用户是属于哪一个或多个组的(member of)。memberOf 正是提供了这样的一个功能:如果某个组中通过 member 属性新增了一个用户,OpenLDAP 便会自动在该用户上创建一个 memberOf 属性,其值为该组的 dn。遗憾的是,OpenLDAP 默认并不启用这个特性,因此我们需要通过相关的配置开启它。

注意:

  • cn=module 的名称请查看ls -l /etc/openldap/slapd.d/cn\=config/ |grep module 如果没有直接写module ,Docker中默认为module{0};
  • olcDatabase={2}hdb 请确认ls -l /etc/openldap/slapd.d/cn=config/ |grep olcDatabase 的名称,docker中默认的为{1}mdb,Centos rpm 安装默认为{2}hdb。
  • /usr/lib64/openldap 为ldap 模块路径,不同系统的路径不同,Centos 的默认路径为/usr/lib64/openldap ,Ubuntu 系统下的默认路径为/var/lib/ldap

生成memberof.ldif文件

代码语言:shell
复制
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文件

代码语言:shell
复制
cat >refint1.ldif << EOF
dn: cn=module{0},cn=config 
add: olcmoduleload 
olcmoduleload: refint 
EOF

生成refint2.ldif 文件

代码语言:shell
复制
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

执行导入配置

代码语言:shell
复制
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
添加memberof

查看是否加载memberof模块

代码语言:shell
复制
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn|grep memberof

查看是否加载memberof 模块
查看是否加载memberof 模块

1.6开启日志配置

生成logLevel.ldif文件

代码语言:shell
复制
cat> loglevel.ldif<< EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF

导入logLevel.ldif

代码语言:shell
复制
ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif

创建slapd.log文件

代码语言:shell
复制
touch /var/log/openldap/slapd.log
vim /etc/rsyslog.conf +73 #"+73"表示指定位到文件73行
 ....... 
local4.* /var/log/slapd.log

添加LDAP密码审计模块

代码语言:shell
复制
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

导入配置

代码语言:javascript
复制
touch /var/log/openldap/auditlog.log
ldapmodify -Y EXTERNAL -H ldapi:/// -f auditlog.ldif

重启系统日志服务与ldap服务

代码语言:shell
复制
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

1.7添加ppolicy.la模块

通过OpenLDAP服务端定制用户密码策略,需要在服务端加载ppolicy模块。

添加 ppolicy.la模块

代码语言:javascript
复制
cat >policy.ldif << EOF 
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {3}ppolicy.la
EOF

导入配置

代码语言:javascript
复制
ldapadd -y EXTERNAL -H ldapi:/// -f ppolicy.ldif

1.8 创建OpenLDAP 条目树

创建ou

代码语言:shell
复制
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

代码语言:javascript
复制
ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f ou.ldif

创建group

代码语言:javascript
复制
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组

代码语言:javascript
复制
ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w ' Admin@123#! ' -f group.ldif

创建 user

代码语言:shell
复制
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

代码语言:shell
复制
ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f user.ldif

将用户user01加入dev组,user02 加入ops组

代码语言:shell
复制
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

代码语言:javascript
复制
ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f add-group.ldif

查看用户的memoberof 属性

代码语言:javascript
复制
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 对象类)。

2.openLDAP 主从模式配置

2.1 主节点配置

在master上启用添加syncprov模块来实现主从复制功能点,通过ldif文件来增加syncprov模块,无需重启ldap server。

添加syncprov模块

代码语言:shell
复制
cat >mod_syncprov.ldif << EOF
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la
EOF

导入配置

代码语言:shell
复制
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif

生成syncprov.ldif 文件

代码语言:javascript
复制
cat> syncprov.ldif << EOF
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
EOF

注:

  • olcSpCheckpoint: 100 10 表示同步的满足条件,当满足修改100个条目或者1分钟主动进行推送一次;
  • olcSpSessionLog: 100 会话日志条目的最大数量
代码语言:shell
复制
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif

2.2 从节点配置

同样,在slave上也需要配置syncrepl,因为syncrepl实现的主从复制是单向的,即master的所有操作都会同步到slave上,slave无法同步到master上,为了避免master与slave上的数据不一致,slave上禁止对ldap信息的增删改操作,只允许查询操作。因为是单向的,故slave需要一些master的认证信息,以便从master同步数据。

生成syncrepl.ldif 文件

代码语言:javascript
复制
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 

参数说明:

  • provider 为ldap master的地址 ;
  • binddn:为域的基本信息,注这里一定要用管理员进行登录,否则同步不到用户的密码。
  • credentials: ldap管理员的密码
  • searchbase:选择要同步的独立域,根节点
  • scope:设置所有的条目匹配
  • schemachecking:设置同步更新时间检测
  • type:同步模式为refreshAndPersist, refreshOnly 模式下后续操作由客户端轮询完成
  • retry:同步更新重试次数和时间刚开始的5秒重试5次,以后每300秒重试一次
  • attrs:复制全部属性
  • interval 这里设置更新时间,这里为3秒一次,倒数第二个是分钟 以此类推。

导入配置

代码语言:javascript
复制
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif

3.phpldapadmin 安装

注:这里为docker安装

前提条件:请安装docker环境

代码语言:javascript
复制
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

参数说明:

  • PHPLDAPADMIN_LDAP_HOSTS :为ldap master IP
  • PHPLDAPADMIN_HTTPS :false 禁用https访问

具体参数详见 :osixia/docker-phpLDAPadmin: A docker image to run phpLDAPadmin 🐳 (github.com)

4.用户密码自助修改密码服务

这里为docker安装.

前提条件:

  • 服务器需要安装docker环境
  • 为了方便管理将容器中的配置文件映射到本地。
代码语言:shell
复制
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 配置文件

找到以下内容:

代码语言:javascript
复制
$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 主节点操作

代码语言:shell
复制
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 

导入配置 :

代码语言:shell
复制
ldapadd -Y EXTERNAL -H ldapi:/// -f ldap_php.ldif

生成自助修改密码 启动脚本

代码语言:shell
复制
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

启动

代码语言:shell
复制
sh restart_self-service-password.sh

通过ldapadmin工具修改后的密码为密文

5.启用openldap TLS 加密

5.1生成自签名证书

(任意节点操作)

1.下载cfssl工具

代码语言:shell
复制
 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.创建证书临时目录

代码语言:javascript
复制
mkdir /data/openldap/ssl && cd /data/openldap/ssl

# ca配置文件

代码语言:javascript
复制
 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的证书申请

代码语言:javascript
复制
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证书申请资料

代码语言:javascript
复制
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

注意:

  • 上面hosts字段里就是使用这张证书的主机
  • 特别注意一定要加上宿主机的IP地址和slave的地址,这里我加的是整个地址段
  • 加上本机回环地址,如果是容器加上容器名
  • 如果你要放到公网去的话,那可以加上FQDN地址

生成CA自签名证书

代码语言:javascript
复制
cfssl gencert -initca ldap-ca-csr.json | cfssljson -bare ca

# LDAP证书签名,ldap需要的文件为:ca证书,ldap证书,ldap私钥

代码语言:javascript
复制
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 是我们需要的

代码语言:javascript
复制
ls ldap-key.pem ldap.pem ca.pem

5.2 启用 OpenLDAP TLS 模块

(所有节点操作)

1.将生成的证书上传至LDAP服务器

注:/etc/openldap/certs 为ldap默认存放目录

代码语言:shell
复制
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文件

代码语言:shell
复制
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

执行

代码语言:javascript
复制
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

代码语言:javascript
复制
vim /etc/openldap/ldap.conf 

# 配置认证方式

代码语言:javascript
复制
TLS_REQCERT never

设置是否验证客户端发起的tls连接。

  • never:默认选项,不验证客户端证书。
  • allow:检查客户端证书,没有证书或证书错误,都允许连接。
  • try:检查客户端证书,没有证书(允许连接),证书错误(终止连接)。
  • demand | hard | true:检查客户端证书,没有证书或证书错误都将立即终止连接。

重启openldap server服务

代码语言:javascript
复制
systemctl start slapd

#查看重启后的服务状态

代码语言:javascript
复制
systemctl status slapd

配置 LDAP Server 的SSL/TLS的安全性

代码语言:javascript
复制
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

注:

  • olcTLSProtocolMin: 3.3 Support TLSv1.2 or better
  • olcTLSCipherSuite: ECDHE-RSA-AES256-SHA384:AES256-SHA256:!RC4:HIGH:!MD5:!EDH:!EXP:!SSLV2:!eNULL Strongest available ciphers only

创建DH参数文件

代码语言:javascript
复制
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

创建HD参数文件
创建HD参数文件
代码语言:javascript
复制

ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.1.2.ldif

使用TLS=required配置OpenLDAP

注:

此步骤为强制启用TLS加密 ,只允许 客户端通过加密码端口(默认636)进行连接。如果想手动指定 ,请忽略该步骤。

代码语言:javascript
复制
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文件中

代码语言:shell
复制
ldapmodify -v -Y EXTERNAL -H ldapi:/// -f force-ssl.ldif

修改/etc/sysconfig/slapd文件

增加ldaps:///

代码语言:javascript
复制
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"
代码语言:javascript
复制
systemctl restart slapd 
systemctl status slapd

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.安装openldap
    • 1.1 环境配置
      • 1.2配置OpenLDAP 数据库
        • 1.3配置OpenLdap DB上的配置域信息
          • 1.4 关闭匿名用户访问
            • 1.5开启memeberof
              • 1.6开启日志配置
                • 1.7添加ppolicy.la模块
                  • 1.8 创建OpenLDAP 条目树
                  • 2.openLDAP 主从模式配置
                    • 2.1 主节点配置
                      • 2.2 从节点配置
                      • 3.phpldapadmin 安装
                      • 4.用户密码自助修改密码服务
                      • 5.启用openldap TLS 加密
                        • 5.1生成自签名证书
                          • 5.2 启用 OpenLDAP TLS 模块
                          相关产品与服务
                          容器服务
                          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档