如何为dnspython生成DNS更新用TSIG密钥环?(企业用krb5)
解决dnspython的TSIG密钥生成与Kerberos 5适配问题
我明白你的困惑——官方文档只给了更新操作的示例,却没说密钥环怎么来,而且你们企业用Kerberos 5(krb5)认证,这和普通的TSIG密钥生成还不一样,我分两种情况给你讲清楚:
一、常规TSIG密钥的生成方法(非krb5场景)
如果你的DNS服务器用的是普通的HMAC-based TSIG认证,密钥可以通过BIND自带的dnssec-keygen工具生成,步骤如下:
- 执行生成命令(以HMAC-SHA256算法、256位密钥为例):
参数说明:dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST host-example.-a指定哈希算法(常用HMAC-SHA256、HMAC-SHA512)-b指定密钥长度(对应算法的推荐长度,比如SHA256用256位)-n HOST表示生成的是主机类型的密钥
- 命令执行后会生成两个文件(比如
Khost-example.+163+XXXXXX.key和Khost-example.+163+XXXXXX.private),打开.private文件,里面的Key:字段后面的字符串就是你需要传入dns.tsigkeyring.from_text()的密钥内容。
比如生成的.private文件内容类似:
Private-key-format: v1.3
Algorithm: 163 (HMAC_SHA256)
Key: XXXXXXXXXXXXXXXXXXXXXX==
Bits: AAA=
Created: XXXXXXXXXX
Publish: XXXXXXXXXX
Activate: XXXXXXXXXX
你只需要把Key:后面的字符串拿出来,放到代码的keyring字典里即可。
二、适配Kerberos 5(krb5)体系的GSS-TSIG用法
因为你们企业用krb5认证,DNS服务器大概率配置的是GSS-TSIG(基于Kerberos的TSIG扩展),这时候你不需要手动生成TSIG密钥,而是用Kerberos票据来完成认证,步骤如下:
- 先获取Kerberos票据:
在命令行执行kinit命令,用你的企业Kerberos主体登录:
输入密码后,票据会缓存到本地。kinit your-username@YOUR_COMPANY_REALM.COM - 修改dnspython代码:
不需要创建keyring,而是在初始化dns.update.Update时指定gss=True,示例代码如下:import dns.update import dns.query import sys # 初始化更新对象,启用GSS-TSIG认证 update = dns.update.Update('dyn.test.example', gss=True) # 添加/替换A记录 update.replace('host', 300, 'a', sys.argv[1]) # 发送更新请求到DNS服务器(替换成你的企业DNS服务器地址) response = dns.query.tcp(update, 'your-dns-server.company.com') # 打印响应结果 print(f"更新响应: {response}")
注意事项
- 确保你的Kerberos主体拥有修改目标DNS区域(
dyn.test.example)的权限,需要联系企业DNS管理员配置。 - 如果是在脚本中自动获取票据,可以用
subprocess调用kinit,或者使用python-gssapi库在代码内处理Kerberos认证。
内容的提问来源于stack exchange,提问作者Majus Misiak
相关产品推荐
相关产品推荐

