Red Hat Training

A Red Hat training course is available for RHEL 8

4.8. DNS レコードを上書きするように BIND で応答ポリシーゾーンを設定する

管理者は、DNS のブロックとフィルタリングを使用して、DNS 応答を書き換えて、特定のドメインまたはホストへのアクセスをブロックできます。BIND では、応答ポリシーゾーン (RPZ) がこの機能を提供します。NXDOMAIN エラーを返す、クエリーに応答しないなど、ブロックされたエントリーに対してさまざまなアクションを設定できます。

環境内に複数の DNS サーバーがある場合は、この手順を使用してプライマリーサーバーで RPZ を設定し、後でゾーン転送を設定して、セカンダリーサーバーで RPZ を使用できるようにします。

前提条件

  • BIND は、たとえばキャッシングネームサーバーとしてすでに設定されています。
  • named または named-chroot サービスが実行しています。

手順

  1. /etc/named.conf ファイルを編集し、次の変更を行います。

    1. options ステートメントに response-policy 定義を追加します。

      options {
          ...
      
          response-policy {
              zone "rpz.local";
          };
      
          ...
      }

      response-policyzone ステートメントで RPZ のカスタム名を設定できます。ただし、次のステップのゾーン定義で同じ名前を使用する必要があります。

    2. 前の手順で設定した RPZ の zone 定義を追加します。

      zone "rpz.local" {
          type master;
          file "rpz.local";
          allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
          allow-transfer { none; };
      };

      これらの設定状態:

      • このサーバーは、rpz.local という名前の RPZ のプライマリーサーバー (type master) です。
      • /var/named/rpz.local ファイルはゾーンファイルです。この例のように相対パスを設定すると、このパスは、options ステートメントの directory に設定したディレクトリーからの相対パスになります。
      • allow-query で定義されたホストは、この RPZ をクエリーできます。または、IP 範囲または BIND アクセス制御リスト (ACL) のニックネームを指定して、アクセスを制限します。
      • どのホストもゾーンを転送できません。ゾーン転送を許可するのは、セカンダリーサーバーをセットアップする際に限られ、セカンダリーサーバーの IP アドレスに対してのみ許可します。
  2. /etc/named.conf ファイルの構文を確認します。

    # named-checkconf

    コマンドが出力を表示しない場合は、構文に間違いがありません。

  3. たとえば、次の内容で /var/named/rpz.local ファイルを作成します。

    $TTL 10m
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1h         ; refresh period
                              1m         ; retry period
                              3d         ; expire time
                              1m )       ; minimum TTL
    
                     IN NS    ns1.example.com.
    
    example.org      IN CNAME .
    *.example.org    IN CNAME .
    example.net      IN CNAME rpz-drop.
    *.example.net    IN CNAME rpz-drop.

    このゾーンファイル:

    • リソースレコードの既定の有効期限 (TTL) 値を 10 分に設定します。時間の h などの時間接尾辞がない場合、BIND は値を秒として解釈します。
    • ゾーンに関する詳細を含む、必要な SOA (Start of Authority) リソースレコードが含まれます。
    • このゾーンの権威 DNS サーバーとして ns1.example.com を設定します。ゾーンを機能させるには、少なくとも 1 つのネームサーバー (NS) レコードが必要です。ただし、RFC 1912 に準拠するには、少なくとも 2 つのネームサーバーが必要です。
    • このドメイン内の example.org およびホストへのクエリーに対して NXDOMAIN エラーを返します。
    • このドメイン内の example.net およびホストにクエリーを破棄します。

    アクションおよび例の完全なリストは、IETF draft: DNS Response Policy Zones (RPZ) を参照してください。

  4. /var/named/rpz.local ファイルの構文を確認します。

    # named-checkzone rpz.local /var/named/rpz.local
    zone rpz.local/IN: loaded serial 2022070601
    OK
  5. BIND をリロードします。

    # systemctl reload named

    change-root 環境で BIND を実行する場合は、systemctl reload named-chroot コマンドを使用してサービスをリロードします。

検証

  1. NXDOMAIN エラーを返すように RPZ で設定されている example.org のホストを解決しようとします。

    # dig @localhost www.example.org
    ...
    ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30286
    ...

    この例では、BIND が同じホストで実行し、localhost インターフェイスでクエリーに応答することを前提としています。

  2. RPZ でクエリーを破棄するように設定されている example.net ドメイン内のホストの解決を試みます。

    # dig @localhost www.example.net
    ...
    ;; connection timed out; no servers could be reached
    ...