Linux环境下MSSQL Server SPN Kerberos认证连接失败求助
Kerberos认证连接SQL Server失败排查思路
问题背景
AD管理员通过setspn工具为新服务器rel配置了与已正常工作的dev服务器相同的SQL Server SPN,但Linux服务器使用MS SQL Server ODBC Driver 18连接rel时,持续出现错误:
Error: ('HY000', '[HY000] [Microsoft][ODBC Driver 18 for SQL Server]SSPI Provider: Server not found in Kerberos database (851968) (SQLDriverConnect)')
dev服务器最初也无法连接,数月后自动恢复正常,而rel配置已2周仍无法使用Kerberos认证连接。
排查步骤
1. 验证SPN的全域控制器同步状态
- 要求AD管理员在所有7个域控制器上执行以下命令,确认SPN在每个DC上都存在:
多DC环境下SPN复制可能存在延迟,setspn -Q MSSQLSvc/rel:rel_portdev的延迟恢复大概率是SPN最终同步到所有DC导致的,需确认rel的SPN已完成全域同步。 - 核对SPN格式:确保SPN为
MSSQLSvc/rel:rel_port(正斜杠),绑定的服务账号是rel实例对应的domain\rel_service_user,与dev的配置逻辑完全一致。
2. 检查Kerberos票据的获取与匹配
- 执行
kinit user@DOMAIN.ORG获取票据后,用klist查看缓存,确认是否存在MSSQLSvc/rel:rel_port@DOMAIN.ORG的服务票据。若不存在,说明Kerberos无法定位该SPN对应的服务主体。 - 尝试手动指定SPN获取票据后再测试连接:
成功获取后再执行Python连接代码,验证是否能绕过自动协商的问题,定位是SPN本身还是自动协商逻辑的故障。kinit -S MSSQLSvc/rel:rel_port user@DOMAIN.ORG
3. 优化krb5.conf配置
- 补充票据缓存路径配置,避免权限或路径问题导致票据无法读取:
[libdefaults] default_realm = DOMAIN.ORG dns_lookup_realm = true dns_lookup_kdc = true default_ccache_name = FILE:/tmp/krb5cc_%{uid} - 手动指定域控制器列表到
[realms]段,避免DNS解析到未同步SPN的DC:[realms] DOMAIN.ORG = { kdc = dc1.domain.org kdc = dc2.domain.org admin_server = dc1.domain.org }
4. 验证主机名解析与映射
- 在Linux服务器上执行
nslookup rel和nslookup rel.domain.org,确认返回的IP是rel服务器的正确地址,且SQL Server实例绑定的IP与该地址一致(多IP场景下可能导致SPN匹配失败)。 - 检查
/etc/hosts文件,若存在rel的条目,确保其IP与DNS解析结果一致,避免本地映射干扰Kerberos的SPN匹配逻辑。
5. 核对SQL Server服务账号配置
- 确认
rel的SQL Server服务运行账号为AD管理员配置SPN时指定的domain\rel_service_user,且该账号未被锁定、权限未变更。 - 在SQL Server上执行以下查询,确认服务账号已正确注册为登录名并具备连接权限:
SELECT name, principal_id, type_desc FROM sys.server_principals WHERE name = 'domain\rel_service_user'
6. 排查ODBC驱动的协商逻辑
- 修改连接字符串,使用服务器完整域名(FQDN)而非短名:
Kerberos有时需要FQDN才能精准匹配SPN。cnxn_str = ("Driver={ODBC Driver 18 for SQL Server};Server=rel.domain.org;Trusted_Connection=yes;Encrypt=No;TrustServerCertificate=yes") - 升级ODBC Driver 18到最新版本,旧版本可能存在Kerberos协商的已知bug,导致无法正确查找SPN。
内容的提问来源于stack exchange,提问作者Tim Grilley
相关产品推荐
相关产品推荐

