简介
LDAP
(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议 ^1- 特点
- 目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样
- 目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样
- LDAP目录服务是由目录数据库和一套访问协议组成的系统
- OpenLDAP 为Opensource开源的项目。其他如
SUNONE Directory Server
(SUN)、IBM Directory Server
、Microsoft Active Directory
- LDAP客户端使用:LDAPAdmin下载、
ApacheDirectoryStudio
- Host:192.168.1.100:389;Base:dc=demo,dc=com;Username:填写dn,如:cn=admin,dc=demo,dc=com;Password:填写用户属性userPassword
- LDAPAdmin使用参考:https://cloud.tencent.com/developer/article/1380076
- LDAP web客户端:
ldap-account-management
、phpLDAPadmin
- 加密LDAP
- LDAP over SSL(即ldaps)
- ldap默认不加密情况下走389端口
- 当使用ldaps的时候走636端口
- ldaps已经淘汰了(不然也不会有LDAP over TLS出来)
- LDAP over TLS(即ldap + TLS)
- LDAP over TLS可以简单理解为ldaps的升级
- 它默认走389端口,但是会通讯的时候加密
- 客户端连接LDAP时,需要指明通讯类型为TLS
- LDAP over SSL(即ldaps)
LDAP的基本模型
条目
- LDAP的信息模型是建立在”条目”(entries)的基础上。一个条目是一些属性的集合,并且具有一个全局唯一的”可区分名称”DN,一个条目可以通过DN来引用。每一个条目的属性具有一个类型和一个或者多个值。类型通常是容易记忆的名称,比如”cn”是通用名称(common name),或者”mail”是电子邮件地址。条目的值的语法取决于属性类型。比如,cn属性可能具有一个值”hello world”。一个mail属性可能包含”test@demo.com“。一个jpegphoto属性可能包含一幅JPEG(二进制)格式的图片 ^2
objectClass
- LDAP通过条目属性
objectClass
来控制哪一个属性必须出现或允许出现在一个条目中,它的值决定了该条目必须遵守的模式规则 - 取值如下
olcGlobal
全局配置文件类型,主要是 cn=config.ldif 的配置项top
顶层的对象organization
组织,比如公司名称,顶层的对象organizationalUnit
重要, 一个目录节点,通常是group,或者部门这样的含义inetOrgPerson
重要, 我们真正的用户节点类型,person类型, 叶子节点groupOfNames
重要, 分组的group类型,标记一个group节点olcModuleList
配置模块的对象
常用属性名
objectClass
dn
(Distinguished Name):唯一名称(一条记录的唯一位置),有三个属性,分别是:CN、OU、DC。如”uid=xiaoer.li,ou=oa组,dc=example,dc=com”cn
(Common Name):公共名称,如”Thomas Johansson”(一条记录的名称)ou
(Organization Unit):组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如”oa组”(一条记录的所属组织)dc
(Domain Component):域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)upn
(User Principal Name):用户主体名称,每个用户还可以有一个比DN更短、更容易记忆的 UPN,例如张三隶属于 example.com,则其 UPN 可以为 zhangsan@example.com。用户登录时所输入的账户名最好是 UPN,因为无论此用户的账户被移动到哪一个域,其 UPN 都不会改变,因此用户可以一直使用同一个名称来登录uid
(User Id):用户ID(10000/smalle, 一条记录的ID)rdn
(Relative dn):相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如”uid=tom”或”cn= Thomas Johansson”sn
(Surname):姓,如”李”c
(Country):国家,如”CN”或”US”等o
(Organization) 组织名,如”Example, Inc.”userPassword
用户密码,如:111111(直接使用明文登录)、{SSHA}UkTxshLTluIE8ubsJ3PvWtFmOEKJdXHE(使用此SSHA加密前的数据登录)title
职称mail
邮件displayName
展示名departmentNumber
部门编号telephoneNumber
电话号码
其他
Schema
类似数据库表定义,定义了属性/字段名称(如:objectClass)和类型(如:Text)。文件位置/etc/openldap/schema
Base DN
目录树的最顶部就是根,也就是所谓的 “base dn”,如 “dc=demo,dc=com”LDIF
(LDAP Data Interchange Format) 数据交换格式,是LDAP数据库信息的一种文本格式,用于数据的导入导出,每行都是”属性: 值”对DIT
(The Directory Information Tree) 目录信息树,如:demo.com的根节点开始为一个DITACL
(Access Control List) 表示权限控制OLC
(on-line configuration) 运行时配置,通过配置 DIT 条目 cn=config 达到运行时配置(无需停止服务器)
OpenLDAP安装及配置(服务端)
基于docker-compose安装
docker-compose up -d
启动- 启动后访问http://192.168.40.193:30004/ 登录名:
cn=admin,dc=test,dc=com
密码:123456
- docker-compose.yml配置文件如下
1 | # docker-compose.yml |
基于k8s安装
1 | helm fetch stable/openldap --version=1.2.2 # 下载chart到当前目录 |
- 使用
- 使用LDAP Admin连接。base:
dc=aezo,dc=cn
,username:cn=admin,dc=aezo,dc=cn
- admin账户可以把自己删掉,防止误操作,导致管理员被删
- 默认匿名用户也可以连接
- 使用LDAP Admin连接。base:
yum安装
1 | yum install -y openldap openldap-clients openldap-servers |
- 说明
- 默认监听在389端口
- 默认匿名用户可以查看,但是无法编辑,权限配置参考ACL
- 配置文件目录
/etc/openldap
- 默认没有memberof模块,增加此模块可参考:^2 (使用LDAP Admin无法看到memberOf字段,可通过ldap命令查看)
禁止匿名用户访问
1 | cat > disable_anon.ldif << 'EOF' |
配置ACL
- 语法
1 | # 通过access to约束我们访问的范围(resources),通过by设定哪个用户(who)获取对这个约束范围有什么权限(type of access granted),并控制(control)这个by语句完成后是否继续执行下一个by语句或者下一个ACL指令 |
- 通过ldif文件修改。ldif文件只需将上文
access to
换成{0}to
,{0}为规则序号
1 | ldapmodify -Q -Y EXTERNAL -H ldapi:/// << 'EOF' |
配置多DIN
- 配置多DIN(The Directory Information Tree)可理解为在mysql服务器上创建多个数据库,且多个DIN上的uid等可以重复,第三方使用LDAP认证时只能连接一个DIN
- Openldap增加DIT配置参考:http://blog.sina.com.cn/s/blog_92dc41ea0102wrf0.html
1 | ## 配置 |
使用
LDAP命令
- ldap主要命令有
ldapadd
、ldapmodify
、ldapsearch
^2w /‘}| - 参数说明
-H
ldap server地址, 可以是ldap://192.168.1.100:389
表示tcp,可以是ldap:///
表示本地的tcp,可以是ldapi:///
本地unix socket连接-Y EXTERNAL
本地执行,修改配置文件,比如basedn, rootdn, rootpw, acl, module等信息-b
basedn 根目录, 将在此目录下查询-x
启用简单认证,通过-D <dn> -w <密码>
的方式认证-D
用来绑定服务器的DN-f
指定要修改的文件,如my.ldif
-a
使用ldapmodify增加一个entry的时候等同于ldapadd-c
出错后继续执行程序不终止,默认出错即停止
ldapadd 添加条目
- 添加schema配置命令
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
,所有的schema文件位置/etc/openldap/schema
- 添加额外的module命令,如增加memberof模块
1 | cat > add_module_group.sh << 'EOF' |
- 添加普通entry命令
ldapadd -x -D cn=admin,dc=demo,dc=com -w admin -f base.ldif
1 | cat > base.ldif << 'EOF' |
ldapmodify 修改条目
- 管理员修改用户密码
1 | # 获取密码 |
- 个人修改自己的密码
ldappasswd -x -h 127.0.0.1 -p 389 -D "cn=san.zhan,dc=demo,dc=org" -w my_old_pass -s my_new_pass
ldapsearch 查询条目
1 | # 语法格式 |
ldapdelete、ldappasswd
ldapdelete -x -D "cn=admin,dc=demo,dc=com" -W "uid=10000,ou=People,dc=demo,dc=com"
使用admin用户登录,删除uid=10000ldappasswd -x -h 127.0.0.1 -p 389 -D "cn=san.zhan,dc=demo,dc=org" -w my_old_pass -s my_new_pass
PHP
1 | $ldapconn = ldap_connect("10.1.8.78") |
参考文章