openldap tls 高可用部署

openldap tls 高可用部署

LDAP相关概念
dn(Distinguished Name):区分名称,LDAP中每个条目都有自己的dn,dn是该条目在整棵树中的唯一标识,如同文件系统中,带路径的文件名就是DN。
rdn(Relative dn):相对区别名称,好比linux中的相对路径。
dc(Domain Component):域名组件。其格式是将完整的域名分成几部分,如将http://example.com变成
dc=example,dc=com。

uid(User ID):用户ID,如 san.zhang。
ou(Organization Unit):组织单元。
cn(Common Name):公共名称。
sn(surname):姓氏。
c(Country):国家,如“CN”或者“US”。
o(Organization):组织名,如XXX银行,XXX部门,XXX公司等等。

一、安装openldap
1. 使用yum命令安装openldap
yum install  -y openldap compat-openldap openldap-clients openldap-servers openldap-devel

2. 签发证书
生成CA根证书的步骤
生成CA私钥(.key)-->生成CA证书请求(.csr)-->自签名得到根证书(.crt)

# Generate CA private key 
openssl genrsa -out ca.key 2048 

# Generate CSR  生成.csr文件时,需要在提示下输入组织相关的信息
openssl req -new -key ca.key -out ca.csr

# Generate Self Signed certificate(CA 根证书)
openssl x509 -req -days 36500 -in ca.csr -signkey ca.key -out ca.crt
#Signature ok
#subject=/C=CN/ST=HZ/L=Hangzhou/O=Vimll/OU=vimll/CN=vimll.com/emailAddress=admin@vimll.com
#Getting Private key
通常情况,我们部署在内网的服务会采用这种自签名的证书,只有部署公网服务时才会向CA机构申请证书。

生成用户证书的步骤
生成私钥(.key)-->生成证书请求(.csr)-->用CA根证书签名得到证书(.crt)

# private key
openssl genrsa -out server.key 2048 

# generate csr
openssl req -new -key server.key -out server.csr

cp /etc/pki/tls/openssl.cnf ./
mkdir -p newcerts
touch index.txt
echo "00" > serial

vim /etc/pki/tls/openssl.cnf
dir             = /nfs/tang/k8s/certs
# generate certificate
openssl ca -days 36500 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt -config openssl.cnf

TLSCACertificateFile /nfs/tang/k8s/certs/ca.crt
TLSCertificateFile /nfs/tang/k8s/certs/server.crt
TLSCertificateKeyFile /nfs/tang/k8s/certs/server.key

