如何在RHEL 8环境下通过NTLM认证连接AD域RDS实例查询数据
解决RHEL8上pyodbc通过NTLM认证连接AD域RDS的问题
一、修正连接字符串格式
NTLM认证的连接字符串必须包含明确的域用户格式、认证方式,以及适配RDS的加密参数,示例如下:
import pyodbc conn_str = ( "DRIVER={ODBC Driver 18 for SQL Server};" "SERVER=your-rds-endpoint,1433;" "DATABASE=your-target-db;" "UID=YOUR-AD-DOMAIN\\domain-username;" "PWD=your-domain-password;" "Authentication=NTLM;" "Encrypt=yes;" "TrustServerCertificate=no;" ) try: conn = pyodbc.connect(conn_str) print("连接成功") conn.close() except pyodbc.Error as e: print(f"连接失败: {e}")
注意事项:
- 驱动名称必须和系统已安装的完全匹配,可用
odbcinst -q -d命令查看已安装的ODBC驱动列表 UID必须采用域\用户名的格式,不能只填用户名Encrypt=yes是RDS的强制要求,TrustServerCertificate生产环境建议设为no,需确保系统信任AWS的SSL证书
二、配置RHEL8的NTLM依赖组件
Linux上的msodbcsql驱动依赖Kerberos组件处理NTLM认证,需完成以下配置:
- 安装必要系统包:
sudo dnf install krb5-workstation krb5-libs -y
- 修改
/etc/krb5.conf配置文件,填入你的AD域信息:
[libdefaults] default_realm = YOUR-AD-DOMAIN.COM # 大写域名 dns_lookup_kdc = true dns_lookup_realm = true [realms] YOUR-AD-DOMAIN.COM = { kdc = ad-domain-controller.your-ad-domain.com # 域控制器地址 admin_server = ad-domain-controller.your-ad-domain.com } [domain_realm] .your-ad-domain.com = YOUR-AD-DOMAIN.COM your-ad-domain.com = YOUR-AD-DOMAIN.COM
配置完成后,可通过kinit domain-username@YOUR-AD-DOMAIN.COM测试域用户认证是否正常。
三、验证驱动与pyodbc兼容性
- 检查ODBC驱动是否正常安装:
odbcinst -q -d
确保输出中存在你在连接字符串中指定的驱动(如ODBC Driver 18 for SQL Server)
- 升级pyodbc到最新版本,避免版本兼容问题:
pip install --upgrade pyodbc
四、常见问题排查
- NTLM认证失败:
- 确认域用户拥有RDS实例的访问权限,以及目标数据库的查询权限
- 测试RHEL8实例能否解析AD域控制器地址:
nslookup ad-domain-controller.your-ad-domain.com - 检查RDS安全组是否允许RHEL8实例的IP访问1433端口
- 驱动加载失败:
- 确保连接字符串中的驱动名称与
odbcinst -q -d输出完全一致(注意大小写和空格) - 检查驱动文件权限,例如
/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.3.so.2.1需保证Python进程可读
- 确保连接字符串中的驱动名称与
- SSL证书错误:
- 临时测试可将
TrustServerCertificate设为yes,但生产环境建议安装AWS根证书:下载证书后放入/etc/pki/ca-trust/source/anchors/,执行update-ca-trust extract更新系统信任库
- 临时测试可将
内容的提问来源于stack exchange,提问作者notBacon
相关产品推荐
相关产品推荐

