You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Terraform Hashicorp DNS Provider对接AD DNS遇身份验证失败错误求助

使用Hashicorp DNS Provider对接AD DNS时出现"dns: bad authentication"错误的排查方案

问题场景

尝试通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:47:19