サイズ: 3480
コメント:
|
サイズ: 15224
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 1: | 行 1: |
= bindによるDNSアップデートサーバー = == 目次 == |
= BIND9によるダイナミックDNSサーバーの運用 = |
行 7: | 行 5: |
* 以下のソフトウェアの利用を前提に検証を実施した。いずれも最新のリリースということで確認しているが、ある程度古い環境でも問題無いと思われる。 | * 以下のソフトウェアの利用を前提に検証を実施した。いずれも現時点で最新のリリースに基づいて検証しているが、ある程度古い環境、より新しい環境でも問題無いと思われる。 |
行 9: | 行 7: |
* DNSコンテンツサーバー: BIND 9.13.2 * 上記以外の環境では、以下の点に相違が発生する。必要に応じて読み替えたし。 |
* DNSコンテンツサーバー: BIND9 9.13.2 * 上記以外の環境では、以下の点に相違が発生する。当該環境に応じて読み替えたし。 |
行 24: | 行 22: |
* 説明のためここでは、稼働に必要な最低限の設定を実施する。 | * 説明のため、稼働に必要な最低限の設定とする。 |
行 35: | 行 33: |
※altlog_proglist が既に設定済みの場合、{{{ named}}}を追加する。 | ※altlog_proglist が既に設定済みの場合、「{{{ named}}}」を追加する。 |
行 38: | 行 36: |
{{{ #!diff |
{{{#!diff |
行 67: | 行 64: |
* 本設定は以下の設定を行うものとする。 | * DNSコンテンツサーバーとして、以下の設定を行うものとする。 |
行 71: | 行 68: |
* ログ出力設定、アクセス制御は本説明では実施しない。 = ゾーンの定義 = |
* ログ出力設定、ビュー設定、アクセス制御、マスター/スレイブ構成、といった機能については説明しない。 * なお原理上、本設定はマスターサーバーで実施するものであり、スレイブサーバーには適用しない/するものではない。 = example.jp ゾーンの定義 = == /usr/local/etc/namedb/TSIGキー名.key == 下記コマンドを実行してTSIGキーを発行する。 {{{ tsig-keygen -a hmac-sha256 TSIGキー名. > /usr/local/etc/namedb/TSIGキー名.key chown bind:wheel /usr/local/etc/namedb/TSIGキー名.key chmod 0400 /usr/local/etc/namedb/TSIGキー名.key }}} == /usr/local/etc/namedb/named.conf == {{{#!diff --- /usr/local/etc/namedb/named.conf.orig 2018-09-13 22:46:26.048986000 +0900 +++ /usr/local/etc/namedb/named.conf 2018-09-26 14:33:08.706240000 +0900 @@ -383,3 +383,11 @@ }; }; */ + +include "/usr/local/etc/namedb/TSIGキー名.key"; + +zone "example.jp" { + type master; + file "/usr/local/etc/namedb/dynamic/example.jp"; + allow-update { !{ !IPv4アドレス; !IPv6アドレス; any; }; key "TSIGキー名."; }; +}; }}} == /usr/local/etc/namedb/dynamic/example.jp == {{{ $TTL 300 @ IN SOA ns.example.jp. domain.example.jp. ( 1 ; serial 7200 ; refresh (2 hours) 900 ; retry (15 minutes) 2419200 ; expire (4 weeks) 86400 ; minimum (1 day) ) IN NS ns ns IN A IPv4アドレス IN AAAA IPv6アドレス }}} * ここでは参考として SOA と NS レコードのみ設定するものとする。 * また本ファイル作成後、オーナーとパーミッションを以下の通り設定すること。 {{{ chown bind:wheel /usr/local/etc/namedb/dynamic/example.jp chmod 0644 /usr/local/etc/namedb/dynamic/example.jp }}} = 動作検証 = == 動作検証環境 == * 以下のソフトウェアの利用を前提に検証を実施した。いずれも現時点で最新のリリースに基づいて検証しているが、ある程度古い環境、より新しい環境でも問題無いと思われる。 * OS: FreeBSD 11.2-R * DNSクライアントツール: BIND9([[https://www.freshports.org/dns/bind-tools|ports/dns/bind-tools]]) ※現時点では 9.12.2P2 * ただし、古いFreeBSD(9.x等)標準の nsupdate コマンドは、TSIGを取り扱えない(コンパイル時無効)ため、やはり ports からインストールする必要がある。 * また既にBIND9サーバー(ports/dns/bind913 など)をインストールしている環境では ports/dns/bind-tools をインストールする必要は無い。 == 動作検証環境構築および確認 == * ダイナミックDNSクライアント側に「/usr/local/etc/namedb/TSIGキー名.key」ファイルをコピーする。 * その際オーナー・パーミッション設定に留意すること。この時、具体的な設置場所については利用するツールに応じて決める。 * クライアントは「allow-update」で指定した「IPv4アドレス」ないし(and/or)は「IPv6アドレス」であることを確認する。 * つまり「allow-update」による指定は、指定IPアドレス以外のダイナミックDNS更新は許可しないことに注意。 * その代わり当該ゾーンの全てのレコードに対してアクセス(追加・変更・削除)可能である。 == 動作検証の実施 == 以下のコマンドを実行することにより検証を行う(インタラクティブモードで検証)。 {{{ # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス # /usr/local/bin/nsupdate -k tsig.key > server ダイナミックDNSサーバーのIPアドレス > update add test.example.jp. 5 TXT "hello, world." > send > quit # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス "hello, world." # }}} * この時正常に動作すれば「send」送信後には何もメッセージは表示されない。 * 許可IPアドレス設定(allow-update)にミスがあれば「update failed: REFUSED」が表示される。 = よくある質問とその答え = == Q.「response to SOA query was unsuccessful」という見慣れないエラーが発生しました。なぜです?設定は完璧なはずです! == {{{ # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス # /usr/local/bin/nsupdate -k tsig.key > server ダイナミックDNSサーバーのIPアドレス > update add test.example.jp. 5 TXT "hello, hello, world!" > send response to SOA query was unsuccessful # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス # }}} A.甘いな。激甘だな。完璧などとおこがましい。 ログファイル<<FootNote(named のデフォルトファシリティは daemon であること、/etc/syslog.conf を変更してない場合、デフォルトのログファイルは /var/log/messages である。)>>を見れば、 named 起動時に下記のようなメッセージを確認できるはず。 {{{ Sep 26 15:12:10 DynamicDNSServer named[21358]: zone example.jp/IN: loading from master file /usr/local/etc/named/dynamic/example.jp failed: file not found Sep 26 15:12:10 DynamicDNSServer named[21358]: zone example.jp/IN: not loaded due to errors. }}} このケースの場合「file not found」つまりファイル名の指定に間違いがある(×etc/named/、○etc/namedb/)。精進すべし。 正しく設定した場合はログファイルには以下の通り出ている。 {{{ Sep 26 15:15:22 DynamicDNSServer named[21470]: zone example.jp/IN: loaded serial 1 }}} == Q.実環境でテストしてしまいました!どうやって削除すればいいですか?ゾーンファイル編集すれば良いですか? == A.ダイナミックDNSで追加したならダイナミックDNSで削除しないと。 (サービス停止して)オフラインであるならゾーンファイル編集でもかまいません。 ゾーンファイルは独特なフィードバックが行われています(機械処理故の限界な)ので、編集の際驚かないでください。 {{{ # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス "hello, world." # /usr/local/bin/nsupdate -k tsig.key > server ダイナミックDNSサーバーのIPアドレス > update delete test.example.jp. TXT > send > quit # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス }}} == Q.allow-update の指定が意味不明です。まずは解説を! == A.BIND9のACL(アクセスコントロールリスト)の癖となります。詳しくは[[https://kb.isc.org/docs/aa-00723|参考文献]]をお読みください。 というのは不親切なので、解説すると、 1. ACLの処理は左から右へ評価されます。これはAND結合であるということを意味しません。 1. よってブール論理で解釈するのではなく、ファーストマッチ・ファーストアウトで解釈する必要があります。 1. 接続元IPアドレスに対して、以下の3つが判断されます。 * match and accept(一致かつ受諾) * match and reject(一致かつ拒絶) * no match(一致しない、なので次のリストに委ねる) 1. この時、ネスト({・・・})されていた場合、その内容について下記の2つの評価を行い、その結果に対して上記3つの判断が実施されます。 * match(一致) * no match(不一致) 1. 当然ネストの中に更にネストできるので、それは上記2評価の繰り返しとなる。 上記ルールを踏まえ、問題のルールを解析すると・・・。 1. 大枠は2つリストに分かれる。 1. !{ !IPv4アドレス; !IPv6アドレス; any; } 1. key "TSIGキー名." 1. 最初のネストを分解すると、3つのリストに分かれる。 1. !IPv4アドレス 1. !IPv6アドレス 1. any 1. 最初のネスト内では以下の評価を行う(「!」の評価に注意)。 1. 「IPv4アドレス『ではない』」の評価をする。「IPv4アドレス」であれば「no match」として評価完了。そうでないなら「match」として次の評価。 2. 「IPv6アドレス『ではない』」の評価をする。「IPv6アドレス」であれば「no match」として評価完了。そうでないなら「match」として次の評価。 3. 「任意のアドレス」に・・・とここまで来ると match で解釈され、評価が終了する。また既に「match」評価されてるので、この場合の「any」の指定のあり/無しに意味はない(人間の直感には反するから入れておいた方がいい)。 4. このネストでの結果を全体「!」=match and reject で評価することから、「no match」(つまり次のリストの評価)の時は、次のリスト key が評価される。 == Q.1IP=1TSIGキー設定したい場合はどうすればいいのでしょうか? == A.君のような勘のいいガ(ry。 裸の key "TSIGキー名." では一致しなかったときに拒絶されることから、ネストで保護してやれば行けます(下記例参照)。 {{{ allow-update { { !{ !IPv4アドレス; any; }; key "TSIGキー名1."; }; { !{ !IPv6アドレス; any; }; key "TSIGキー名2."; }; }; }}} == Q.ゾーンに対して広範に任意のレコードの変更ができてしまうようですが、特定のレコードだけに制限する方法はありますか? == A.ない。正確には allow-update では解決しえない。トレードオフ有の2つのソリューションがある。 = 更新したいレコードの制限 = * update-policy 設定により更新したいレコードの制限は行える。 * TSIGキーの指定による制限は可能であるが、この設定はIPアドレス制限ができない(allow-update 設定が無視される)。 * よって、2つの選択肢がある。 * update-policy 設定を受け入れて、任意のIPアドレスからの更新を許す(もちろんTSIGキーの設定はあるにせよ)。 * 変更したいレコードをゾーンに切り分けして allow-update で制限する。そのゾーン内での自由自在を許す。 == update-policy による更新レコードの制限 == == ゾーン切り分けによる更新レコードの制限 == |
行 77: | 行 259: |
* [[https://kb.isc.org/docs/aa-00723|Using Access Control Lists (ACLs) with both addresses and keys]] * [[https://ftp.isc.org/isc/bind9/cur/9.13/doc/arm/Bv9ARM.html|BIND9(9.13) Administrator Reference Manual]] * [[https://ftp.isc.org/isc/bind9/cur/9.12/doc/arm/man.nsupdate.html|nsupdate(1)]] = 注釈 = |
BIND9によるダイナミックDNSサーバーの運用
検証環境
- 以下のソフトウェアの利用を前提に検証を実施した。いずれも現時点で最新のリリースに基づいて検証しているが、ある程度古い環境、より新しい環境でも問題無いと思われる。
- OS: FreeBSD 11.2-R
- DNSコンテンツサーバー: BIND9 9.13.2
- 上記以外の環境では、以下の点に相違が発生する。当該環境に応じて読み替えたし。
- インストール方法
- インストールされるディレクトリ
- 逆に以下の点は参考にできる。
- 設定パラメータとその意味
- 運用事例
検証作業内容
- DNSコンテンツサーバーでは「example.jp」ゾーンを運用する。
- 本サーバーでは外部(自身を含む)からのダイナミックアップデート要求に対し、「exmaple.jp」ゾーンに対してレコードの追加・変更・削除を実施する。
DNSコンテンツサーバーの基本設定
DNSサーバーは ports/dns/bind913 をインストールする。
- ここでは特にカスタムする要素は無いので、デフォルトのままとする。
- 説明のため、稼働に必要な最低限の設定とする。
/etc/rc.conf
以下の設定を追加する。
named_enable="YES" named_chrootdir="/var/named" altlog_proglist="named"
※altlog_proglist が既に設定済みの場合、「 named」を追加する。
/usr/local/etc/namedb/named.conf
1 --- /usr/local/etc/namedb/named.conf.sample 2018-09-13 22:12:15.847935000 +0900
2 +++ /usr/local/etc/namedb/named.conf 2018-09-13 22:46:26.048986000 +0900
3 @@ -16,15 +16,20 @@
4 dump-file "/var/dump/named_dump.db";
5 statistics-file "/var/stats/named.stats";
6
7 + recursion no;
8 + allow-query { any; };
9 + allow-recursion { none; };
10 + allow-query-cache { none; };
11 +
12 // If named is being used only as a local resolver, this is a safe default.
13 // For named to be accessible to the network, comment this option, specify
14 // the proper IP address, or delete this option.
15 - listen-on { 127.0.0.1; };
16 + listen-on { any; };
17
18 // If you have IPv6 enabled on this system, uncomment this option for
19 // use as a local resolver. To give access to the network, specify
20 // an IPv6 address, or the keyword "any".
21 -// listen-on-v6 { ::1; };
22 + listen-on-v6 { any; };
23
24 // These zones are already covered by the empty zones listed below.
25 // If you remove the related empty zones below, comment these lines out.
- DNSコンテンツサーバーとして、以下の設定を行うものとする。
- IPv4/IPv6問わず、全てのクエリを受け付ける。
- 再帰問い合わせには答えないものとする。
- よって本設定が行われているゾーン情報のみクエリに対して答える(ルートゾーンを含む)。
- ログ出力設定、ビュー設定、アクセス制御、マスター/スレイブ構成、といった機能については説明しない。
- なお原理上、本設定はマスターサーバーで実施するものであり、スレイブサーバーには適用しない/するものではない。
example.jp ゾーンの定義
/usr/local/etc/namedb/TSIGキー名.key
下記コマンドを実行してTSIGキーを発行する。
tsig-keygen -a hmac-sha256 TSIGキー名. > /usr/local/etc/namedb/TSIGキー名.key chown bind:wheel /usr/local/etc/namedb/TSIGキー名.key chmod 0400 /usr/local/etc/namedb/TSIGキー名.key
/usr/local/etc/namedb/named.conf
1 --- /usr/local/etc/namedb/named.conf.orig 2018-09-13 22:46:26.048986000 +0900
2 +++ /usr/local/etc/namedb/named.conf 2018-09-26 14:33:08.706240000 +0900
3 @@ -383,3 +383,11 @@
4 };
5 };
6 */
7 +
8 +include "/usr/local/etc/namedb/TSIGキー名.key";
9 +
10 +zone "example.jp" {
11 + type master;
12 + file "/usr/local/etc/namedb/dynamic/example.jp";
13 + allow-update { !{ !IPv4アドレス; !IPv6アドレス; any; }; key "TSIGキー名."; };
14 +};
15
/usr/local/etc/namedb/dynamic/example.jp
$TTL 300 @ IN SOA ns.example.jp. domain.example.jp. ( 1 ; serial 7200 ; refresh (2 hours) 900 ; retry (15 minutes) 2419200 ; expire (4 weeks) 86400 ; minimum (1 day) ) IN NS ns ns IN A IPv4アドレス IN AAAA IPv6アドレス
- ここでは参考として SOA と NS レコードのみ設定するものとする。
- また本ファイル作成後、オーナーとパーミッションを以下の通り設定すること。
chown bind:wheel /usr/local/etc/namedb/dynamic/example.jp chmod 0644 /usr/local/etc/namedb/dynamic/example.jp
動作検証
動作検証環境
- 以下のソフトウェアの利用を前提に検証を実施した。いずれも現時点で最新のリリースに基づいて検証しているが、ある程度古い環境、より新しい環境でも問題無いと思われる。
- OS: FreeBSD 11.2-R
DNSクライアントツール: BIND9(ports/dns/bind-tools) ※現時点では 9.12.2P2
- ただし、古いFreeBSD(9.x等)標準の nsupdate コマンドは、TSIGを取り扱えない(コンパイル時無効)ため、やはり ports からインストールする必要がある。
- また既にBIND9サーバー(ports/dns/bind913 など)をインストールしている環境では ports/dns/bind-tools をインストールする必要は無い。
動作検証環境構築および確認
- ダイナミックDNSクライアント側に「/usr/local/etc/namedb/TSIGキー名.key」ファイルをコピーする。
- その際オーナー・パーミッション設定に留意すること。この時、具体的な設置場所については利用するツールに応じて決める。
- クライアントは「allow-update」で指定した「IPv4アドレス」ないし(and/or)は「IPv6アドレス」であることを確認する。
- つまり「allow-update」による指定は、指定IPアドレス以外のダイナミックDNS更新は許可しないことに注意。
- その代わり当該ゾーンの全てのレコードに対してアクセス(追加・変更・削除)可能である。
動作検証の実施
以下のコマンドを実行することにより検証を行う(インタラクティブモードで検証)。
# dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス # /usr/local/bin/nsupdate -k tsig.key > server ダイナミックDNSサーバーのIPアドレス > update add test.example.jp. 5 TXT "hello, world." > send > quit # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス "hello, world." #
- この時正常に動作すれば「send」送信後には何もメッセージは表示されない。
- 許可IPアドレス設定(allow-update)にミスがあれば「update failed: REFUSED」が表示される。
よくある質問とその答え
Q.「response to SOA query was unsuccessful」という見慣れないエラーが発生しました。なぜです?設定は完璧なはずです!
# dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス # /usr/local/bin/nsupdate -k tsig.key > server ダイナミックDNSサーバーのIPアドレス > update add test.example.jp. 5 TXT "hello, hello, world!" > send response to SOA query was unsuccessful # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス #
A.甘いな。激甘だな。完璧などとおこがましい。 ログファイル1を見れば、 named 起動時に下記のようなメッセージを確認できるはず。
Sep 26 15:12:10 DynamicDNSServer named[21358]: zone example.jp/IN: loading from master file /usr/local/etc/named/dynamic/example.jp failed: file not found Sep 26 15:12:10 DynamicDNSServer named[21358]: zone example.jp/IN: not loaded due to errors.
このケースの場合「file not found」つまりファイル名の指定に間違いがある(×etc/named/、○etc/namedb/)。精進すべし。
正しく設定した場合はログファイルには以下の通り出ている。
Sep 26 15:15:22 DynamicDNSServer named[21470]: zone example.jp/IN: loaded serial 1
Q.実環境でテストしてしまいました!どうやって削除すればいいですか?ゾーンファイル編集すれば良いですか?
A.ダイナミックDNSで追加したならダイナミックDNSで削除しないと。 (サービス停止して)オフラインであるならゾーンファイル編集でもかまいません。 ゾーンファイルは独特なフィードバックが行われています(機械処理故の限界な)ので、編集の際驚かないでください。
# dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス "hello, world." # /usr/local/bin/nsupdate -k tsig.key > server ダイナミックDNSサーバーのIPアドレス > update delete test.example.jp. TXT > send > quit # dig +short txt test.example.jp @ダイナミックDNSサーバーのIPアドレス
Q.allow-update の指定が意味不明です。まずは解説を!
A.BIND9のACL(アクセスコントロールリスト)の癖となります。詳しくは参考文献をお読みください。 というのは不親切なので、解説すると、
- ACLの処理は左から右へ評価されます。これはAND結合であるということを意味しません。
- よってブール論理で解釈するのではなく、ファーストマッチ・ファーストアウトで解釈する必要があります。
- 接続元IPアドレスに対して、以下の3つが判断されます。
- match and accept(一致かつ受諾)
- match and reject(一致かつ拒絶)
- no match(一致しない、なので次のリストに委ねる)
- この時、ネスト({・・・})されていた場合、その内容について下記の2つの評価を行い、その結果に対して上記3つの判断が実施されます。
- match(一致)
- no match(不一致)
- 当然ネストの中に更にネストできるので、それは上記2評価の繰り返しとなる。
上記ルールを踏まえ、問題のルールを解析すると・・・。
- 大枠は2つリストに分かれる。
- !{ !IPv4アドレス; !IPv6アドレス; any; }
- key "TSIGキー名."
- 最初のネストを分解すると、3つのリストに分かれる。
- !IPv4アドレス
- !IPv6アドレス
- any
- 最初のネスト内では以下の評価を行う(「!」の評価に注意)。
- 「IPv4アドレス『ではない』」の評価をする。「IPv4アドレス」であれば「no match」として評価完了。そうでないなら「match」として次の評価。
- 「IPv6アドレス『ではない』」の評価をする。「IPv6アドレス」であれば「no match」として評価完了。そうでないなら「match」として次の評価。
- 「任意のアドレス」に・・・とここまで来ると match で解釈され、評価が終了する。また既に「match」評価されてるので、この場合の「any」の指定のあり/無しに意味はない(人間の直感には反するから入れておいた方がいい)。
- このネストでの結果を全体「!」=match and reject で評価することから、「no match」(つまり次のリストの評価)の時は、次のリスト key が評価される。
Q.1IP=1TSIGキー設定したい場合はどうすればいいのでしょうか?
A.君のような勘のいいガ(ry。
裸の key "TSIGキー名." では一致しなかったときに拒絶されることから、ネストで保護してやれば行けます(下記例参照)。
allow-update { { !{ !IPv4アドレス; any; }; key "TSIGキー名1."; }; { !{ !IPv6アドレス; any; }; key "TSIGキー名2."; }; };
Q.ゾーンに対して広範に任意のレコードの変更ができてしまうようですが、特定のレコードだけに制限する方法はありますか?
A.ない。正確には allow-update では解決しえない。トレードオフ有の2つのソリューションがある。
更新したいレコードの制限
- update-policy 設定により更新したいレコードの制限は行える。
- TSIGキーの指定による制限は可能であるが、この設定はIPアドレス制限ができない(allow-update 設定が無視される)。
- よって、2つの選択肢がある。
- update-policy 設定を受け入れて、任意のIPアドレスからの更新を許す(もちろんTSIGキーの設定はあるにせよ)。
- 変更したいレコードをゾーンに切り分けして allow-update で制限する。そのゾーン内での自由自在を許す。
update-policy による更新レコードの制限
ゾーン切り分けによる更新レコードの制限
参考文献
注釈
named のデフォルトファシリティは daemon であること、/etc/syslog.conf を変更してない場合、デフォルトのログファイルは /var/log/messages である。 (1)