ldap集群搭建
操作步骤
- 3.0之前的步骤ldap-master 和ldap-slave 都要执行
- 3.0之后的步骤看小标题分别执行
- 参考链接
1.0 节点信息
节点 | 角色 | 系统版本 |
---|---|---|
192.168.1.1 | ldap-master | CentOS 7.9.2009 |
192.168.1.2 | ldap-slave01 | CentOS 7.9.2009 |
192.168.1.3 | ldap-slave02 | CentOS 7.9.2009 |
1.1 服务器的基础操作
### 安装yum源
yum install wget -y
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install epel-release -y
### 停止firewall
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
cat /etc/selinux/config
### 修改主机名
hostnamectl set-hostname ldap-master # master 节点修改
hostnamectl set-hostname ldap-slave01 # slave01 节点修改
hostnamectl set-hostname ldap-slave02 # slave02 节点修改
1.2 安装ldap
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel -y
systemctl enable --now slapd && slapd -VV
1.3 ldap 参数解释
### 以苹果的案例
dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=ljheee
LDAP树形数据库如下:
dn :一条记录的详细位置 ---> 类似于,一棵树详细地址 or 类似于文件的路径
dc :一条记录所属区域 (哪一颗树) 相当于MYSQL的DB
ou :一条记录所属组织 (哪一个分支) 苹果所经过的所有“分叉
cn/uid:一条记录的名字/ID (哪一个苹果名字)
LDAP目录树的最顶部就是根,也就是所谓的“基准DN"。
olcSuffix - 数据库后缀,它是LDAP服务器提供信息的域名。简单来说,更改为自己的域名
olcRootPW - 上述RootDN的LDAP管理员密码
我这里的dn为: k8scc.com
管理员账户为: admin.k8scc.com
olcSuffix是: k8scc.com
olcRootPW是: 由slappasswd -s 123456 这条命令生成
2.0 生成管理员密码
注意: 每次生产的密码都不一样
[root@ldap-master package]# slappasswd -s 123456
{SSHA}j3cV4w4ZjCkdYW7u1QGmNW9w4s0Ruz+HUm
2.1 修改base数据库
### olcRootPW找个密码就是2.0 小节生成的
cat > db.ldif <<EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=k8scc,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=k8scc,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}j3cV4w4ZjCkdYW7u1QGmNW9w4s0Ruz+HUm
EOF
### 执行修改生效
ldapmodify -Y EXTERNAL -H ldapi:/// -f db.ldif
2.2 修改监控的配置
cat > monitor.ldif <<EOF
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=admin,dc=k8scc,dc=com" read by * none
EOF
### 执行修改生效
ldapmodify -Y EXTERNAL -H ldapi:/// -f monitor.ldif
2.3 导入基础配置
### 复制 ldap 数据库文件
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
### 2.6 导入基本数据
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
2.3.0 禁止匿名用户
cat > disable_anamouse.ldif << "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.ldif
2.3.1 配置LDAP Manager
cat > base.ldif <<EOF
dn: dc=k8scc,dc=com
dc: k8scc
objectClass: top
objectClass: domain
dn: cn=admin,dc=k8scc,dc=com
objectClass: organizationalRole
cn: Manager
description: LDAP Manager
dn: ou=People,dc=k8scc,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=k8scc,dc=com
objectClass: organizationalUnit
ou: Group
EOF
### 这里的-w 后面的参数 123456 是2.0小节自己输入的密码,slappasswd -s 123456
ldapadd -x -w 123456 -D "cn=admin,dc=k8scc,dc=com" -f base.ldif
2.3.3 启动member模块
cat > memberof_conf.ldif <<EOF
#开启memberof支持
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldap
#新增用户支持memberof配置
dn: olcOverlay={0}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
cat >refint1.ldif << EOF
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
EOF
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 -Q -Y EXTERNAL -H ldapi:/// -f memberof_conf.ldif
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
2.3.4 启用密码策略模块
cat> add_ppolicy_module.ldif<< EOF
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModulePath: /usr/lib64/openldap
olcModuleLoad: ppolicy.la
EOF
ldapadd -Y EXTERNAL -Q -H ldapi:/// -f add_ppolicy_module.ldif
2.4 配置日志
cat > loglevel.ldif << EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF
### 执行修改生效
ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif
### 重启服务
echo 'local4.* /var/log/slapd.log' >> /etc/rsyslog.conf
systemctl restart rsyslog
systemctl restart slapd
3.0 master节点执行: 开启同步模块
cat >syncprov_mod.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 syncprov_mod.ldif
3.1 master节点执行: 为每个目录开启同步
cat >syncprov.ldif <<EOF
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100
EOF
### 执行生效
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
3.3 slave: 节点执行配置slave同步
cat >syncrepl.ldif <<EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://192.168.1.1:389/
bindmethod=simple
binddn="uid=admin,dc=k8scc,dc=com"
credentials=123456
searchbase="dc=k8scc,dc=com"
scope=sub
schemachecking=on
type=refreshAndPersist
attrs="*,+"
retry="30 5 300 3"
interval=00:00:05:00
EOF
### 执行生效
ldapmodify -Y EXTERNAL -H ldapi:/// -f syncrepl.ldif
4.0 在master节点上执行: 创建测试用户,测试数据同步
### 在master节点上执行
### 创建账户repltest
cat > ldaptest.ldif << EOF
dn: uid=repltest,ou=People,dc=k8scc,dc=com
uid: repltest
cn: repltest
sn: repltest
mail: repltest@k8scc.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: 123456
shadowLastChange: 17763
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1099
gidNumber: 1099
homeDirectory: /home/repltest
EOF
### 创建账户
ldapadd -x -w 123456-D "cn=admin,dc=k8scc,dc=com" -f ldaptest.ldif
4.1 slave节点: 数据是否同步成功
### 在slave节点搜索数据
ldapsearch -x cn=repltest -b dc=k8scc,dc=com
[root@ldap-slave01 ldap]# ldapsearch -x cn=repltest -b dc=k8scc,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=k8scc,dc=com> with scope subtree
# filter: cn=repltest
# requesting: ALL
#
# repltest, People, k8scc.com
dn: uid=repltest,ou=People,dc=k8scc,dc=com
uid: repltest
cn: repltest
sn: repltest
mail: repltest@k8scc.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: bGltaWtlamk=
shadowLastChange: 17763
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1099
gidNumber: 1099
homeDirectory: /home/repltest
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
### 查看同步日志
tail -f 30 /var/log/slapd.log
4.2 可不创建 ,按照自己需求创建, 设置只读用户
cat >readOnly.ldif <<EOF
dn: cn=read,dc=k8scc,dc=com
cn: read
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP read only user
userPassword: "自己设置明文密码"
<EOF
<br>
cat >readonly-user-acl.ldif <<EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=k8scc,dc=com" write
by anonymous auth
by self write
by dn="cn=read,dc=k8scc,dc=com" read
by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=k8scc,dc=com" write by * read
<EOF
4.3 取消 普通用户的读取限制
cat >setOlcSizeLimit.ldif <<EOF
dn: cn=config
changetype: modify
add: olcSizeLimit
olcSizeLimit: unlimited
EOF
5.0 卸载ldap
### 卸载
systemctl stop slapd
systemctl disable slapd
# 卸载
yum -y remove openldap-servers openldap-clients
# 删除残留文件
rm -rf /var/lib/ldap
# 删除ldap用户
userdel ldap
# 删除openldap目录
rm -rf /etc/openldap
# 如果需要重新安装需要先执行,不然无法执行
mkdir /etc/openldap/certs
/usr/libexec/openldap/create-certdb.sh
/usr/libexec/openldap/generate-server-cert.sh
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel -y
systemctl enable --now slapd && slapd -VV
systemctl start slap
6.0 docker-compose快速安装openldap
### 生产docker-compose文件
cat >docker-compose.yaml<<EOF
version: "3.5"
services:
ldap:
image: osixia/openldap
container_name: ldap
hostname: ldap
privileged: true
user: root
ports:
- 389:389
- 636:636
environment:
- LDAP_ORGANISATION=k9s
- LDAP_DOMAIN=k9s.cn
- LDAP_ADMIN_USERNAME=admin
- LDAP_ADMIN_PASSWORD=123456
- LDAP_READONLY_USER_USERNAME=readonly
- LDAP_READONLY_USER_PASSWORD=readonly
- SET_CONTAINER_TIMEZONE=true
- CONTAINER_TIMEZONE=Asia/Shanghai
volumes:
- /etc/localtime:/etc/localtime:ro
- ./ldap:/var/lib/ldap:Z
- ./slapd.d:/etc/ldap/slapd.d:Z
restart: always
tty: true
EOF
### 启动服务
docker-compose up -d
6.1.0 jenkins集成ldap
### 安装jenkins
cat >docker-compose.yaml<<EOF
version: '3'
services: # 集合
docker_jenkins:
user: root # 为了避免一些权限问题 在这我使用了root
restart: always # 重启方式
image: jenkins/jenkins:lts # 指定服务所使用的镜像 在这里我选择了 LTS (长期支持)
container_name: jenkins # 容器名称
ports: # 对外暴露的端口定义
- 8082:8080 # 访问Jenkins服务端口
- 50000:50000
volumes: # 卷挂载路径
- /var/vol_dockers/jenkins_home/:/var/jenkins_home # 这是我们一开始创建的目录挂载到容器内的jenkins_home目录
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker # 这是为了我们可以在容器内使用docker命令
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
EOF
### 启动服务
docker-compose up -d
6.1.0 安装插件
### 1. 需要安装Role-based Authorization插件
### 2. 需要安装Openldap插件
6.1.1 使用LdapAdmin工具创建用户和组
创建ou=group, gorup下面再创ou=jenkins,jenkins下面创建三个组
创建ou=people, people 创建四个用户, 把用户分别加入不通的组, 并设置用户的密码,我这里设置的用户名密码都是123456