基于LDAP搭建公司账号统一认证服务
LDAP是什么
首先LDAP是一种通讯协议,LDAP支持TCP/IP。协议就是标准,并且是抽象的。在这套标准下,AD(Active Directory)是微软出的一套实现。
LDAP(Light Directory Access Protocol 轻量级目录访问协议),他是一种目录数据库存储方式
那AD是什么呢?
可以把它理解成是个数据库,像是其他数据库一样,LDAP也是有client端和server端。
server端是用来存放资源,client端用来操作增删改查等操作。
而我们通常说的LDAP是指运行这个数据库的服务器。可以简单理解AD =LDAP服务器+LDAP应用
一些名词解释
Entry 项
LDAP是以树形结构存储数据,每一个节点都被称为项
dc(Domain Component)
dc就是域组织(可以把它当作关系型中的库)
比如将
http://guoliangjun.com
这样的域名,可以拆成dc=guoliangjun,dc=com
这样的形式。
dn(Distinguished Name)
它用于唯一标识一个「项」,以及他在目录信息树中的位置。(一条dn就类似于关系型数据库中的一条数据)
dn示例:
ou=group,dc=guoliangjun,dc=com
、cn=dev,ou=group,dc=guoliangjun,dc=com
dn 字符串从左向右,各组成部分依次向树根靠近。
rdn(Relative Distinguished Name)
Rdn 就是「键值对」。dn 由若干个 rdn 组成,以逗号分隔。
比如上面的dn中
dc=guoliangjun
就是一个rdn
ou(Organization Unit)
在 dn 中可能会包含 ou=某某部门 这样的组成部分,这里的 ou 指代组织单元、部门。
cn (Common Nmae)
公共名称,如:'zhangsan'
uid (User id)
用户id,如:'zhangsan'
Object Classes
每个「项」里面包含若干个 Object Classes,相当于是项的属性。(一条dn中的这些属性就类似于关系型数据库中一条数据的各个字段)
总结一下LDAP树形数据库如下:
dn :一条记录的详细位置
dc :一条记录所属区域 (哪一颗树)
ou :一条记录所属组织 (哪一个分支)
cn/uid:一条记录的名字/ID (哪一个苹果名字)
为什么要搭建LDAP
多平台认证的烦恼
不管是我经历过的几间公司,还是最近面试的公司,再者一些朋友的公司,发现他们的问题就是没有一个统一的认证服务系统。
比如研发部有自己的一些gitlab/jenkins/禅道/vpn/wiki
等等的系统。
新人入职时需要在每个系统中申请一遍账号,每个系统对用户名和密码的要求还不一样(离职的时候, 各个账号又都得删除一遍), 这样后期维护成本非常高的。
目标实现用户统一登录管理
OpenLDAP和phpLDAPadmin的部署
下面通过docker-compose一键部署openLDAP、phpldapadmin
version: "3"
services:
openldap:
container_name: "openldap"
image: "osixia/openldap:1.5.0"
restart: always
environment:
LDAP_ORGANISATION: "guoliangjun" # 组织名称
LDAP_DOMAIN: "guoliangjun.com" # 公司/组织域名
LDAP_BASE_DN: "dc=guoliangjun,dc=com" # 根据域名组成
LDAP_ADMIN_PASSWORD: "ldap_admin_password" # 密码自己来设置
LDAP_CONFIG_PASSWORD: "ldap_config_password"
volumes:
- /data/docker/openldap/database:/var/lib/ldap
- /data/docker/openldap/config:/etc/ldap/slapd.d
ports:
- '389:389'
- '636:636'
phpldapadmin:
container_name: "phpldapadmin"
image: "osixia/phpldapadmin:0.9.0"
restart: always
depends_on:
- openldap
environment:
PHPLDAPADMIN_LDAP_HOSTS: "openldap"
#PHPLDAPADMIN_HTTPS: "false"
ports:
- '80:80'
- '443:443'
执行docker-compose up -d
命令,就可以一键部署openldap、phpldapadmin
(他就是openldap的操作页面)
等后续再进一步说下self-service-password
来自助修改密码吧
接下来可以通过访问https://ipaddr
访问phpldapadmin了。
账号就是cn=admin,dc=guoliangjun,dc=com
,密码就是通过LDAP_ADMIN_PASSWORD
设置的。
如果不使用页面版的
phpldapadmin
,可以去下载ldapadmin
的桌面版也是能管理
操作指南
这里先在dc下面创建ou=group
和ou=users
如果想再按部分区分则就先创建一个ou,再在该ou下创建一个ou=group即可
创建ou
同理ou=users
一样,不再记录呀
在ou=group下创建dev
创建User Account
在ou=users下创建用户
为用户填写其他属性
是不是有一些比如邮箱/手机号码之类的属性没有呢?所以需要为用户添加真实姓名和邮箱(有些系统需要用户的这两个信息,比如gitlab/jenkins),可以从下图选择姓名啊,手机啊,邮箱等参数。
生成对应模板
为了后面用户信息一致,可以使用导出初始化用户模板统一,到时候新增用户,修改对应值即可。
# LDIF Export for cn=zhangsan,ou=users,dc=guoliangjun,dc=com
# Server: openldap (openldap)
# Search Scope: base
# Search Filter: (objectClass=*)
# Total Entries: 1
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on February 7, 2023 10:11 am
# Version: 1.2.5
version: 1
# Entry 1: cn=zhangsan,ou=users,dc=guoliangjun,dc=com
dn: cn=zhangsan,ou=users,dc=guoliangjun,dc=com
cn: zhangsan
displayname: zhangsan
gidnumber: 500
givenname: zhang
homedirectory: /home/users/zhangsan001
loginshell: /bin/bash
mail: zhangsan@guoliangjun.com
mobile: 13800138000
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: san
uid: zhangsan001
uidnumber: 1000
userpassword: zhangsan123
以上就是默认的一下模板了。
导入账号
导入错误
注意:在import时候出现如下报错,检查一下是否是
uidnumber
写重复了,(uidnumber
是唯一的)uidnumber可以在《LDAP用户uidnumber统计》这个表里面进行查找。
后续记录计划
- LDAP整合linux服务器账号
- LDAP的集成相关的服务,如
jenkins/gitlab/harbor/nexus
- 搭建ldap自助修改密码系统:
Self Service Password
参考
- https://github.com/cloudp1216/OpenLDAP
- https://github.com/osixia/docker-openldap
- https://github.com/osixia/docker-phpLDAPadmin
- https://blog.csdn.net/ysf15609260848/article/details/126002452