シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

BINDの大切な設定の話

こんにちは、技術部ネットワーク課の若松です。

今回はネームサーバの話

この技術者ブログをご覧になられているみなさんは、それぞれの会社でIT担当としてサーバの運用を任されている方も多いのではないでしょうか。

サーバには、WWWサーバ、メールサーバ、DNSサーバなどがありますが、結構小難しいのがDNSサーバではないかと思います。

今回は、ネームサーバの中でも最もメジャーなBINDの大切な基本設定について解説したいと思います。

BINDとは

BINDとは「Berkeley Internet Name Domain」の略で、インターネット上の多くのDNSサーバで、使用されています。
BINDは現在ISC(Internet Systems Consortium)という組織が開発、メンテナンスしています。
BINDにもさまざまなバージョンがありますが、現在メンテナンスされているのはBIND9系で2020/06/18現在9.16.4が最新版です(その他、9.11系、914系もメンテナンスされています)。
なお、以前はBIND8系や、さらに古くはBIND4系などもありました(むかーしむかし、シナプスでもBIND4系を使っていたことがありました(遠い目))。

named.confとは

named.confはBINDの基本となる設定ファイルです。DNSサーバの基本的な動作やDNSサーバ自身が管理するゾーン(ドメイン名)などの情報を記述します。

named.confの重要な設定

今回ご説明するのは、以下の5つとなります。

acl
recursion
allow-query
allow-query-cache
allow-recursion

では1つずつご説明していきましょう。

acl

aclはDNSサーバの挙動を設定する際のネットワーク情報を定義します。
例えば、自宅や企業内のネットワーク情報を定義し、そこからのアクセスのみ許可するといったことができます。

下記の場合は,192.168.1.0/24とDNSサーバ自身(localhost)をmy-homeという名前で定義したことになります。

acl my-home {
   192.168.1.0/24; 
   localhost;
};

もし企業内で使用しているネットワークが、支店、支社など多数ある場合も、上記の要領で追加していけば、my-homeという名前でひとくくりに出来ます(もちろん、本社、支店/支社ごとに分けて定義しても構いません)。
また、aclにはlocalhost とは別に localnets という記述も出来ます。
localhostはDNSサーバに割り当てられたIPアドレス、localnetsはDNSサーバが接続されたネットワークという意味です。
localnetsのほうはlocalnetではなくてlocalnetsです。末尾にsを付けるのを忘れないようにしましょう。

recursion

recursionはクライアントからの問合せに応じて他のネームサーバに問合せ、その回答を再度クライアントに回答する、いわゆる「リゾルバー」としての動作をさせる場合に使います。

options {
  ...
  recursion yes;
  ...
}; 

yesと書けばリゾルバーとして動作しますし、noと書けば動作しません。

allow-query

allow-query はDNSサーバへの問合せそのものの許可または拒否します。先ほど説明したacl設定により特定のネットワークからの問合せのみ許可するといった動作も可能です。

allow-query-cache

キャッシュDNSサーバとして運用しているDNSサーバは、他のネームサーバに問い合わせた結果を一定期間保持(キャッシュ)しています。

以降、この保持していた情報と同じ問合せがあった場合は、キャッシュの内容を回答することで、他のネームサーバへの問合せ回数を減らしDNSサーバとネットワークの負荷低減が期待できます。

allow-query-cache はこの機能をどう使うか定義します。なお、allow-query-cacheはBIND 9.4.0 で実装されたのでそれより古いBIND9系やBIND8系ではこのオプション自体が存在しません。

また、ネームサーバの基本動作として問い合わせを受けた時点で、キャッシュにその回答があるかをチェックするわけですが、仮にallow-query-cache で拒否された場合、次に説明する allow-recursion の処理まで到達しません。よって、基本的には allow-query-cache と allow-recursion は同じものを設定するのが混乱が少ないでしょう。

allow-recursion

先に説明した recursion 設定でリゾルバーとしての動作をさせる場合に、 その細かい動作設定にallow-recursion を使います。
recursion 設定と併用して適切な設定にしていきましょう。

それでは具体的な設定を見て行きましょう。

権威サーバの場合

自分の管理するゾーン(ドメイン情報等)を持ち、インターネット上に公開するサーバ、つまり権威サーバの場合はnamed.confに以下のように記述します。

options {
  ...
  recursion no;
  allow-query { any; };
  allow-recursion { none; };
  allow-query-cache { none; };
  ...
}; 

まず最初にrecursion no; とし、リゾルバーとしての動作を許可しません。
次に、allow-query { any; }; とし、インターネット上のどこからの問合せにも応答します。
allow-recursion と allow-query-cache は none とすることで、リゾルバーとしての動作もキャッシュへのアクセスも不許可とします。

キャッシュDNSサーバ(リゾルバー)の場合

自前でゾーンを持たず外部への問合せの役割のみ持たせる場合の設定です。

acl my-home {
   192.168.1.0/24; 
   localhost;
};

options {
  ...
  recursion yes;
  allow-query { my-home; };
  allow-recursion { my-home; };
  allow-query-cache { my-home; };
  ...
}; 

