openLDAP服务搭建与使用

LDAP介绍

LDAP
LDAP是一种基于轻量目录访问协议,全称是Lightweight Directory Access Protocol,是由一个为查询、浏览和搜索而优化的数据库构成,它成树状结构组织数据,类似文件目录一样。
LDAP单点登录认证主要是改变原有的认证策略,使得需要的软件都通过LDAP服务器进行认证,在统一身份认证后,用户的所有信息都存储在AD Server中,终端用户在需要使用公司内部服务的时候,都需要通过AD服务器进行认证。

整个LDAP登录流程由以下4个步骤组成:

  • 连接到LDAP服务器。
  • 绑定到LDAP服务器。
  • 在LDAP服务器上执行所需要的操作。
  • 释放LDAP服务器的连接。

LDAP场景说明:
企业内部需要认证的服务很多,员工需要记住很多的密码, 即使对这些服务进行相同的密码设置,也存在很大的安全隐患。比如我们公司,有jira、confulence、gitlab、北森等系统,

使用场景是提高用户在同一个企业的多个站点(域名)之间的无缝浏览体验,例如企业内部可能有多个处理不同业务的系统(OA,邮箱,财务等),用户只要在一个系统上保持登录状态,即可无需再次登录访问其他内部系统。

openLDAP 是 LDAP 开源的一种实现

openLDAP 部署

在k8s中部署

部署文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
## ldap deploy
kind: Deployment
apiVersion: apps/v1
metadata:
name: ldap-server
namespace: tool
labels:
app: ldap-server
annotations:
kubesphere.io/alias-name: LDAP
kubesphere.io/description: 认证中心
spec:
replicas: 1
selector:
matchLabels:
app: ldap-server
template:
metadata:
labels:
app: ldap-server
spec:
volumes:
- name: volume-8aprj6
persistentVolumeClaim:
claimName: ldap-config-pvc
- name: volume-hj6df3
persistentVolumeClaim:
claimName: ldap-data-pvc
containers:
- name: container-ad1z7z
image: 'osixia-openldap:1.5.0'
ports:
- name: tcp-389
containerPort: 389
protocol: TCP
- name: tcp-636
containerPort: 636
protocol: TCP
env:
- name: LDAP_ORGANISATION
value: kwl
- name: LDAP_DOMAIN
value: kwl.com
- name: LDAP_ADMIN_PASSWORD
value: kwl123456
- name: LDAP_CONFIG_PASSWORD
value: kwl123456
- name: LDAP_BACKEND
value: mdb
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: volume-8aprj6
mountPath: /etc/ldap/slapd.d
- name: volume-hj6df3
mountPath: /var/lib/ldap
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
imagePullSecrets:
- name: local-harbor
affinity: {}
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600

## ldap tool
kind: Deployment
apiVersion: apps/v1
metadata:
name: ldap-phpldapadmin
namespace: tool
labels:
app: ldap-phpldapadmin
annotations:
kubesphere.io/alias-name: LDAP
kubesphere.io/description: LDAP在线工具
spec:
replicas: 1
selector:
matchLabels:
app: ldap-phpldapadmin
template:
metadata:
labels:
app: ldap-phpldapadmin
spec:
containers:
- name: container-jojizv
image: 'osixia-phpldapadmin:stable'
ports:
- name: tcp-443
containerPort: 443
protocol: TCP
- name: tcp-80
containerPort: 80
protocol: TCP
env:
- name: PHPLDAPADMIN_HTTPS
value: 'false'
- name: PHPLDAPADMIN_LDAP_HOSTS
value: 10.233.11.157
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 10m
memory: 10Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
imagePullSecrets:
- name: local-harbor
affinity: {}
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600

## svc
kind: Service
apiVersion: v1
metadata:
name: ldap-server-svc
namespace: tool
labels:
app: ldap-server-svc
spec:
ports:
- name: tcp-389
protocol: TCP
port: 389
targetPort: 389
nodePort: 30944
- name: tcp-636
protocol: TCP
port: 636
targetPort: 636
nodePort: 31282
selector:
app: ldap-server
clusterIP: 10.233.11.157
type: NodePort
sessionAffinity: ClientIP
externalTrafficPolicy: Cluster


## svc
kind: Service
apiVersion: v1
metadata:
name: ldap-phpldapadmin-svc
namespace: tool
labels:
app: ldap-phpldapadmin-svc
spec:
ports:
- name: tcp-80
protocol: TCP
port: 80
targetPort: 80
nodePort: 30581
selector:
app: ldap-phpldapadmin
clusterIP: 10.233.51.71
type: NodePort
sessionAffinity: ClientIP
externalTrafficPolicy: Cluster

## pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ldap-data-pvc
namespace: tool
labels:
app: ldap-data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
volumeName: pvc-fb0aeff5-b4d5-4266-9801-4135ce1f4b0e
storageClassName: local
volumeMode: Filesystem

## pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ldap-config-pvc
namespace: tool
labels:
app: ldap-config-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
volumeName: pvc-040ff76c-7bdf-436b-984f-9897efa0bd16
storageClassName: local
volumeMode: Filesystem

openLDAP 使用

由于我们部署了phpldapadmin服务,我们直接通过phpldapadmin的网页来操作LDAP
访问集群节点IP+30581访问phpldapadmin
由于我们配置了LDAP服务环境变量,所以登录admim的账户密码为cn=admin,dc=kwl,dc=com/kwl123456
创建OpenLDAP基础域
创建OpenLDAP组
创建OpenLDAP用户(注意如果要用LDAP用于的邮箱进行登录,需要为用户新建Email额外字段和内容)
创建参考

使用wikijs验证LDAP登录

上面我们新建了LDAP用户zhan san, Email地址为zhansan@kwl.com, 密码为123456
进入wikijs的系统配置页面,选择身份验证配置,新建LDAP配置
这里我配置的是通过邮箱来作为账户登录,详细配置如下

配置参数 配置值 备注
LDAP URL ldap://10.233.11.157:389 LDAP 服务地址
Admin Bind DN cn=admin,dc=kwl,dc=com LDAP 管理员登录DN
Admin password kwl123456
Search Base ou=user,dc=kwl,dc=com LDAP 登录用户查询起始域
Search Filter (mail=) 这里我们判断的是填入的信息是否和邮箱匹配

配置好之后,在wikijs使用LDAP登录项成功登录zhan san(zhansan@kwl.com/123456)用户则配置成功

参考

https://cloud.tencent.com/developer/article/1349446?from=information.detail.phpLDAPadmin
https://docs.requarks.io/auth/ldap
https://github.com/osixia/docker-openldap/tree/master/example/kubernetes