インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

BINDによるDNSサーバー構築とセキュリティ運用【202試験 主題2.08】

公開
,
LinuC Level 2 第10回 主題2.08 ネームサーバ(DNS)



LinuCレベル2(202試験)の主題2.08「ドメインネームサーバー(DNS)」は、全試験範囲の中でも屈指の配点比率と出題頻度を誇る最重要分野です。インターネットやイントラネットにおいて名前解決を一手に担うDNSサーバーは、Webやメールなどすべてのネットワークサービスの基盤として機能します。

Linux環境における事実上の標準DNSサーバーソフトウェアが BIND(Berkeley Internet Name Domain) です。本記事では、AlmaLinux 9.8の実機環境に最新のBIND 9(9.16系)を導入し、DNS反復検索の仕組みから named.conf のグローバル設計、正引き・逆引きゾーンファイルの記法規則(SOA/NS/A/PTR/CNAME/MX)、rndc による運用管理、そしてTSIGやDNSSECによるセキュリティ強化策まで、実機検証ログとともに体系的に解説します。

実機検証環境
ホストOS
AlmaLinux 9.8 (Kernel 5.14.0-503.40.1.el9_5.x86_64)
ホスト名 / IP
linuc-node01 / 192.168.2.138
DNSデーモン
BIND 9.16.23 (named)
構文検査ツール
named-checkconf / named-checkzone
DNS診断コマンド
bind-utils (dig, host, nslookup)
本記事の学習スコープと位置づけ
公式試験の必須出題範囲 主題2.08.1(BINDの設定と管理)、主題2.08.2(正引き・逆引きゾーン情報管理)、主題2.08.3(TSIG・DNSSECによるセキュアDNS)
現場で役立つ実務拡張 named-chrootによる権限分離ジェイル環境、ゾーン転送制限によるDNS情報漏洩防止策
目次
  1. 1. DNSの基本アーキテクチャとBINDの役割
    1. 1.1 ドメイン名前空間と反復検索・再帰検索
    2. 1.2 BINDのコンポーネント構成
  2. 2. named.conf の基本設計と主要ディレクティブ
    1. 2.1 optionsディレクティブによるグローバル設定
    2. 2.2 zoneディレクティブとゾーンタイプ
    3. 2.3 アクセス制御リスト(aclディレクティブ)
    4. 2.4 named-checkconf による設定構文検査実機ログ
  3. 3. ゾーンファイルの構造と主要リソースレコード
    1. 3.1 ゾーンファイルの共通記法ルール
    2. 3.2 SOA(Start of Authority)レコードの各タイマー値
    3. 3.3 各種リソースレコードの記法(NS, A, AAAA, CNAME, MX, TXT)
    4. 3.4 逆引きゾーンファイルとPTRレコード(in-addr.arpa / ip6.arpa)
    5. 3.5 named-checkzone によるゾーン検査実機ログ
  4. 4. BINDの運用管理とクライアント検証
    1. 4.1 rndc(Remote Name Daemon Controller)コマンドによる制御
    2. 4.2 dig と host による動作確認
  5. 5. BINDのセキュリティ対策(chroot, TSIG, DNSSEC)
    1. 5.1 named-chroot による特権分離
    2. 5.2 TSIG(Transaction Signature)によるセキュアなゾーン転送
    3. 5.3 DNSSEC(DNS Security Extensions)の基礎概念
  6. 6. LinuC 202試験(主題2.08)重要ポイント総整理
    1. 6.1 記述式(コマ問)頻出コマンド・ディレクティブ一覧
    2. 6.2 SOAレコードのタイマー値とゾーン転送の盲点
  7. 7. まとめと次回予告(第11回:ApacheとTLS/HTTPS)

1. DNSの基本アーキテクチャとBINDの役割

DNSは、全世界に分散配置されたネームサーバーが協調動作する分散型階層データベースです。人間が識別しやすいドメイン名(例: www.example.com)と、コンピュータが通信に用いるIPアドレス(例: 192.0.2.1)を相互に変換(名前解決)します。

