什么是LDAP?
LDAP(Lightweight Directory Access Protocol),轻量级目录访问协议。LDAP是一种通讯协议,LDAP支持TCP/IP。协议就是标准,并且是抽象的。提供LDAP服务的软件有很多商业上获得成功的,其中以MS的AD(Active Directory)和Redhat的NDS(Netscape directory server)使用最为广泛,而开源领域则是OpenLdap。
什么是OpenLDAP?
什么是OpenLDAP?OpenLDAP就是LDAP的一个具体实现,属于开源集中账号管理架构的实现,且支持众多系统版本,被广大互联网公司所采用。我们暂且把它理解成是个数据库。像数据库一样,LDAP也是有client端和server端。server端是用来存放资源,client端用来操作增删改查等操作。而我们通常说的LDAP是指运行这个数据库的服务器。而我们通常说的LDAP是指运行这个数据库的服务器。可以简单理解AD =LDAP服务器+LDAP应用。
那LDAP这种数据库有什么特殊的呢?
我们知道,像MySQL数据库,数据都是按记录一条条记录存在表中。而LDAP数据库,是树结构的,数据存储在叶子节点上,具体信息存储在条目(entry)中,条目可以看成关系数据库中的表记录,条目是具有区别名(Distinguished Name,DN)的属性(attribute),DN 是用来引用条目,DN 相当于关系数据库(Oracle/MySQL)中的主键(primary key),是唯一的。属性由类型(type)和一个或者多个值(value)组成,相当于关系数据库中字段的概念。看看下面的比喻:
假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?当然首先要说明是哪一棵树(dc,相当于MYSQL的DB),然后是从树根到那个苹果所经过的所有“分叉”(ou),最后就是这个苹果的名字(uid,相当于MySQL表主键id)。好了!这时我们可以清晰的指明这个苹果的位置了
总结一下LDAP树形数据库如下:
DC (Domain Component) :一条记录的详细位置
CN (Common Name) :一条记录所属区域 (哪一颗树)
OU (Organizational Unit) :一条记录所属组织 (哪一个分支)
CN/uid:一条记录的名字/ID (哪一个苹果名字)
LDAP目录树的最顶部就是根,也就是所谓的“基准DN"。
为什么要用LDAP目录树来存储数据,用MySQL不行吗,为什么非要搞出一个树形的数据库呢?
是因为用树形结构存储数据,查询效率更高(具体为什么,可以看一下关系型数据库索引的实现原理——B树/B+树)。在某些特定的场景下,使用树形数据库更理想。比如:需要储存大量的数据,而且数据不是经常更改,需要很快速的查找。
Docker搭建OpenLDAP服务器
拉取openldap镜像
docker pull osixia/openldap:latest
运行
sudo docker run -itd -p 389:389 --name ldap-server --restart=always --env LDAP_ORGANISATION="example" --env LDAP_DOMAIN="example.com" --env LDAP_ADMIN_PASSWORD="123456" --detach osixia/openldap:latest
查看OpenLDAP相关信息
docker ps | grep openldap
进入容器
docker exec -it my-openldap-container bash
测试配置文件
使用slaptest可以确认配置文件信息是否正确
slaptest
修改国内镜像源
https://www.cnblogs.com/xlizi/p/13452554.html
使用ldapsearch命令进行数据查询
查询Option介绍
Option | 说明 |
---|---|
-H | ldapuri,格式为ldap://机器名或者IP:端口号,不能与-h和-p同时使用 |
-h | LDAP服务器IP或者可解析的hostname,与-p可结合使用,不能与-H同时使用 |
-p | LDAP服务器端口号,与-h可结合使用,不能与-H同时使用 |
-D | 所绑定的服务器的DN |
-x | 使用简单认证方式 |
-w | 绑定DN的密码,与-W二者选一 |
-W | 不输入密码,会交互式的提示用户输入密码,与-w二者选一 |
-f | 指定输入条件,在RFC 4515中有更详细的说明 |
-c | 出错后忽略当前错误继续执行,缺省情况下遇到错误即终止 |
-n | 模拟操作但并不实际执行,用于验证,常与-v一同使用进行问题定位 |
-v | 显示详细信息 |
-d | 显示debug信息,可设定级别 |
-s | 指定搜索范围, 可选值:base/one/sub/children |
指定ldapuri查询 |
ldapsearch -x -H ldap://localhost:389 -b dc=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456
指定主机名和端口号
ldapsearch -x -h ldap://192.168.23.198 -p 389 -b cn=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456
指定过滤条件:按照dn进行过滤
ldapsearch -x -H ldap://localhost -b cn=admin,dc=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456
使用模糊匹配
查看当期根下的ou信息
ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456 "ou=*"
使用cn=xxx,dc=xxx,ou=xxx进行过滤
ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456 "cn=admin"
ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456 "ou=People"
ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456 "dc=example"
返回指定条件
后面可以加sn cn title mail uid
ldapsearch -x -H ldap://localhost -b cn=admin,dc=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456 sn cn title mail uid
容器外查询
docker exec -it my-openldap-container ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=com" -w 123456