ここでは冒頭紹介した acl で my-home を定義しておきます。
次に、recursion yesとし、リゾルバーとしての動作を許可したあと、allow-query とallow-recursionとallow-query-cacheはmy-homeからのアクセスのみ許可します。

これで、my-home からのみ自由に使えるDNSサーバとなります。

権威サーバとキャッシュDNSサーバと兼用する場合

自前でゾーンを持ちつつ、外部への問合せの役割も担う場合の設定です。

acl my-home {
   192.168.1.0/24; 
   localhost;
};

options {
  ...
  recursion yes;
  allow-query { any; };
  allow-recursion { my-home; };
  allow-query-cache { my-home; };
  ...
}; 

キャッシュDNSサーバの場合と異なるのは、allow-query { any; }; となっている点です。
自分が持っているゾーンについてはインターネット上のどこからの問合せも応答するので、any で許可します。
それ以外のallow-recursion と allow-query-cache については my-home のみ許可とします。

基本的な設定はここまでです。
みなさん快適で安全なネームサーバを心がけましょう!で終われればいいのですが、もっと大切なお話があります。

それはBINDの設定ミスでオープンリゾルバになってしまう可能性があるということです。
オープンリゾルバとはインターネット上のどのIPアドレスからも問い合わせを受け付け、応答してくれるDNSサーバのことです。

オープンリゾルバとは

先に説明しました通り、オープンリゾルバとはなかなか便利なDNSサーバと感じられるかたもいらっしゃると思いますが、DNSのやりとりにUDPというプロトコルが使われる関係で、送信元のIPアドレス詐称が可能なうえに、他のサーバにDDoS攻撃を仕掛ける際の踏み台になってしまう可能性があります。これらの攻撃は「DNSリフレクション攻撃」や「DNS Amplification Attacks」と呼ばれれています。オープンリゾルバを放置すると被害者となる一方加害者にもなってしまう可能性があります。

余談になりますが、BINDに限らず、一部のブロードバンドルータはオープンリゾルバとして動作するものもあり、これらもファームウェアのバージョンアップや設定変更等の対策が必要です。

BINDに話を戻しますが、さきほど説明したBINDの設定です。
allow-query 、allow-recursion 、allow-query-cache の設定次第では、意図せずオープンリゾルバになってしまう可能性があります。
なぜなら、それぞれデフォルトの設定が決まっていつつも、他のallow-*** 設定にも引きずられてしまうからです。

以下については BIND9.4.1-P1以降の動作です。BIND9.4.0とも動作が異なります。
また、今後も動作仕様は変更の可能性があることについて留意してください。

allow-query

allow-queryはBIND起動時に以下のような動作設定をします。

  • allow-queryが定義されていれば、その設定に従い動作する。
  • allow-queryが定義されていない場合、allow-query {any;}; で動作する。

フローチャートにすると以下のような感じになります。

allow-queryの動作
allow-queryの動作

allow-query-cache

allow-query-cacheはBIND起動時に以下のような動作設定をします。

  • allow-query-cache が定義されていれば、その設定に従う
  • allow-recursion が定義されていれば、その設定に従う
  • allow-queryが定義されていれば、その設定に従う
  • いずれにも該当しない場合は allow-query-cache { localhost; localnets;};となる。

フローチャートにすると以下のような感じになります。

allow-query-cacheの動作
allow-query-cacheの動作

allow-recursion

allow-recursionはBIND起動時に以下のような動作設定をします。

  • allow-recursion が定義されていれば、その設定に従う
  • allow-query-cache が定義されていれば、その設定に従う
  • allow-queryが定義されていれば、その設定に従う
  • いずれにも該当しない場合は allow-recursion { localhost; localnets;};となる。

フローチャートにすると以下のような感じになります。

allow-recursionの動作
allow-recursionの動作

つまり、named.confにallow-****の設定を一切しなかった場合、

allow-query { any; };
allow-query-cache { localhost; localnets;};
allow-recursion { localhost; localnets;};

という比較的お堅い設定になるのに対して、allow-query { any; }; のみ設定し、allow-query-cache と allow-recursion を設定しなかった場合

allow-query { any; };
allow-query-cache { any; };
allow-recursion { any; };

となり、ある意味すがすがしいほどの(いやいや)オープンリゾルバとなります。

オープンリゾルバになるのを防ぐには

BINDでオープンリゾルバになるのを防ぐには、以下をお勧めします。

  • BINDを動作させるサーバは必要最低限とする(不用意/安易に動作させない)。
  • allow-query、allow-query-cache、allow-recursion の3つの設定は必ずする(少なくとも allow-query を設定した上で、allow-query-cache、allow-recursion のうち片方は必ず設定する)。
  • 権威サーバとキャッシュDNSサーバ(リゾルバー)は分離する。
  • やむを得ず権威サーバとキャッシュDNSサーバを兼用する場合も、必要最低限の許可に限定する。
  • BINDの脆弱性情報を常に収集し、必要に応じてアップデート/設定変更等の対策を行う。

今回はBINDの大切な設定について説明しました。
DNSサーバの運用はこれ以外にもチューニングやセキュリティ設定など多岐に渡りますが、皆様のお力となれれば幸いです。