DNS反復検索と階層問い合わせフロー

図1: DNS反復検索(Iterative Query)と階層問い合わせフロー

1.1 ドメイン名前空間と反復検索・再帰検索

DNSの問い合わせ方式には、クライアントとサーバー、あるいはサーバー同士の間で異なる2種類のクエリが存在します。

  1. 再帰的問い合わせ(Recursive Query)
    クライアントPC(スタブリゾルバ)が社内の キャッシュDNSサーバー(フルサービスリゾルバ) に対して発行する問い合わせです。「最終的なIPアドレスが判明するまで、代わりに調べて回答してください」と依頼する方式であり、回答としてはIPアドレスまたは存在しない旨(NXDOMAIN)のみを受け取ります。
  2. 反復的問い合わせ(Iterative Query)
    キャッシュDNSサーバーが世界のDNS階層ツリーを上位から順に巡回して発行する問い合わせです。「自身が答えを持っていない場合、次に問い合わせるべき下位サーバーの紹介(Referral)を返してください」と要求します。ルート(.) ➔ TLD(.jp) ➔ SLD(example.jp) ➔ 組織の 権威DNSサーバー(コンテンツサーバー) へと順次問い合わせを繰り返します。
試験対策の要点: 権威サーバーとキャッシュサーバーの分離
外部(インターネット)に公開する権威DNSサーバーにおいて「再帰問い合わせ(recursion)」を許可(recursion yes;)したまま運用すると、第三者からのリクエストを無制限に中継する「オープンリゾルバ」状態となります。これはDNSアンプ攻撃(DDoS攻撃の踏み台)に悪用されるため、公開権威サーバーでは recursion no; に設定することがセキュリティ運用の大原則です。

1.2 BINDのコンポーネント構成

BINDパッケージは、DNSサーバーデーモン本体と、設定検証や運用を行うための補助ツール群で構成されています。

  • named: DNS問い合わせを受け付け、名前解決処理を実行するバックグラウンドデーモン(TCP/UDP 53番ポートで待受)。
  • named-checkconf: 設定ファイル(/etc/named.conf)の構文エラーや未定義ディレクティブを起動前に検査するツール。
  • named-checkzone: 各ゾーンファイル(*.zone)のリソースレコード構文やSOAタイマー設定の妥当性を検査するツール。
  • rndc(Remote Name Daemon Controller): 稼働中の named デーモンを停止させることなく、設定の再読込やキャッシュ消去、ステータス確認をセキュアに遠隔制御するCLIコマンド。

2. named.conf の基本設計と主要ディレクティブ

BINDの中核となる設定ファイルは /etc/named.conf です。ステートメントの末尾にはセミコロン(;)が必須であり、ブロックは波括弧({ })で囲む構文規則を持ちます。

2.1 optionsディレクティブによるグローバル設定

サーバー全体の動作挙動を定義する最重要ブロックが options { ... }; です。LinuC 202試験で頻出のディレクティブを整理します。

ディレクティブ名 機能説明 典型的な設定例
listen-on port 53 IPv4クエリを待ち受けるネットワークインターフェース(IP) listen-on port 53 { 127.0.0.1; 192.168.2.138; };
directory ゾーンファイル等の作業ベースディレクトリパス directory "/var/named";
allow-query このDNSサーバーへの問い合わせを許可するクライアント範囲 allow-query { localhost; 192.168.2.0/24; };
recursion 再帰的な名前解決(キャッシュリゾルバ機能)を許可するか否か recursion yes; または recursion no;
allow-recursion 再帰問い合わせを許可する特定IPアドレス範囲を指定 allow-recursion { 192.168.2.0/24; };
forwarders 自身で解決できないクエリを転送する上位DNSサーバーのIP forwarders { 8.8.8.8; 8.8.4.4; };
forward クエリ転送方式(only: 転送先のみに依存、first: 転送先失敗時に自身で反復解決) forward first;
allow-transfer ゾーン転送(ゾーン情報の複製)を許可するセカンダリDNSのIP allow-transfer { 192.168.2.139; };

