はじめに
こんにちは。
今回は、個人的な開発の都合でローカルのデバイスが所属するネットワークの範囲で名前解決をする必要がありました。
そのため、BINDでDNSを構築したうえでTerraformでゾーン管理までできるようにします。
環境
- BIND 9.16.23-RH
- RHEL 9.5 x64_86
- Terraform v1.11.4
- hashicorp/dns 3.4.3
DNS構築
このページを参考に行いました、特筆すべきものはないと思います。 docs.redhat.com
Terraformでゾーンを管理
なぜTerraformなのか
理由としては、インフラをコード管理する場面でTerraformを使うことが多いため。 Terraform以外の管理方法で進めると、管理しなければならないものが増え、管理するのが大変であるため。
やること
Terraform から TSIG鍵 を用いた認証によりクライアントを認証し、ゾーン情報を安全に更新できるようにします。
1. TSIG 鍵作成
以下のコマンドで TSIG鍵 を作成
tsig-keygen {鍵の名前} > {保存場所}/{ファイル名}.tsig.key
2. 作成した TSIG鍵 をnamed.confで読み込めるようにする
以下を named.conf に記述する
include "{保存場所}/{ファイル名}.tsig.key";
3. 作成した TSIG鍵 を用いてゾーン情報を更新できるようにする
zone "{ゾーン名}" IN {
...他設定
allow-update { key "{鍵の名前}"; };
};
4. Terraformで管理するゾーン情報を記述
key_algorithmとkey_secretは作成した TSIG鍵 の中身に書いてあるものをコピペすれば良いです。
# 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鍵 があればどこからでも更新できる状態になっています。鍵の安全な管理と、接続する相手を適切に制限しましょう。
まとめ
これでDNS構築が完了し、ゾーン情報をTerraformで管理できます。
あとは、GitHubにリポジトリを作成して、CIで更新できるようにしたら良い感じになるのかなと思います。
参考
- 第3章 Bind9 のインストールおよび設定 | Red Hat Product Documentation
- https://www.isc.org/docs/2021-bind-mgmt-05-webinar.pdf
- https://webinar.defaultroutes.de/webinar/05-ddns-workshop.html
メモ
CVEに関する変更記録を確認するコマンド
rpm -q --changelog bind | grep CVE