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

個人開発でローカルネットワーク内の名前解決が必要になったので、BIND で DNS を立てて、ゾーン情報の更新は Terraform に寄せた。手元で叩ける状態にするまでの手順を残す。

環境

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_algorithmkey_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 を回せば手元から鍵を分離できる。

参考

メモ

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

rpm -q --changelog bind | grep CVE