2.2 zoneディレクティブとゾーンタイプ

サーバーが管理する個別のドメイン(正引き・逆引き)は zone "ドメイン名" IN { ... }; ブロックで定義します。type ディレクティブによりゾーンの役割を宣言します。

  1. type master(プライマリDNS)
    そのゾーンの正本(マスターデータ)を保持する権威サーバーです。file ディレクティブで指定したローカルのゾーン定義ファイルを読み込みます。
  2. type slave(セカンダリDNS)
    マスターサーバーからゾーン転送(AXFR/IXFR)を受信して副本を保持する権威サーバーです。masters { <Master_IP>; }; で同期元のプライマリIPを指定します。
  3. type hint(ルートヒント)
    インターネットの最上位であるルートDNSサーバー群(13系統)のIPアドレス一覧(named.ca)を参照するための特殊なゾーン定義です(zone "." IN に適用)。
  4. type forward(転送ゾーン)
    特定のドメインに対するすべての問い合わせを、指定した別サーバーへ無条件にフォワードします。
named.conf におけるゾーン定義例
// 正引きマスターゾーンの定義
zone "example.com" IN {
    type master;
    file "example.com.zone";
    allow-query { any; };
    allow-transfer { 192.168.2.139; };
};

// 逆引きマスターゾーンの定義(192.168.2.0/24)
zone "2.168.192.in-addr.arpa" IN {
    type master;
    file "2.168.192.in-addr.arpa.zone";
    allow-query { any; };
    allow-transfer { 192.168.2.139; };
};

2.3 アクセス制御リスト(aclディレクティブ)

複数のIPアドレスやネットワーク範囲に別名を付けてグループ化するのが acl(Access Control List)ディレクティブです。optionszone の外側の最上位スコープに記述します。

acl ディレクティブの定義構文
acl "internal-network" {
    127.0.0.1;
    192.168.2.0/24;
};

options {
    allow-query { internal-network; };
    allow-recursion { internal-network; };
};

2.4 named-checkconf による設定構文検査実機ログ

設定ファイルの編集後、デーモンを再起動する前に構文誤り(セミコロンの欠落や閉じ括弧の不整合)がないかを検証します。エラーが存在しない場合、コマンドは出力を返さず終了ステータス0で完了します。

named-checkconf 実行検証ログ
[user01@linuc-node01 ~]$ sudo named-checkconf /etc/named.conf && echo "named.conf syntax OK"
named.conf syntax OK

3. ゾーンファイルの構造と主要リソースレコード

BINDが名前解決を行うための個別のホスト名とIPアドレスのマッピング情報は、/var/named/ 配下に配置する「ゾーンファイル」に記述します。

DNSゾーンファイルとSOAレコードのタイマー構造

図2: DNSゾーンファイルとSOAレコードのタイマー構造

3.1 ゾーンファイルの共通記法ルール

ゾーンファイル内には、以下の共通ディレクティブと特殊記号が用いられます。

  • $TTL <秒数または期間>: ゾーン内の全リソースレコードに対するデフォルトの生存時間(Time To Live)を秒数または単位(例: 86400, 1d)で指定します。キャッシュDNSサーバーがレコードをキャッシュ保持する時間を決定します。
  • $ORIGIN <ドメイン名>.: 後続のレコードでドメイン名が省略された場合に自動補完されるベースドメインを指定します。
  • @: 現在のオリジン(ゾーン名そのもの)を表す特殊記号です。
  • 末尾のドット(FQDN表現): ドメイン名やホスト名の末尾にドット(.)を付けた場合は完全修飾ドメイン名(FQDN)として解釈されます。ドットを省略した場合は、自動的にカレントオリジン(.example.com.)が付加されるため、記述漏れに細心の注意が必要です。
  • セミコロン(;): 以降の文字列はコメントとして無視されます。

3.2 SOA(Start of Authority)レコードの各タイマー値