3. OpenLDAP的相关配置文件信息
/etc/openldap/slapd.conf:OpenLDAP的主配置文件,记录根域信息,管理员名称,密码,日志,权限等
/etc/openldap/slapd.d/*:这下面是/etc/openldap/slapd.conf配置信息生成的文件,每修改一次配置信息,这里的东西就要重新生成
/etc/openldap/schema/*:OpenLDAP的schema存放的地方
/var/lib/ldap/*:OpenLDAP的数据文件
/usr/share/openldap-servers/slapd.conf.obsolete 模板配置文件
/usr/share/openldap-servers/DB_CONFIG.example 模板数据库配置文件
OpenLDAP监听的端口: 默认监听端口:389(明文数据传输) 加密监听端口:636(密文数据传输)

4. 实现mirror mode模式
vim /etc/openldap/slapd.conf
在/etc/openldap目录下编辑添加slapd.conf配置文件,添加如下内容:

cat > /etc/openldap/slapd.conf << EOF
################导入schema##############
#导入核心的schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.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
################导入schema##############

#接受LDAP2绑定请求
allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
#日志级别设置
# 设置-1能记录更多日志
loglevel -1  
# loglevel 296

################模块设置################
#指定模块的路径,modulepath可以配置多个
modulepath /usr/lib64/openldap
moduleload syncprov.la
################模块设置################

################开启sasl设置,默认关闭###
#TLSCACertificatePath /etc/openldap/certs
#TLSCertificateFile "\"OpenLDAP Server\""
#TLSCertificateKeyFile /etc/openldap/certs/password
################开启sasl设置,默认关闭###

################进行全局设置#############
#设置serverID,采用mirror mode模式进行部署,需保证两台服务的serverID不同,一台为1、一台为2,必须使用hostname进行配置,否则无法启动成功
serverID 1 ldap://k8s01
serverID 2 ldap://k8s02
serverID 3 ldap://k8s03
################进行全局设置#############

################数据库权限控制###########
#数据库通用权限配置,会配置到olcDatabase={-1}frontend.ldif该文件中,访问所有数据库的通用权限
access to * 
        by anonymous auth 
        by self write 
        by users read
#config数据库配置
database config
#数据库管理员账户
rootdn "cn=config"
#数据库管理员密码,使用slappasswd -s T@123命令生成,默认使用SSHA的方式进行编码,可以通过-h进行指定编码方式 slappasswd -h{md5} -s T@123
rootpw {SSHA}K3vJ69p1IBtu9rwSK4hEBogmACDzIsS7
#权限设置
access to * 
        by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage 
        by * break

#进行配置同步备份
syncrepl rid=001
              provider=ldap://k8s01
              bindmethod=simple
              binddn="cn=config"
              credentials=T@123
              searchbase="cn=config"
              schemachecking=on
              type=refreshAndPersist
              retry="60 +"

syncrepl rid=002
              provider=ldap://k8s02
              bindmethod=simple
              binddn="cn=config"
              credentials=T@123
              searchbase="cn=config"
              schemachecking=on
              type=refreshAndPersist
              retry="60 +"

syncrepl rid=003
              provider=ldap://k8s03
              bindmethod=simple
              binddn="cn=config"
              credentials=T@123
              searchbase="cn=config"
              schemachecking=on
              type=refreshAndPersist
              retry="60 +"              
#设置同步模块
overlay syncprov
#开启mirrormode设置
mirrormode on

#监控数据库配置,设置访问监控数据库的权限,开启该模块会对访问openldap服务的相关信息进行监控
database monitor
#设置访问monitor数据库的用户权限
access to *
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
        by dn.base="cn=admin,dc=vimll,dc=com" read
        by * none
################数据库权限控制###########

################数据库配置###############
#设置数据库类型为lmdb,官方推荐
database mdb
#进行权限设置
access to attrs=userPassword,shadowLastChange   
        by self write    
        by anonymous auth    
        by * none
#数据库匹配的前缀
suffix "dc=vimll,dc=com"
checkpoint 1024 15
#数据库管理员账户
rootdn "cn=admin,dc=vimll,dc=com"
#数据库管理员密码,使用slappasswd -s T@123命令生成
rootpw {SSHA}K3vJ69p1IBtu9rwSK4hEBogmACDzIsS7
#数据库存储数据路径  目录如果不存在则需要创建并授权给ldap用户
directory /var/lib/mdb
#数据库存储最大值
maxsize 1048576
#数据库索引设置,索引objectclass、cn、uid
index objectclass,entryCSN,entryUUID eq
#数据库索引设置,索引linux账户
index uid,uidNumber,gidNumber eq,pres
#数据库索引设置,索引kerberos账户,未配置kerberos可省略
index ou,krbPrincipalName eq,pres,sub
#设置同步模块
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100

#mirror mode相关设置
#rid:保证每台服务器的rid是一样的
#provider:指向另外一台服务的ldap地址
#bindmethod:制定简单的鉴权模式,表示未开启sasl或者ssl模式
#binddn:设置进行同步的账户,默认等同于数据库账户
#credentials:设置同步账户的密码,默认等同于数据库账户
#searchbase:设置同步的根路径
#schemachecking:采用refreshAndPersist
#retry:重试次数,如果同步失败,每隔60s同步一次
syncrepl rid=101
              provider=ldap://k8s01
              bindmethod=simple
              binddn="cn=admin,dc=vimll,dc=com"
              credentials=T@123
              searchbase="dc=vimll,dc=com"
              schemachecking=on
              type=refreshAndPersist
              retry="60 +"

syncrepl rid=102
              provider=ldap://k8s02
              bindmethod=simple
              binddn="cn=admin,dc=vimll,dc=com"
              credentials=T@123
              searchbase="dc=vimll,dc=com"
              schemachecking=on
              type=refreshAndPersist
              retry="60 +"

syncrepl rid=103
              provider=ldap://k8s03
              bindmethod=simple
              binddn="cn=admin,dc=vimll,dc=com"
              credentials=T@123
              searchbase="dc=vimll,dc=com"
              schemachecking=on
              type=refreshAndPersist
              retry="60 +"
#开启mirror mode模式
mirrormode on
################数据库配置###############
EOF

配置同步其他节点:
scp /etc/openldap/schema/kerberos.schema k8s02:/etc/openldap/schema/
scp /etc/openldap/schema/kerberos.schema k8s03:/etc/openldap/schema/
scp /etc/openldap/slapd.conf k8s02:/etc/openldap/
scp /etc/openldap/slapd.conf k8s03:/etc/openldap/

mkdir /var/lib/mdb/
rm -rf /var/lib/mdb/*
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/mdb/DB_CONFIG
chown ldap:ldap -R  /var/lib/mdb
chown -R ldap:ldap /etc/openldap/
systemctl enable --now slapd

rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap:ldap /etc/openldap/
systemctl restart slapd

5. 初始化根目录
openldap的根目录需要我们事先进行初始化才可用,我们使用ldapadd的命令方式向openldap服务添加根目录,具体操作如下: 编辑文件base.ldif,添加如下内容:

cat > base.ldif << EOF
dn: dc=vimll,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: JTKJ
dc: vimll

dn: ou=People,dc=vimll,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=Group,dc=vimll,dc=com
objectClass: organizationalUnit
ou: group
EOF

执行如下命令,添加根目录:
#-x表示进行简单认证,-D用来绑定服务器的DN,-w绑定DN的密码,-f使用ldif文件进行条目添加的文件
ldapadd -x -H ldap://127.0.0.1:389   -D "cn=admin,dc=vimll,dc=com" -w T@123 -f base.ldif
执行成功以后,会将根目录数据同步到两台openldap服务器上,这样就是实现mirror mode的高可用模式,可执行如下命令进行验证是否插入成功:
#-b指定要查询的根节点
ldapsearch -x -H ldap://127.0.0.1:389 -b "dc=vimll,dc=com" -D "cn=admin,dc=vimll,dc=com" -w T@123

6. 开启openldap日志访问功能
查看openldap配置是否开启日志记录功能
less /etc/openldap/slapd.d/cn\=config.ldif
#如果存在olcLogLevel:配置项的话,则已开启日志功能
olcLogLevel: Stats
如果未开启日志配置,执行如下指令,开启日志设置
编辑log_config.ldif文件,添加如下内容,保存退出,使用ldapmodify进行动态修改openldap服务配置:

cat > log_config.ldif << EOF
dn: cn=config
changetype: modify
add: olcLogLevel
#stats为打印日志的级别,可根据不同的级别设置不同的值
olcLogLevel: stats
EOF

在openldap4.X版本以后,推荐使用ldapmodify指令修改openldap的配置,而无须重启openldap服务,因此执行如下指令将需要修改的配置内容同步到cn=config.ldif配置文件中去。
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f log_config.ldif

配置方法二
# vim /etc/openldap/slapd.conf 加上loglevel -1
loglevel -1
# 这里修改了配置文件,所有得重新生成配置文件的信息
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/ 
systemctl restart slapd

配置rsyslog
修改/etc/rsyslog.conf配置文件,添加如下内容:

cat >> /etc/rsyslog.conf << EOF
local4.*  /var/log/slapd/slapd.log
EOF
然后重启rsyslog应用:

mkdir -p /var/log/slapd
chown ldap.ldap /var/log/slapd/
systemctl restart rsyslog
systemctl restart slapd
# 重启看到日志   ls /var/log/slapd/ 然后再目录/var/log/slapd/slapd.log目录下就可以看到slapd产生的日志了。

# 启用tls
cat > addcerts.ldif << EOF
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/cacerts/ca.crt
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/server.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
EOF

ldapmodify -Y EXTERNAL -H ldapi:/// -f addcerts.ldif

##所有节点
vim /etc/sysconfig/slapd
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"

vim /etc/openldap/ldap.conf
更新为:
TLS_CACERTDIR /etc/openldap/cacerts
TLS_CACERT /etc/openldap/cacerts/ca.cert.pem
TLS_REQCERT allow

#never  不需要验证 client 端的身份,Client 端只需要有 CA 证书就可以了
#allow  Server会要求 client 提供证书,如果 client 端没有提供证书,会话会正常进行
#try    Client端提供了证书,但是 Server 端有可能不能校验这个证书,这个证书会被忽略,会话正常进行
#demand Server端需要认证 client 端的身份,Client 端需要有自己的证书和私钥

systemctl restart slapd