Linux下用pyodbc通过Windows认证连MS SQL时Kerberos服务器未找到错误
问题排查:Linux环境下pyodbc通过Kerberos连接SQL Server失败
环境信息
- SQL Server:Windows Server 2012 R2 Standard,SQL Server Enterprise 12.0.5579.0(64位)
- Linux主机:Ubuntu 20.04 Docker容器,Python 3.9.7 + pyodbc 4.0.30
- 现状:SQL密码认证正常,已通过
kinit获取有效Kerberos票据,但使用Trusted_Connection=Yes连接时,报错:pyodbc.Error: ('HY000', '[HY000] [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: Server not found in Kerberos database (851968) (SQLDriverConnect)')
核心配置遗漏排查
1. 补全krb5.conf的关键配置
仅设置default_realm不足以完成Kerberos认证,需补充域映射和KDC相关配置,示例如下:
[libdefaults] default_realm = YOUR_DOMAIN.COM # 大写域名,Kerberos对大小写敏感 dns_lookup_kdc = true dns_lookup_realm = true ticket_lifetime = 24h renew_lifetime = 7d [realms] YOUR_DOMAIN.COM = { kdc = YOUR_DC_FQDN # 域控制器的完全限定域名 admin_server = YOUR_DC_FQDN default_domain = YOUR_DOMAIN.COM } [domain_realm] .your_domain.com = YOUR_DOMAIN.COM your_domain.com = YOUR_DOMAIN.COM
- 开启
dns_lookup_kdc可自动从DNS获取KDC地址,也可手动指定域控制器FQDN
2. 检查SQL Server的SPN注册状态
Kerberos认证要求SQL Server注册正确的服务主体名称(SPN),否则客户端无法匹配服务票据:
- 在域控制器或SQL Server主机上,以域管理员身份执行:
需确保输出中存在setspn -L SQL_SERVER_HOSTNAMEMSSQLSvc/SQL_SERVER_FQDN:1433或MSSQLSvc/SQL_SERVER_FQDN(默认端口1433可省略) - 若SPN缺失,执行以下命令添加(替换占位符):
其中setspn -A MSSQLSvc/SQL_SERVER_FQDN:1433 DOMAIN\SQL_SERVICE_ACCOUNTSQL_SERVICE_ACCOUNT是SQL Server运行的域账号
3. 修正连接字符串的服务器名称
必须使用SQL Server的完全限定域名(FQDN),不能用NetBIOS名称或IP地址,示例:
pyodbc.connect('driver={ODBC Driver 17 for SQL Server};server=sqlserver.yourdomain.com;DATABASE=<db_name>;Trusted_Connection=Yes;TrustServerCertificate=Yes')
4. 确保Docker容器的Kerberos票据可用
Docker容器默认不会继承主机的Kerberos环境,需做以下配置:
- 运行容器时挂载票据缓存文件:
docker run -v /tmp/krb5cc_1001:/tmp/krb5cc_1001 -e KRB5CCNAME=/tmp/krb5cc_1001 ... - 或在容器内重新执行
kinit <user>@YOUR_DOMAIN.COM获取有效票据
区分主机端与服务器端问题的方法
主机端问题排查
- 测试Kerberos服务票据获取:在容器内执行:
若报错kvno MSSQLSvc/SQL_SERVER_FQDN:1433Server not found in Kerberos database,说明客户端无法定位SPN,需检查krb5.conf、DNS解析或SPN注册 - 验证DNS解析:执行
nslookup SQL_SERVER_FQDN和nslookup YOUR_DC_FQDN,确保能正确解析到对应IP - 检查krb5.conf加载状态:执行
krb5-config --dump,确认配置参数正确加载
服务器端问题排查
- 检查SPN归属:用
setspn -L SQL_SERVER_HOSTNAME确认SPN属于SQL Server运行的服务账号,而非其他账号 - 查看SQL Server认证日志:在Windows事件查看器中,查看
应用程序和服务日志 > Microsoft > SQL Server > MSSQLSERVER > 安全性,查找Kerberos认证失败的详细记录 - 验证KDC服务状态:确保域控制器的
Kerberos Key Distribution Center服务正常运行,且SQL Server主机能访问KDC的88端口(UDP/TCP)
额外验证步骤
- 使用
isql工具绕过Python,直接测试ODBC Kerberos连接:
若同样报错,说明问题在ODBC/Kerberos层面,与pyodbc无关isql -v "DRIVER={ODBC Driver 17 for SQL Server};SERVER=SQL_SERVER_FQDN;DATABASE=<db_name>;Trusted_Connection=Yes;TrustServerCertificate=Yes" - 确保容器内安装了Kerberos依赖包:
krb5-user、libkrb5-dev
内容的提问来源于stack exchange,提问作者lonfo
相关产品推荐
相关产品推荐