ゾーンファイルの先頭には、必ずそのゾーンの管理権限と同期パラメータを宣言する SOA(Start of Authority)レコード を配置します。5つの数値パラメータの意味と役割はLinuC 202試験の最頻出ポイントです。

フィールド名 代表的な設定値 パラメータの役割と同期挙動
Serial(シリアル番号) 2026090701 ゾーンデータの更新バージョンを表す数値。慣例として「YYYYMMDDNN(日付+連番)」を用います。セカンダリDNSは自身より大きなシリアル番号を検知した際にゾーン転送を開始します。更新時に数値を増やし忘れるとセカンダリへ変更が反映されません。
Refresh(更新間隔) 3600(1時間) セカンダリDNSがプライマリDNSに対してSOAレコードのシリアル番号を確認しに行くポーリング間隔です。
Retry(再試行間隔) 1800(30分) Refreshによるポーリングやゾーン転送が通信障害等で失敗した場合に、再接続を試みる待機時間です。
Expire(有効期限) 604800(1週間) プライマリDNSとの通信途絶が継続した場合に、セカンダリDNSがそのゾーンの権威応答を停止(データを無効化)するまでの猶予期間です。
Minimum(最小TTL / ネガティブキャッシュ) 86400(1日) DNS問い合わせに対して「レコードが存在しない(NXDOMAIN)」と回答された結果を、キャッシュDNS側で保持する生存時間(ネガティブキャッシュTTL)です。

3.3 各種リソースレコードの記法(NS, A, AAAA, CNAME, MX, TXT)

SOAレコードに続いて、各種リソースレコードを定義します。

  1. NSレコード(権威ネームサーバー)
    そのゾーンの権威DNSサーバーのFQDNを宣言します(例: @ IN NS ns1.example.com.)。
  2. A / AAAA レコード(アドレス解決)
    ホスト名に対応するIPv4アドレス(Aレコード)またはIPv6アドレス(AAAAレコード)を定義します(例: ns1 IN A 192.168.2.138)。
  3. CNAMEレコード(正準名・別名定義)
    既存のホスト(Aレコード)に対するエイリアス(別名)を定義します(例: www IN CNAME ns1.example.com.)。CNAMEで指定した名前に対して他のレコード(MXやTXT等)を同一ホスト名で共存させることはRFC規格上禁止されています。
  4. MXレコード(メール交換機)
    ドメイン宛ての電子メールを受信するメールサーバーのFQDNと優先度(プリファレンス値)を指定します。数値が小さいほど優先されます(例: @ IN MX 10 mail.example.com.)。
  5. TXTレコード(テキスト属性)
    任意の文字列を登録します。現代では主に送信ドメイン認証(SPFレコードやDKIM公開鍵、DMARCポリシー)の宣言に不可欠です。

3.4 逆引きゾーンファイルとPTRレコード(in-addr.arpa / ip6.arpa)

IPアドレスからホスト名を逆引き解決するためのゾーンファイルでは、特殊な in-addr.arpa(IPv4)および ip6.arpa(IPv6)ドメインを用います。

IPv4ネットワーク 192.168.2.0/24 の逆引きを行う場合、ネットワークアドレスの各オクテットを「逆順」に並べて 2.168.192.in-addr.arpa というゾーン名を作成します。ホストの解決には PTR(Pointer)レコード を指定します。

逆引きゾーンファイル定義例(2.168.192.in-addr.arpa.zone)
$TTL 86400
@   IN  SOA ns1.example.com. hostmaster.example.com. (
            2026090701 ; Serial
            3600       ; Refresh
            1800       ; Retry
            604800     ; Expire
            86400 )    ; Minimum

@       IN  NS      ns1.example.com.

138     IN  PTR     ns1.example.com.
139     IN  PTR     ns2.example.com.
140     IN  PTR     mail.example.com.

3.5 named-checkzone によるゾーン検査実機ログ

ゾーンファイルの作成後、named-checkzone <ゾーン名> <ゾーンファイルパス> を実行して整合性を確認します。

named-checkzone 実行ログ
[user01@linuc-node01 ~]$ named-checkzone example.com /tmp/example.com.zone
zone example.com/IN: loaded serial 2026090701
OK

