LDAP 与 389 端口
389 是 LDAP v3 的标准端口(RFC 4511),企业的目录服务用它提供用户、组、设备的查询与认证,Windows 域的 AD、OpenLDAP 与 389 Directory Server 都把 389 作为主要入口。默认明文传输,Simple Bind 的口令不经加密就过网,所以 389 是内网横向渗透中的高价值目标。636 是 LDAPS 隐式 TLS,3268 与 3269 为 AD 全局编录及其加密版本。
基本信息
| 服务 | ldap(Lightweight Directory Access Protocol) |
|---|---|
| 协议 | TCP/UDP |
| 规范 | RFC 4511(LDAP v3) |
| 权限要求 | 匿名绑定常见但危险;绑定账户按最小权限授予读范围 |
| 常见实现 | AD、OpenLDAP、389 Directory Server |
| 常用工具 | ldapsearch、ldapwhoami、ldapmodify |
典型使用场景
- 员工账号统一认证:VPN、堡垒机、OA 等系统对接目录做登录校验
- 通讯录与组织架构查询:按 uid、mail、memberOf 检索人员信息
- 系统对接授权:应用读取组成员关系判断角色
- AD 全局编录查询:跨域林查询用户与对象信息
- 只读镜像:从主目录同步到查询专用节点,隔离认证与查询流量
相关端口对照
| 端口 | 用途 | 加密方式 |
|---|---|---|
| 389/tcp | LDAP 主入口 | 明文,可用 StartTLS 就地升级 |
| 636/tcp | LDAPS | 连接即建立 TLS(隐式加密) |
| 3268/tcp | AD 全局编录查询 | 明文,可用 StartTLS |
| 3269/tcp | AD 全局编录加密查询 | 隐式 TLS |
查询与绑定自检
查询与绑定自检
ldapsearch -x -H ldap://192.0.2.10:389 -b 'dc=example,dc=com' -s base # 只取根条目,判断服务是否响应
ldapsearch -x -H ldap://192.0.2.10:389 -b 'dc=example,dc=com' '(uid=alice)' cn mail # 匿名或已配置绑定的检索
ldapsearch -x -ZZ -H ldap://192.0.2.10:389 -D 'uid=alice,ou=people,dc=example,dc=com' -W '(uid=alice)' # -ZZ 要求 StartTLS 成功再继续
ldapsearch -x -H ldaps://ldap.example.com:636 -b 'dc=example,dc=com' '(uid=alice)' # 换协议头即走 636 隐式加密
ldapwhoami -x -H ldaps://ldap.example.com:636 -D 'uid=alice,ou=people,dc=example,dc=com' -W # 确认绑定成功的身份输出逐列读法
| 输出项 | 含义 | 正常/异常 |
|---|---|---|
| dn | 条目的唯一标识路径 | 与检索的基准路径层级应一致 |
| objectClass | 对象类型 | person 与 organizationalPerson 的组合属正常 |
| numEntries | 返回条目数 | 匿名查询返回大量条目说明暴露面过大 |
| result: 0 Success | 操作返回码 | 49 为凭据无效,32 为条目不存在 |
| ldap_start_tls | StartTLS 结果 | 出现 Protocol error 多为服务端未启用 TLS |
常用检索与输出控制
常用检索与输出控制
ldapsearch -x -H ldaps://ldap.example.com -b 'dc=example,dc=com' '(objectClass=person)' cn mail # 只取需要的属性
ldapsearch -x -H ldaps://ldap.example.com -b 'dc=example,dc=com' -LLL '(uid=alice)' memberOf # -LLL 去掉注释行,输出更干净
ldapsearch -x -H ldaps://ldap.example.com -b 'dc=example,dc=com' '(memberOf=cn=ops,ou=groups,dc=example,dc=com)' cn # 按组成员反查人员允许匿名绑定会把整个目录结构(用户、组、邮箱、电话)暴露给任何能连上 389 的人;生产目录应禁用匿名查询并强制加密传输。
StartTLS 判读:带 -ZZ 时若提示无法升级,多数是服务端未启用 TLS 或证书配置不完整;AD 域控通常现成支持,OpenLDAP 需要先配好服务端证书再启用。
排障顺序:先用 ldapwhoami 确认绑定身份是否为预期账户,再用最窄的基准路径与过滤器检索,最后才放宽范围;把服务不可用与权限不足分清楚,能省掉大半来回试错。
目录加固清单
- 禁用匿名绑定,未认证的检索请求直接拒绝
- 强制加密:能上 636 就上 636,保留 389 时要求 StartTLS 成功后才允许绑定
- 收窄可查范围:绑定账户只授予以应用为单位的基准路径与必需属性
- 关闭不必要的写权限,目录写入只留给运维账户
- 只在内网或专用管理网可达,不向公网发布 389 与 636
- 开启访问日志,定期核对异常绑定来源与高频枚举行为
常见返回码判读
| 返回码 | 含义 | 处置方向 |
|---|---|---|
| 0 Success | 操作成功 | 无需处理 |
| 32 No such object | 基准路径或条目不存在 | 核对 -b 基准路径与目录实际结构 |
| 49 Invalid credentials | 凭据无效或该绑定方式不被允许 | 核对口令与账户 DN,确认服务端是否禁用该方式 |
| 53 Unwilling to perform | 服务端策略拒绝操作 | 多为权限或只读副本限制,查服务端日志 |
AD 环境注意:除 389 与 636 外还有全局编录 3268/3269,跨域林查询必须走后者;若本域 389 正常而跨域查询失败,先确认应用连的是 3268 而不是 389。
引用要留意:OpenLDAP 的 referral 会把客户端转到另一台服务器继续查询,输出里出现 ref 行说明结果并非当前服务器给出,此时问题可能在下一跳而不是入口节点。