権威サーバ（マスタサーバ）をBINDで構築してみました

#■ 概要
権威サーバ（マスタサーバ）の構築手順をまとめました。

DNSサーバ共通の構築手順（BINDのインストールなど）やキャッシュサーバ、権威サーバ（スレーブサーバ）の構築手順はこちらをどうぞ。

▼セキュアなDNS環境を構築してみました
[http://qiita.com/nk9bb8/items/5a52c8c5a5e14901775d](http://qiita.com/nk9bb8/items/5a52c8c5a5e14901775d)

▼キャッシュサーバをBINDで構築してみました
[http://qiita.com/nk9bb8/items/15f4cb9756a2043e4bba](http://qiita.com/nk9bb8/items/15f4cb9756a2043e4bba)

▼権威サーバ（スレーブサーバ）をBINDで構築してみました
[http://qiita.com/nk9bb8/items/9a0b678b1abdfcb958ea](http://qiita.com/nk9bb8/items/9a0b678b1abdfcb958ea)


#■ /etc/named.conf の設定内容
※デフォルトの設定値から変更している箇所を中心にコメントを入れています。

```
// アクセス制御リスト
acl "locals" {      
    192.168.56.0/24;                                // 検証環境のローカスアドレス
    127.0.0.1;
};

// BIND全体の設定
options {
    listen-on port 53 { 127.0.0.1; 192.168.56.111; };   // リクエスト待受けポート／アドレス
    listen-on-v6 port 53 { none; };                     // 検証環境なので、IPv6無効

    directory   "/var/named";
    dump-file   "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";

    allow-query { locals; };                        // 問合せの受付けを許可するアドレス
    allow-transfer { none; };                       // ゾーン転送を拒否する
    recursion no;                                   // 再帰問合せの受付けを拒否する

    dnssec-enable yes;                              // DNSSECを有効にする
    dnssec-validation yes;                          // 問合せ結果をDNSSECで検証する

    version none;                                   // バージョンを非表示にする

    bindkeys-file "/etc/named.iscdlv.key";
    managed-keys-directory "/var/named/dynamic";
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
};

// ログ設定
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

// example.jpゾーンを設定（正引き用）
zone "example.jp" IN {
    type master;                                    // マスタサーバ
    file "example.jp.zone.signed";                  // 署名されたゾーンファイル
    allow-update { none; };                         // 動的更新を許可しない
    allow-transfer { 192.168.56.112; };             // ゾーン転送の許可アドレス
    notify yes;                                     // ゾーン情報の更新をスレーブサーバに通知する
};

// example.jpゾーンを設定（逆引き用）
zone "56.168.192.in-addr.arpa" {
    type master;                                    // マスタサーバ
    file "56.168.192.in-addr.arpa.rev.signed";      // 署名されたゾーンファイル
    allow-update { none; };                         // 動的更新を許可しない
    allow-transfer { 192.168.56.112; };             // ゾーン転送の許可アドレス
    notify yes;                                     // ゾーンデータの更新をスレーブサーバに通知する
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

```

#■ ゾーンファイルを作成

####◆/var/named/example.jp.zone（正引き用）を新規作成。

```
$TTL 1D                                     ; キャッシュ期間

@         IN  SOA  master-ns.example.jp.  root.master-ns.example.jp. (  ; 権威付け
                   2017090301               ; シリアル番号
                   3H                       ; リフレッシュ間隔
                   1H                       ; リトライ間隔
                   1W                       ; 失効時間
                   1H )                     ; 存在しないドメインのキャッシュ期間

          IN  NS   master-ns.example.jp.    ; ネームサーバ
          IN  NS   slave-ns.example.jp.     ; ネームサーバ

cache-ns  IN  A    192.168.56.101           ; 正引き用
master-ns IN  A    192.168.56.111           ; 正引き用
slave-ns  IN  A    192.168.56.112           ; 正引き用
pc1       IN  A    192.168.56.151           ; 正引き用
pc2       IN  A    192.168.56.152           ; 正引き用
pc3       IN  A    192.168.56.153           ; 正引き用

```

####◆/var/named/56.168.192.in-addr.arpa.rev（逆引き用）を新規作成。

```
$TTL 1D                                     ; キャッシュ期間

@         IN  SOA  master-ns.example.jp.  root.master-ns.example.jp. (  ; 権威付
                   2017090301               ; シリアル番号
                   3H                       ; リフレッシュ間隔
                   1H                       ; リトライ間隔
                   1W                       ; 失効時間
                   1H )                     ; 存在しないドメインのキャッシュ期間

          IN  NS   master-ns.example.jp.    ; ネームサーバ
          IN  NS   slave-ns.example.jp.     ; ネームサーバ
          IN  PTR  example.jp.              ; ドメイン名
          IN  A    255.255.255.0            ; サブネットマスク

101       IN  PTR  cache-ns.example.jp.     ; 逆引き用
111       IN  PTR  master-ns.example.jp.    ; 逆引き用
112       IN  PTR  slave-ns.example.jp.     ; 逆引き用
151       IN  PTR  pc1.example.jp.          ; 逆引き用
152       IN  PTR  pc2.example.jp.          ; 逆引き用
153       IN  PTR  pc3.example.jp.          ; 逆引き用

```

####◆ゾーンファイルの構文チェック

```
★正引き用
# named-checkzone example.jp example.jp.zone

★逆引き用
# named-checkzone 56.168.192.in-addr.arpa 56.168.192.in-addr.arpa.rev

```

#■ DNSSEC対応

####◆ZSK鍵（ゾーン情報に電子署名を行う鍵）を作成

```
★正引き用
# dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone example.jp

　【作成されたファイル】
　・Kexample.jp.+008+00723.private  （秘密鍵）
　・Kexample.jp.+008+00723.key      （公開鍵）

★逆引き用
# dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone 56.168.192.in-addr.arpa

　【作成されたファイル】
　・K56.168.192.in-addr.arpa.+008+23340.private  （秘密鍵）
　・K56.168.192.in-addr.arpa.+008+23340.key      （公開鍵）

```

####◆KSK鍵（ZSKに電子署名を行う鍵）を作成

```
★正引き用
# dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone example.jp

　【作成されたファイル】
　・Kexample.jp.+008+28870.private  （秘密鍵）
　・Kexample.jp.+008+28870.key      （公開鍵）

★逆引き用
# dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone 56.168.192.in-addr.arpa

　【作成されたファイル】
　・K56.168.192.in-addr.arpa.+008+28480.private  （秘密鍵）
　・K56.168.192.in-addr.arpa.+008+28480.key      （公開鍵）

```

####◆公開鍵をゾーンファイルに追加

```
★正引き用
# echo "\$INCLUDE \"Kexample.jp.+008+00723.key\"" >> example.jp.zone 
# echo "\$INCLUDE \"Kexample.jp.+008+28870.key\"" >> example.jp.zone 

★逆引き用
# echo "\$INCLUDE \"K56.168.192.in-addr.arpa.+008+23340.key\"" >> 56.168.192.in-addr.arpa.rev 
# echo "\$INCLUDE \"K56.168.192.in-addr.arpa.+008+28480.key\"" >> 56.168.192.in-addr.arpa.rev 

```

####◆ゾーンファイルに署名

```
★正引き用
# dnssec-signzone -k Kexample.jp.+008+28870.private -o example.jp example.jp.zone Kexample.jp.+008+00723.private

　【作成されたファイル】
　・example.jp.zone.signed  （署名されたゾーンファイル）
　・dsset-example.jp.       （上位ゾーンの権威サーバに登録してもらうDS情報）
　　※今回は外部公開しないゾーンの為、DS情報は使用しない。

★逆引き用
# dnssec-signzone -k K56.168.192.in-addr.arpa.+008+28480.private -o 56.168.192.in-addr.arpa 56.168.192.in-addr.arpa.rev K56.168.192.in-addr.arpa.+008+23340.private

　【作成されたファイル】
　・56.168.192.in-addr.arpa.rev.signed  （署名されたゾーンファイル）
　・dsset-56.168.192.in-addr.arpa.      （上位ゾーンの権威サーバに登録してもらうDS情報）
　　※今回は外部公開しないゾーンの為、DS情報は使用しない。

```

#■ TSIG対応

####◆共通鍵の作成

```
# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key

　【作成されたファイル】
　・Ktsig-key.+157+23333.private  （秘密鍵）
　・Ktsig-key.+157+23333.key      （公開鍵）

# grep ^Key Ktsig-key.+157+23333.private 
Key: lC5r2g9VELb+/ZF3K2N5mw==

```

####◆/etc/named.confに共通鍵を登録

```
// TSIG共通鍵
key "tsig-key" {
    algorithm hmac-md5;                         // アルゴリズム
    secret "lC5r2g9VELb+/ZF3K2N5mw==";          // キー値
};

// TSIGスレーブサーバ
server 192.168.56.112 {
    keys { tsig-key; };                         // TSIG共通鍵
};

```