4. BINDの運用管理とクライアント検証

DNSサーバーの稼働状態の確認、キャッシュデータの消去、ゾーン情報の再読込は、BIND付属の遠隔制御ユーティリティ rndc を用いて行います。

4.1 rndc(Remote Name Daemon Controller)コマンドによる制御

rndc はTCP 953番ポートを介して named デーモンと暗号化通信(共有鍵認証)を行い、以下の運用管理コマンドを提供します。

コマンド 機能説明
rndc status BINDデーモンの稼働バージョン、動作状態、読み込みゾーン数、ソケット数を表示
rndc reload named.conf および更新されたゾーンファイルを再読み込み
rndc reload <zone> 指定した特定のゾーンファイルのみを個別に再読み込み
rndc reconfig 既存ゾーンの再読み込みをスキップし、新規追加されたゾーンのみを高速ロード
rndc flush サーバーが蓄積している全DNSキャッシュデータを即座に破棄・クリア
rndc flushname <fqdn> 指定した特定ドメイン名に関するキャッシュレコードのみを破棄
rndc dumpdb -cache 現在のキャッシュ内容を /var/named/data/cache_dump.db にダンプ出力

4.2 dig と host による動作確認

クライアント側からDNS名前解決の応答を検証する標準ツールが dig(Domain Information Groper) です。

dig コマンドによる正引き・逆引き検証構文
# 特定DNSサーバー(@192.168.2.138)に対して正引きAレコードを問い合わせ
dig @192.168.2.138 www.example.com A

# 短縮表示(IPアドレスのみ取得)
dig @192.168.2.138 www.example.com +short

# ルートからの階層反復検索フローを追跡表示
dig @192.168.2.138 www.example.com +trace

# IPアドレスからの逆引き問い合わせ(-x オプション)
dig @192.168.2.138 -x 192.168.2.138 +short

5. BINDのセキュリティ対策(chroot, TSIG, DNSSEC)

DNSサーバーはインターネットの最前線に位置するため、脆弱性を狙った標的型攻撃やキャッシュポイズニング攻撃に常に晒されます。LinuC 202試験では、BINDをセキュアに運用するための3大セキュリティ機構が出題されます。

5.1 named-chroot による特権分離

BINDデーモンに未知のセキュリティホールが存在した場合でも、ホストOS全体のファイルシステムが侵害されるのを防ぐ手法が chroot(Change Root)環境 の適用です。

AlmaLinuxやRHEL系では、専用パッケージ bind-chroot を導入し、named-chroot.service を起動することで、named プロセスにとってのルートディレクトリ(/)が /var/named/chroot/ に閉じ込められます。設定ファイルは /var/named/chroot/etc/named.conf、ゾーンファイルは /var/named/chroot/var/named/ 配下に透過的にバインドマウントされます。

5.2 TSIG(Transaction Signature)によるセキュアなゾーン転送

プライマリDNSとセカンダリDNSの間でゾーン情報を複製する「ゾーン転送(AXFR/IXFR)」において、IPアドレス偽装による不正なゾーン情報詐取や改ざんを防ぐための認証機構が TSIG(Transaction Signature) です。

TSIGでは、プライマリとセカンダリの双方で事前に共有した秘密鍵(HMAC-SHA256等)を用いてDNSメッセージごとに電子署名を付与・検証します。設定は key ステートメントおよび server ステートメントで行います。

TSIG共有鍵の設定例(named.conf)
key "transfer-key" {
    algorithm hmac-sha256;
    secret "c2VjcmV0LWtleS1kYXRhLTEyMzQ1Njc4OTA=";
};

server 192.168.2.139 {
    keys { "transfer-key"; };
};

zone "example.com" IN {
    type master;
    file "example.com.zone";
    allow-transfer { key "transfer-key"; };
};

5.3 DNSSEC(DNS Security Extensions)の基礎概念

