使用Terraform Hashicorp DNS Provider对接AD DNS遇身份验证失败错误求助
问题场景
尝试通过Hashicorp DNS Provider在Microsoft AD DNS环境中创建DNS A记录,已解决krb5配置、用户名格式等基础问题,但执行terraform apply时仍触发认证错误:
module.ad_dns_a_record.dns_a_record_set.ad_a_record[0]: Creating... ╷ │ Error: Error updating DNS record: dns: bad authentication │ │ with module.ad_dns_a_record.dns_a_record_set.ad_a_record[0], │ on ../main.tf line 2, in resource "dns_a_record_set" "ad_a_record": │ 2: resource "dns_a_record_set" "ad_a_record" {
已在Linux及域内Windows机器验证自定义krb5配置有效性,现针对该认证错误提供排查思路。
附相关配置示例
Terraform Provider配置
provider "dns" { update { server = var.dns_server # Using the hostname is important in order for an SPN to match gssapi { realm = "AD.TEST.COM" username = "svc_xxxxx" password = "xxxxxxx" } } }
测试用模块调用代码
module "ad_dns_a_record" { source = "../" dns_zone = "inf.test." name = "test" dns_records = ["192.168.177.177"] ttl = "300" record_type = "A" }
模块代码
resource "dns_a_record_set" "ad_a_record" { count = var.record_type == "A" ? 1 : 0 name = var.name zone = var.dns_zone addresses = var.dns_records ttl = var.ttl } resource "dns_cname_record" "ad_cname" { count = var.record_type == "CNAME" ? 1 : 0 name = var.name zone = var.dns_zone cname = var.dns_records ttl = var.ttl }
KRB5配置
# Configuration snippets may be placed in this directory as well includedir /etc/krb5.conf.d/ [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] # dns_lookup_realm = false # ticket_lifetime = 24h # renew_lifetime = 7d # forwardable = true # rdns = false # pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt default_realm = AD.TEST.COM # default_ccache_name = KEYRING:persistent:%{uid} [realms] AD.TEST.COM = { kdc = xxxx.ad.test.com kdc = xxxx01.ad.test.com } [domain_realm] .ad.test.com = AD.TEST.COM ad.test.com = AD.TEST.COM
排查方向
1. SPN匹配验证
你已注意到server字段需用主机名匹配SPN,但需进一步确认:
- 在域控制器上执行
setspn -L <dns-server-hostname>,检查是否存在DNS/<dns-server-hostname>.AD.TEST.COM和DNS/<dns-server-hostname>格式的SPN;若缺失,需用setspn -A DNS/<hostname> <hostname>注册 - 确保
var.dns_server的值与SPN中的主机名完全一致,不能使用IP地址,且该主机名能被Terraform运行机器正确解析
2. 账号权限与状态检查
- 登录AD DNS管理器,检查目标区域
inf.test.的安全设置,确认svc_xxxxx账号拥有创建子记录、写入等权限 - 检查账号状态:是否锁定、密码是否过期,以及是否被配置为仅允许NTLM认证(需确保账号支持Kerberos)
3. Krb5配置隐性问题
尽管已测试配置,仍需排查:
- 取消
krb5.conf中[libdefaults]下forwardable = true的注释,部分AD环境要求Kerberos票据可转发 - 验证Terraform运行机器能访问KDC服务器的88端口(UDP/TCP),可通过
telnet xxxx.ad.test.com 88测试 - 手动获取Kerberos票据:执行
kinit svc_xxxxx@AD.TEST.COM,输入密码后用klist查看是否成功获取;若失败,说明krb5配置或账号仍存在问题
4. DNS Provider版本兼容性
旧版本的Hashicorp DNS Provider可能存在AD DNS GSSAPI认证bug,尝试升级到最新稳定版:
在versions.tf中指定版本:
terraform { required_providers { dns = { source = "hashicorp/dns" version = "~> 3.3.0" # 替换为当前最新稳定版本 } } }
5. DNS区域格式校验
检查模块调用中的dns_zone = "inf.test.",确认末尾的点与AD DNS中实际区域的格式一致:AD DNS区域通常以完整域名结尾(如inf.test.com.),格式不匹配可能导致认证时资源识别错误
内容的提问来源于stack exchange,提问作者cjm888

