BINDでDNS構築、Terraformでゾーン情報を管理
個人開発でローカルネットワーク内の名前解決が必要になったので、BIND で DNS を立てて、ゾーン情報の更新は Terraform に寄せた。手元で叩ける状態にするまでの手順を残す。
環境
- BIND 9.16.23-RH
- RHEL 9.5 x64_86
- Terraform v1.11.4
- hashicorp/dns 3.4.3
DNS 構築
Red Hat のドキュメントの手順をそのまま踏んだ。 docs.redhat.com
Terraform でゾーンを管理
なぜ Terraform か
他のインフラも Terraform で管理しているので、DNS だけ別の管理体系にすると管理対象と手順が増える。同じ tooling に寄せる。
構成
Terraform から TSIG 鍵で認証してゾーンを更新する。BIND 側で鍵を発行、named.conf で読み込み、ゾーンに対して更新を許可、Terraform に同じ鍵を持たせる、という流れ。
1. TSIG 鍵を作る
tsig-keygen {鍵の名前} > {保存場所}/{ファイル名}.tsig.key
2. named.conf で鍵を読み込む
include "{保存場所}/{ファイル名}.tsig.key";
3. ゾーンに更新を許可する
zone "{ゾーン名}" IN {
...他設定
allow-update { key "{鍵の名前}"; };
};
4. Terraform に鍵を渡してゾーンを書く
key_algorithm と key_secret は 1 で作った鍵ファイルの中身をそのまま入れる。
# Configure the DNS Provider
provider "dns" {
update {
server = "{DNSサーバホスト名}"
key_name = "{鍵の名前}." // 鍵の名前の最後に . をつけ忘れないように
key_algorithm = ""
key_secret = ""
}
}
# Create a DNS A record set
resource "dns_a_record_set" "arecord.example.zone" {
zone = "example.zone."
name = "arecord"
addresses = [ "" ] // 設定するIPを記述する
ttl = 300
}
注意
この構成のままだと、TSIG 鍵さえあればどこからでも更新できる。鍵の保管と、接続元の制限は別途組み込む必要がある。
次にやること
ゾーン設定を GitHub のリポジトリに置いて、CI から terraform apply を回せば手元から鍵を分離できる。
参考
- 第3章 Bind9 のインストールおよび設定 | Red Hat Product Documentation
- https://www.isc.org/docs/2021-bind-mgmt-05-webinar.pdf
www.isc.org
- ISC dynamic DNS Workshop, Part 2
webinar.defaultroutes.de
メモ
CVE に関する変更記録を確認するコマンド。
rpm -q --changelog bind | grep CVE