如何用Python的LDAP3模块通过LDAP签名连接AD查询GMSA属性
如何通过LDAP3模块或其他工具实现带LDAP签名的AD连接(389端口)
要在未部署LDAPS证书的环境下,通过389端口连接AD并启用LDAP签名(完整性校验),核心依赖Kerberos认证绑定——LDAP签名必须基于Kerberos会话密钥实现,无法通过明文绑定启用。以下是具体实现方案:
一、使用LDAP3模块实现
核心要点
- 必须采用SASL的
KERBEROS认证机制 - 通过
sasl_options={'sign': True}启用LDAP签名 - 无需启用SSL,直接使用389端口
代码示例
from ldap3 import Server, Connection, SASL, KERBEROS # 替换为你的AD域控制器地址 ad_server = 'dc01.example.com' # 替换为目标GMSA的DN gmsa_dn = 'CN=MyGMSA,OU=ServiceAccounts,DC=example,DC=com' # 初始化LDAP服务器对象(禁用SSL) server = Server(ad_server, port=389, use_ssl=False) # 建立带签名的Kerberos连接 conn = Connection( server, authentication=SASL, sasl_mechanism=KERBEROS, sasl_options={'sign': True}, # 启用LDAP签名 check_names=True ) # 执行绑定与查询 if conn.bind(): print("带LDAP签名的连接建立成功") # 查询GMSA的ManagedPassword属性 conn.search( search_base=gmsa_dn, search_filter='(objectClass=msDS-GroupManagedServiceAccount)', attributes=['msDS-ManagedPassword'] ) # 输出结果 for entry in conn.entries: print(f"GMSA密码Blob: {entry.msDS_ManagedPassword}") conn.unbind() else: print(f"连接失败: {conn.result}")
环境配置说明
Windows平台
- 若以域用户身份运行代码,系统会自动获取Kerberos票据,无需额外配置
- 若以本地用户运行,需先通过命令行获取票据:
输入用户密码后再运行代码kinit username@EXAMPLE.COM
Linux/macOS平台
- 安装Kerberos客户端工具:
# Debian/Ubuntu sudo apt install krb5-user # RHEL/CentOS sudo yum install krb5-workstation - 配置
/etc/krb5.conf,指定AD域的KDC信息:[libdefaults] default_realm = EXAMPLE.COM dns_lookup_kdc = true [realms] EXAMPLE.COM = { kdc = dc01.example.com admin_server = dc01.example.com } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM - 获取Kerberos票据:
kinit username@EXAMPLE.COM - 运行Python代码
二、使用ldapsearch工具实现
如果不需要编程,可直接用ldapsearch命令行工具实现带签名的查询:
ldapsearch -Y GSSAPI -h dc01.example.com -p 389 \ -b "CN=MyGMSA,OU=ServiceAccounts,DC=example,DC=com" \ "(objectClass=msDS-GroupManagedServiceAccount)" \ msDS-ManagedPassword -E "sign=TRUE"
-Y GSSAPI:指定Kerberos认证-E "sign=TRUE":启用LDAP签名-b:指定查询的基准DN
三、常见问题排查
- AD服务器配置检查:确保域控制器的组策略中,“域控制器: LDAP服务器签名要求”设置为「需要签名」或「允许签名」
- 权限验证:确保用于连接的AD用户拥有读取GMSA对象
msDS-ManagedPassword属性的权限 - Kerberos票据有效性:用
klist(Windows/Linux)命令查看当前是否有有效的Kerberos票据 - 错误信息分析:若连接失败,重点查看
conn.result(LDAP3)或命令行输出中的错误码,排查Kerberos认证失败、签名未启用等问题
内容的提问来源于stack exchange,提问作者Sitaram Pamarthi
相关产品推荐
相关产品推荐

