i999rriの日記

時々へんなこと書いてるけど気にしないでね

BINDでDNS構築、Terraformでゾーン情報を管理

はじめに

こんにちは。 今回は、個人的な開発の都合でローカルのデバイスが所属するネットワークの範囲で名前解決をする必要がありました。
そのため、BINDでDNSを構築したうえでTerraformでゾーン管理までできるようにします。

環境

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で更新できるようにしたら良い感じになるのかなと思います。

参考

メモ

CVEに関する変更記録を確認するコマンド

rpm -q --changelog bind | grep CVE