DNS応答の偽装(DNSキャッシュポイズニング攻撃)を根本的に防ぐ技術が DNSSEC です。権威DNSサーバーがリソースレコードセット(RRset)に対して公開鍵暗号による電子署名を付加し、リゾルバ側で署名を検証することで、「応答が改ざんされていないこと(完全性)」および「正当な権威サーバーからの応答であること(真正性)」を数学的に証明します。

DNSSEC固有レコード 機能説明
RRSIG(Resource Record Signature) ゾーン内のレコードセット(AレコードやMXレコード等)に対して付与された電子署名データ。
DNSKEY(DNS Public Key) RRSIG署名を検証するための公開鍵(ZSK: ゾーン署名鍵、KSK: 鍵署名鍵)。
DS(Delegation Signer) 親ゾーン(上位ドメイン)に登録するKSKのハッシュ値。親子ドメイン間の「信頼の連鎖(Chain of Trust)」を確立。
NSEC / NSEC3 レコードが存在しないこと(不在証明)を署名付きで暗号学的に証明するレコード。

6. LinuC 202試験(主題2.08)重要ポイント総整理

主題2.08「ドメインネームサーバー(DNS)」における記述式問題(コマ問)頻出コマンドおよび設定ディレクティブを整理します。

6.1 記述式(コマ問)頻出コマンド・ディレクティブ一覧

設問対象・操作内容 入力すべきコマンド/設定値 注意点・失点防止ポイント
named.confの設定構文を検証するコマンド named-checkconf ハイフン(-)を含むコマンド名に注意
ゾーンファイルの構文を検証するコマンド named-checkzone <zone> <file> 第1引数にゾーン名、第2引数にファイルパス
BINDの全キャッシュを破棄するrndcサブコマンド rndc flush cleanclear ではなく flush
BINDの動作状態を表示するrndcサブコマンド rndc status プロセス確認とゾーン数の確認
再帰問い合わせを許可・禁止するディレクティブ recursion yes; / no; 末尾のセミコロン(;)必須
ゾーン転送を許可するホストを指定するディレクティブ allow-transfer { ... }; 波括弧とセミコロンの二重構文
逆引き問い合わせを行うdigオプション dig -x <IP> 小文字の -x

6.2 SOAレコードのタイマー値とゾーン転送の盲点

受験者が最も混同しやすいSOAタイマーの相互関係を2点整理します。

  1. 盲点1: Serial番号のインクリメント忘れ
    プライマリDNSのゾーンファイルを編集した際、Serial番号を増やさない限り、セカンダリDNSはゾーンファイルの更新を検知できません。Refreshタイマーが到来しても転送は実行されず、セカンダリは古いレコードを応答し続けます。
  2. 盲点2: Expireタイマーの役割と障害耐性
    プライマリサーバーが長期障害でダウンした場合でも、セカンダリDNSはExpireタイマーが満了するまではキャッシュおよびゾーンデータを基に権威応答を継続します。Expireが切れた時点で、セカンダリはそのゾーンに関する名前解決応答を完全に停止します。

7. まとめと次回予告(第11回:ApacheとTLS/HTTPS)

本記事では、LinuCレベル2(202試験)の最重要インフラであるBINDによるDNSサーバーの動作原理、named.conf の基本設定、SOAタイマーを含むゾーンファイルの構築記法、rndc による制御、そしてchrootやTSIG、DNSSECによるセキュリティ強化手法を実機ログとともに体系的に整理しました。

DNSが正しく機能して初めて、ドメイン名に基づいたWebアクセスやメール配送が成立します。ゾーンファイルの構文ルールやシリアル番号管理の挙動を実機で体得しておくことが、本番試験の記述式問題における高得点と実務トラブルシューティングの確固たる基礎となります。

次回(第11回)からは、インターネットのもうひとつの柱であるWebサーバーを取り上げます。Linux環境で長年実績を誇る Apache HTTP Server(httpd) を対象に、httpd.conf の基本構造、バーチャルホスト設定、アクセス制御、そしてTLS/SSL証明書の導入によるセキュアなHTTPS通信の構築手順を解説します。

前の記事
次の記事