Rundeck对接新LDAP持续报错误码49的排查求助
Rundeck对接新LDAP报LDAP error code 49 - Invalid Credentials排查方案
问题描述
尝试将Rundeck对接新LDAP服务(旧LDAP曾正常运行),始终收到报错:
LDAP: error code 49 - Invalid Credentials
已完成的排查动作:
- 通过
ldapsearch验证了证书与凭据的有效性 - 将所需证书添加至
/etc/rundeck/ssl/truststore及/home/rundeck/etc/rundeck/ssl/truststore - 执行
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit查看JAVA密钥库中的证书
尝试的两种部署方式配置:
1. War包部署的jaas-ldap.conf配置
ldap { com.dtolabs.rundeck.jetty.jaas.JettyCachingLdapLoginModule sufficient debug="true" contextFactory="com.sun.jndi.ldap.LdapCtxFactory" providerUrl="ldaps://our.ldap.org:636" bindDN="uid=icrundeck,ou=accounts,ou=ims_service,o=ourorg,c=GB" bindPassword="xxxxxxxxx" authenticationMethod="simple" forceBindingLogin="true" userBaseDn="ou=users,ou=icrundeck,ou=ims_service,o=ourorg,c=GB" userRdnAttribute="uid" userIdAttribute="uid" userObjectClass="inetOrgPerson" roleBaseDn="ou=roles,ou=icrundeck,ou=ims_service,o=ourorg,c=GB" roleNameAttribute="cn" roleUsernameMemberAttribute="uid" roleMemberAttribute="member" roleObjectClass="posixGroup" supplementalRoles="Users" cacheDurationMillis="300000" reportStatistics="true"; org.eclipse.jetty.jaas.spi.PropertyFileLoginModule required debug="true" file="/home/rundeck/server/config/realm.properties"; };
2. Docker容器部署的环境变量配置
environment: RUNDECK_LOGGING_STRATEGY: FILE RUNDECK_JAAS_MODULES_0: JettyCombinedLdapLoginModule RUNDECK_JAAS_LDAP_DEBUG: "true" RUNDECK_JAAS_LDAP_FLAG: sufficient RUNDECK_JAAS_LDAP_PROVIDERURL: ldaps://our.ldap.org:636 RUNDECK_JAAS_LDAP_FORCEBINDINGLOGIN: false RUNDECK_JAAS_LDAP_BINDDN: uid=icrundeck,ou=accounts,ou=ims_service,o=ourorg,c=GB RUNDECK_JAAS_LDAP_BINDPASSWORD: xxxxxxxx RUNDECK_JAAS_LDAP_USERBASEDN: ou=users,ou=icrundeck,ou=ims_service,o=ourorg,c=GB RUNDECK_JAAS_LDAP_ROLEBASEDN: ou=roles,ou=icrundeck,ou=ims_service,o=ourorg,c=GB RUNDECK_JAAS_MODULES_1: PropertyFileLoginModule RUNDECK_JAAS_FILE_FLAG: sufficient
排查方案
一、精准定位LDAP Error 49的子原因
LDAP错误49包含多个细分码,对应不同问题:
- 49/52e:凭据无效(用户名/密码错误)
- 49/525:用户不存在
- 49/530:用户未被允许登录(如时间限制)
- 49/531:用户无法从当前主机登录
- 49/532:密码过期
- 49/533:用户被锁定
执行带详细输出的ldapsearch查看子码:
ldapsearch -v -H ldaps://our.ldap.org:636 -D "uid=icrundeck,ou=accounts,ou=ims_service,o=ourorg,c=GB" -w "xxxxxxxxx" -b "ou=users,ou=icrundeck,ou=ims_service,o=ourorg,c=GB" "(uid=testuser)"
二、WAR包部署额外排查
确认JAAS配置加载状态
检查Rundeck启动参数是否指定了正确的配置文件:-Djava.security.auth.login.config=/path/to/jaas-ldap.conf查看Rundeck日志(默认路径
/var/log/rundeck/rundeck.log),搜索JettyCachingLdapLoginModule关键词,确认debug日志是否输出绑定过程细节。验证证书信任链完整性
检查导入的证书是否包含完整信任链(不仅是根证书):keytool -v -list -keystore /etc/rundeck/ssl/truststore -alias your-ldap-cert
三、Docker部署排查及DEBUG开启
开启完整JAAS/LDAP调试日志
当前RUNDECK_JAAS_LDAP_DEBUG参数不足以输出详细交互日志,需添加JVM调试参数:
在Docker环境变量中新增:RUNDECK_JVM_OPTS: "-Djava.security.debug=jaas,ldap"或启动容器时直接指定:
docker run -e RUNDECK_JVM_OPTS="-Djava.security.debug=jaas,ldap" ...之后查看容器日志即可获取完整的认证交互细节。
检查容器内证书信任状态
进入容器验证证书是否正确导入:docker exec -it <rundeck-container-id> bash echo $JAVA_HOME keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit若证书缺失,可通过挂载本地信任库到容器,或在Dockerfile中添加证书导入步骤。
容器内验证LDAP连接
安装ldap-utils并执行连接测试:apt-get update && apt-get install -y ldap-utils ldapsearch -v -H ldaps://our.ldap.org:636 -D "uid=icrundeck,ou=accounts,ou=ims_service,o=ourorg,c=GB" -w "xxxxxxxxx" -b "ou=users,ou=icrundeck,ou=ims_service,o=ourorg,c=GB" "(uid=testuser)"
四、通用排查点
- 统一
forceBindingLogin参数:WAR包设置为true,Docker设置为false,尝试统一设为true强制用户凭据绑定。 - 检查bindDN结构:确认新LDAP服务的OU结构是否与旧服务一致,bindDN是否正确。
- 密码特殊字符转义:若bindPassword包含特殊字符,确认配置文件/环境变量中是否正确输入(Docker环境变量无需转义)。
- 时间同步:确保Rundeck服务器(或容器)与LDAP服务器时间同步,时间差过大可能导致认证失败。
内容的提问来源于stack exchange,提问作者Gerald Hansen
相关产品推荐
相关产品推荐

