参考文章: openldap介绍和使用
基础概念
什么是 LDAP
LDAP 是轻量目录访问协议,英文全称是 Lightweight Directory Access Protocol,一般都简称为 LDAP。按照我们对文件目录的理解,ldap可以看成一个文件系统,类似目录和文件树。
LDAP 的软件
ldap 并不是一款软件,而是一个协议。现在市场上有关 LDAP 的产品已有很多,各大软件公司都在他们的产品中集成了 LDAP 服务,如 Microsoft 的ActiveDirectory、Lotus的Domino Directory、IBM 的 WebSphere 中也集成了 LDAP 服务。LDAP 的开源实现是 OpenLDAP,它比商业产品一点也不差,而且源码开放。
OpenLDAP 是最常用的目录服务之一,它是一个由开源社区及志愿者开发和管理的一个开源项目,提供了目录服务的所有功能,包括目录搜索、身份认证、安全通道、过滤器等等。大多数的 Linux 发行版里面都带有 OpenLDAP 的安装包。OpenLDAP 服务默认使用非加密的 TCP/IP 协议来接收服务的请求,并将查询结果传回到客户端。由于大多数目录服务都是用于系统的安全认证部分比如:用户登录和身份验证,所以它也支持使用基于 SSL/TLS 的加密协议来保证数据传送的保密性和完整性。OpenLDAP 是使用 OpenSSL 来实现 SSL/TLS 加密通信的。
LDAP 的信息模型
LDAP的信息模型是建立在 “条目”(entries)的基础上。一个条目是一些属性的集合,并且具有一个全局唯一的 “可区分名称” DN,一个条目可以通过 DN 来引用。每一个条目的属性具有一个类型和一个或者多个值。类型通常是容易记忆的名称,比如 “cn” 是通用名称(common name) ,或者 “mail” 是电子邮件地址。条目的值的语法取决于属性类型。比如,cn 属性可能具有一个值 “Babs Jensen” 。一个 mail 属性可能包含 “bbs@kevin.com“ 。一个 jpegphoto 属性可能包含一幅 JPEG(二进制)格式的图片。
LDAP 的 objectClass
LDAP 通过属性 objectClass 来控制哪一个属性必须出现或允许出现在一个条目中,它的值决定了该条目必须遵守的模式规则。可以理解为关系数据库的表结构。
接下来会用到的 objectClass 有
objectClass | 含义 |
---|---|
olcGlobal | 全局配置文件类型,主要是 cn=config.ldif 的配置项 |
top | 顶层的对象 |
organization | 组织,比如公司名称,顶层的对象 |
organizationalUnit | 重要, 一个目录节点,通常是group,或者部门这样的含义 |
inetOrgPerson | 重要, 我们真正的用户节点类型,person类型, 叶子节点 |
groupOfNames | 重要, 分组的group类型,标记一个group节点 |
olcModuleList | 配置模块的对象 |
LDAP 的常用关键字列表
ldap 的 entry 是由各种字段构成,可以理解为关系数据库的字段。
关键字 | 英文全称 | 含义 |
---|---|---|
dc | Domain Cimponent | 域名的部分,其格式是将完整的域名分成几部分,如域名为 example.com 变成 dc=example,dc=com |
uid | User Id | 用户ID,如 “tom” |
ou | Organization Unit | 组织单位,类似于 Linux 文件系统中的子目录,它是一个容器对象,组织单位可以包含其他各种对象(包括其他组织单元),如“market” |
cn | Common Name | 公共名称,如“Thomas Johansson” |
sn | Surname | 姓,如“Johansson” |
dn | Distinguished Name | 惟一辨别名,类似于Linux文件系统中的绝对路径,每个对象都有一个惟一的名称,如 “uid= tom,ou=market,dc=example,dc=com”,在一个目录树中DN总是惟一的 |
rdn | Relative dn | 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson” |
c | Country | 国家,如“CN”或“US”等。 |
o | Organization | 组织名,如“Example, Inc.” |
这里,我们把 dn
当做用户唯一主键,cn
是 common name,应该等同于用户名,因为用户名必须唯一,通常为邮箱前缀,比如 ryan.miao。sn
作为姓氏,uid
作为用户 id。通常用户 id 也是唯一的。
所以在使用 ldap 做认证的时候,大概逻辑如下
- 配置 ldap host, admin, admin pass
- 用户登录时传递username
- 读取配置的 ldap 信息,查询 cn 或者 uid 等于 username 的数据
- 取出第一个记录,获得dn,根据 dn 和 password 再次去 ldap 服务器认证。即我们必须保证 cn 或 uid 是全局唯一的,认证通常需要进行两次。原因就在于 dn 没办法根据用户名计算出来。
一个倒桩树组成结构。
kubernetes 部署 openLDAP
创建命名空间资源清单文件 00-namespace.yaml,文件内容如下
1
2
3
4apiVersion: v1
kind: Namespace
metadata:
name: ops创建 pvc 资源清单文件 01-openldap-pvc.yaml,文件内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: openldap-data-pvc
namespace: ops
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: glusterfs
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: openldap-config-pvc
namespace: ops
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: glusterfs创建 Deployment 服务资源清单 02-openldap-deployment.yaml,文件内容如下
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
60kind: Deployment
apiVersion: apps/v1
metadata:
name: openldap
namespace: ops
labels:
app: openldap
annotations:
app.kubernetes.io/alias-name: LDAP
app.kubernetes.io/description: 认证中心
spec:
replicas: 1
selector:
matchLabels:
app: openldap
template:
metadata:
labels:
app: openldap
spec:
containers:
- name: openldap
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: admin
- name: LDAP_DOMAIN
value: vonebaa.com
- name: LDAP_ADMIN_PASSWORD
value: Wlkj131q
- name: LDAP_CONFIG_PASSWORD
value: Wlkj131q
- name: LDAP_BACKEND
value: mdb
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: ldap-config-pvc
mountPath: /etc/ldap/slapd.d
- name: ldap-data-pvc
mountPath: /var/lib/ldap
volumes:
- name: ldap-config-pvc
persistentVolumeClaim:
claimName: openldap-config-pvc
- name: ldap-data-pvc
persistentVolumeClaim:
claimName: openldap-data-pvc创建 SVC 资源清单 03-openldap-svc.yaml,文件内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20apiVersion: v1
kind: Service
metadata:
name: openldap-svc
namespace: ops
labels:
app: openldap-svc
spec:
ports:
- name: tcp-389
port: 389
protocol: TCP
targetPort: 389
- name: tcp-636
port: 636
protocol: TCP
targetPort: 636
selector:
app: openldap
type: ClusterIP创建 ldap 的管理 web 服务 phpldap 的资源清单 04-phpldapadmin.yaml,文件内容如下
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
78apiVersion: v1
kind: Service
metadata:
name: ldap-phpldapadmin-svc
namespace: ops
labels:
app: ldap-phpldapadmin-svc
spec:
ports:
- name: tcp-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: ldap-phpldapadmin
kind: Deployment
apiVersion: apps/v1
metadata:
name: ldap-phpldapadmin
namespace: ops
labels:
app: ldap-phpldapadmin
annotations:
app.kubernetes.io/alias-name: LDAP
app.kubernetes.io/description: LDAP 在线工具
spec:
replicas: 1
selector:
matchLabels:
app: ldap-phpldapadmin
template:
metadata:
labels:
app: ldap-phpldapadmin
spec:
containers:
- name: phpldapadmin
image: 'osixia/phpldapadmin:stable'
ports:
- name: tcp-80
containerPort: 80
protocol: TCP
env:
- name: PHPLDAPADMIN_HTTPS
value: 'false'
- name: PHPLDAPADMIN_LDAP_HOSTS
value: openldap-svc
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 10m
memory: 10Mi
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: phpldap
namespace: ops
spec:
ingressClassName: nginx
rules:
- host: phpldap.vonebaas.com
http:
paths:
- backend:
service:
name: ldap-phpldapadmin-svc
port:
number: 80
path: /
pathType: Prefix
tls:
- hosts:
- phpldap.vonebaas.com
secretName: vonebaas-ssl这里 Ingress 使用了 tls,secret 使用如下命令创建
1
kubectl create secret tls vonebaas-ssl --cert=tls.crt --key=tls.key -n ops
部署 openLDAP 服务
1
kubectl apply -f .
配置 host 解析,打开浏览器,访问
phpldap.vonebaas.com
用户名密码如下:
Login DN Password cn=admin,dc=xxx,dc=com 系统变量中的:LDAP_ADMIN_PASSWORD -
默认情况下是没有
ou
和cn
信息的,以上截图的 ou 信息是手动创建的。