总文档 :文章目录
Github : github.com/black-ant
操作手册系列主要记录平时积累的无体系的操作笔记 , 这一篇主要是 LDAP (AD) 的相关笔记 .
前言
LDAP 是 一个 轻量目录协议 ,全名 Lightweight Directory Access Protocol , 他用于发布目录信息到许多不同资源的协议,LDAP 类似于一个集中的地址本 ,类似于一个电话簿
而本篇会涉及到的是 OpenLDAP 和 Windows AD , 他们两者都是 LDAP 协议的实现类 .
一 . LDAP 基础
特点 :
- LDAP 支持TCP / IP
- LDAP 可以说一个特殊的数据库 , LDAP 实现了数据结构的存储
- LDAP 采用树状结构
- LDAP 对查询进行了优化 , 他的读性能更加优秀
- LDAP是一种开放Internet标准,LDAP协议是跨平台的Interent协议
- 通过推和拉来复制技术 ,允许使用ACI ( 访问权限的控制 )
- LDAP 协议是开发的标准协议
- LDAP支持强认证方式
LDAP 服务器
- LDAP 采用 Client/server模型
- LDAP 服务是 由 目录数据库 和 一套访问协议组成的系统
- LDAP 服务器用来处理查询和更新LDAP 目录
二 . LDAP 属性
关键组成
- dc : 一条记录所属区域 ( 哪一棵树 ) ,域名组件 ,在最顶层
- dc -> Domain Component
- dn (distinguished Name 唯一标识名): 一条记录的详细位置
- rdn : 类似于相对路劲 : CN=张三
- rdn -> Relative Distinguished Name
- Base DN : LDAP目录树的最顶部,即根
- GUID : 全局唯一标识 ,GUID 是一个 128位 数值
- UPN : 用户主体名称 ,比DN 更加短的标识路径
- UPN : zhangsan@moonxy.com
Attribute 默认属性:
- cn common Name: 姓名
- sn sur name: 姓
- ou organizational Unit Name: 单位(部门)名称 ,所属组织
- o organization: 组织-公司
- c countryName: 国家
- dc domainComponent : 域名
- telephoneNumber : 电话号码
- objectClass : 内置属性
结构
- dc -> ou -> cn
- dc是一个域名 ,一颗数 ,树下有很多 ou 组织 ,组织下拥有 cn
- n 是路劲 ,例如 :CN=张三,OU=Web前端组,OU=软件开发部,DC=moonxy,DC=com
- n 相对路劲 : CN=张三 、OU=Web前端组
基本概念
- Entry : 条目 ,记录项 ,是最基础的记录单元 (dn + rdn + Base DN)
- Attribute :属性 ,每个条目都有属性 (名称-值)()
- ObjectClass : 对象类是属性的集合,对象类有三种类型 ,结构类型(Structural)、抽象类型(Abstract)和辅助类型(Auxiliary)
- Schema : 模式 ,对象类的集合
- backend & database : backend 用于操作 ,database 用于存储
三 . LDAP 实现之一 Windows AD
Windows AD 简介
Active Directory 域内的 directory database(目录数据库)被用来存储用户账户、计算机账户、打印机和共享文件夹等对象,而提供目录服务的组件就是 Active Directory (活动目录)域服务(Active Directory Domain Service,AD DS)
在AD 域服务中 ,AD 就是一个命名空间 ,利用AD ,我们可以通过对象的名称来找到和这个对象有关的所有信息
AD 主要成员 :
AD 域对象和属性 : AD 域内的资源以对象(Object )的形式存在 ,通过Attriburte 来描述其特征,可以说对象本身就是属性的集合
DC :域控制器( Domain Controller ) : 域内可以有多台域控制器,每台域控制器地位平等 ,各自存储着一份相同的Active Directory
管理工具 : ctive Directory 用户和计算机 + Active Directory 管理中心
AD 与 LDAP 直观区别
- AD : Active Directory : AD 是 windows 的一种服务 ,用于存储 Windows 网络中的用户账号 ,组 ,计算机
- Active Directory = LDAP服务器+LDAP应用(Windows域控) ,AD 可以说是LDPA 的 一种应用实例 , 通过 LDAP 协议 访问AD
- Active Directory先实现一个LDAP服务器,然后自己先用这个LDAP服务器实现了自己的一个具体应用(域控)
- 简单点说 ,就是通过 LDAP 协议将 数据写入 AD Server
- 通过 AD 的 目录结构 来存储账号是合理的
四 . 操作指南
代码是基于 Windows AD 2012 进行实操 , LDAP 需要自行兼容 . 当然 ,以下代码使用的是 javax.naming , 是比较偏底层的操作方式 , 也可以选择 SpringLDAP , 用的也比较舒服.
!!!! 更详细的操作可以参考 net.tirasa.connid.bundles.ldap 包 , 很多操作最开始都是从该包学习的
Node 1 : 创建 Connect
Naming 包中通过 LdapContext 对象实现与 LDAP 的连接 , 其中 SSL 使用 ldaps://636 连接 , 非SSL 使用 ldap://389 进行连接
1 | java复制代码 |
Node 2 : 属性构建操作
1 | java复制代码 |
Node 3 : 构建 GUID
1 | JAVA复制代码/** |
Node 4 : AD 查询
LDAP 有一套完整的查询语句 , 以下举例
@ www.ietf.org/rfc/rfc2254…
1 | java复制代码// 查询所有 |
Node 5 : 其他操作
1 | java复制代码// 修改属性 |
五 . 特殊操作
5.1 User 权限操作
1 | java复制代码// 通过在 BasicAttributes 中添加 userAccountControl 属性实现设置用户的权限 |
权限的设置并不是任意的 , 部分权限只能由特定的子权限跳上去 ,AD 提供了如下权限 :
需要注意的是 , AD 权限的互转不是任意的 , 下图前四个权限只有指定的权限才能转过去 , 其他的权限可以互转!!
5.2 Group 权限操作
1 | java复制代码// 通过在 BasicAttributes 中添加 groupType 属性实现设置组的权限 |
5.3 国籍操作
1 | java复制代码// AD 中有多个属性来控制国际 |
5.4 连接池问题
参考文档 @ docs.oracle.com/javase/jndi…
该文档中对连接池做了很详细的描述
1 | java复制代码// 常规配置连接池的方式 : |
The default rule is that plain (non-SSL) connections that use simple or no authentication are allowed to be pooled
即连接池可能存在不会生效的可能 , 这个时候需要考虑修改配置
com.sun.jndi.ldap.connect.pool.protocol: 同时允许使用普通连接和SSL连接
com.sun.jndi.ldap.connect.pool.authentication : (none/simple/DIGEST-MD5)允许使用匿名(none)、简单和摘要- md5认证类型的连接池 , 需要配置
5.5 AD 特殊字符
AD 中可以通过ASCII 码传入特殊字符 ,例如可以将名称 , 但是要注意的是 = 或者类似的符号 ,在 AD 中本身就存在 , 他在生成的时候 , AD会自动添加 / 转义 , 所以对于我们使用的时候 , 就需要把自动转义的加上!!
总结
大概整理了一点皮毛 ,因为不想跑虚拟机 , 很多暂时没录上 , 后续如果有机会会考虑放上去 (太小众了 , 也不知道有没有人看)
本文转载自: 掘金