8.DNS

bind(DNSサーバ)やDNSをLinuxで使う際のポイントなど

8.1. DNSの基礎知識

8.1.1. 名前解決

DNSサーバはホスト名とIPアドレスを相互に変換する名前解決という仕組みを提供する。 ホスト名からIPアドレスを求めることは正引き、その逆を逆引きと呼ぶ。

ホスト名はコンピュータに付けられた固有の名前。 ドメイン名(XX.comなど)はホストの所属するネットワーク上の区画を表す。

www.XX.comなどはFDQN(完全修飾ドメイン名)と呼ばれる。

8.1.2. DNSの仕組み

LinuxにおけるDNSによる名前解決(www.XX.comの例)の手順は以下の通り。

  1. Webサーバやアプリは名前解決ライブラリのリゾルバに名前解決を依頼する
  2. リゾルバは/etc/resolv.confに指定されているDNSサーバAに問い合わせを行う
  3. DNSサーバAはルートDNSサーバに問い合わせを行う
  4. ルートDNSサーバはwww.XX.comを知らない代わりに、.com管轄のDNSサーバCの情報を返す
  5. DNSサーバAはDNSサーバCに対し問い合わせる
  6. DNSサーバCは名前解決対象のドメイン名を知らない代わりに、XX.com管轄のDNSサーバDの情報を返す
  7. DNSサーバAはDNSサーバDに対し問い合わせる
  8. DNSサーバDはwww.XX.comのIPアドレスを返す
  9. DNSサーバAは得られた情報をキャッシュしリゾルバに送信する
  10. リゾルバは得られたIPアドレスをWebブラウザやアプリに知らせる

8.1.3. DNSサーバ

BIND

BIND(ISC DNS)はDNSサーバソフトウェアであり、多くのLinuxディストリビューションで採用されている。 BINDのサーバデーモンはnamedである。

/etc/dhcpd.conf

BIND以外のDNSサーバ

名前説明設定ファイル
dnsmasqDNS/DHCPサーバ機能を提供する軽量ソフトウェア/etc/dnsmasq.conf
PowerDNSコンテンツサーバ/キャッシュサーバ機能を提供する。DNSのキャッシュサーバやDHCPサーバなどの機能を持つ/etc/pdns/pdns.conf
djbdnsDNSのキャッシュサーバとコンテンツサーバの機能が分かれているDNSサーバ。RDBは使用できない/var/djbdns/dnscache/以下

ゾーン

ゾーンはDNSサーバが管轄するドメインの範囲のこと。 ゾーンを管理できる権威を持っていることは権威を持つと呼ぶ。

また下位のDNSサーバに対しゾーン管理を移すことは委譲と呼ぶ。

マスタDNSサーバ/スレーブDNSサーバ

  • マスタDNSサーバ
    • ゾーンファイルを所有するDNSサーバ
  • スレーブDNSサーバ
    • マスターDNSサーバのゾーン情報をコピーするDNSサーバ

なおマスタDNSサーバからスレーブDNSサーバへゾーン情報をコピーすることはゾーン転送と呼ばれる。

再帰的な問い合わせ

再帰的な問い合わせは最終的な結果を要求するDNS問い合わせのこと。 無条件に再帰的に問い合わせを許可すると、第3者からの問い合わせに回答しなくならないため、自ドメインからのみの問い合わせに対し許可をする。

8.1.4. DNSクライアントコマンド

nslookupコマンド

IPを調べたり、DNSサーバに問い合わせなどを行えるコマンド。

nslookup [オプション] [ホスト名|ドメイン名|IPアドレス]
オプション説明
-type=レコードレコードタイプの指定
-norescue再帰的問い合わせをしない

hostコマンド

DNSサーバを用いてホスト/ドメインに関する情報を表示するコマンド。 デフォルトでホスト名/IPアドレスの変換のみを行い、またDNSによる名前解決の確認に利用される。

host [オプション] ホスト名|ドメイン名|IPアドレス [問い合わせDNSサーバ]
オプション説明
-t タイプリソースレコードタイプの指定
-v詳細情報の表示

digコマンド

詳細な情報をDNSサーバから取得できるコマンド。

dig [@問い合わせ先DNSサーバ] ホスト名|ドメイン名|IPアドレス [クエリタイプ]
オプション説明
-x指定されたIPアドレスの逆引きを行う
-p ポート番号問い合わせ先のポート番号を指定(53番がデフォルト)
クエリタイプ説明
aホスト名に対応するIPアドレス(デフォルト)
ptrIPアドレスに対応するホスト名
nsDNSサーバ
mxメールサーバ
soaSOAレコード情報
hinfoホスト情報
axfrゾーン転送
txt任意の文字列
anyすべての情報

なお問い合わせ後に表示されるflagsには以下のようなものがある。

フラグ説明
qr問い合わせに対する回答
aa権威のある回答
rd再帰検索を希望
ra再帰検索が可能

また回答の表示されるセクションは4つに分かれる。

  • QUSETION SECITION
    • 問い合わせ内容の表示
  • ANSWER SECTION
    • 問い合わせの回答内容の表示
  • AUTHORITY SECTION
    • 問い合わせ先に権威がある場合に表示
  • ADDITIONAL SECTION
    • 回答したホストのIPアドレスなど追加情報が表示

8.2. BINDの基本設定

BINDの設定は/etc/named.confとゾーンファイルで構成される。

8.2.1. /etc/named.conf

// rndcコマンドによるnamedの操作を許可するホストの指定
controls {
    inet 127.0.0.1 allow { localhost; };
};

// ゾーンファイルを格納するディレクトリ指定
options {
    directory "/var/named";
};

// ルートDNSサーバの指定
zone "." {
    type hint;
    file "named.ca";
};

// ローカルホストの正引き設定
zone "localhost" {
    type master;
    file "0.0.127.in-addr.zone";
};

// ローカルホストの逆引き設定
zone "0.0.127.in-addr.arpa" {
    type master;
    file "0.0.127.in-addr.arpa.zone";
};

// example.netドメインの正引き設定
zone "example.net" {
    type master;
    file "example.net.zone";
};

// example.netドメインの逆引き設定
zone "30.20.10.in-addr.arpa" {
    type master;
    file "30.20.10.in-addr.arpa.zone";
}

また/etc/named.confのステートメントは以下の通り。

ステートメント説明
aclACLの定義
controllsnamedを操作できるホストの設定
include外部ファイルの読み込み
key認証情報の設定
optionsnamedの操作に関する詳細設定
zoneゾーンの定義

aclステートメント

アクセス制御リスト(ACL)を定義する。 アドレスマッチリストにはIPアドレス/ネットワークアドレスを記述する。

acl acl名 {
    アドレスマッチリスト
};

なお定義済みACLは以下の通り。

  • any … すべてのIPアドレス
  • localhost … ローカルホストが使用しているIPアドレス
  • none … いずれのIPアドレスともマッチしないアドレス

includeステートメント

指定した外部ファイルを読み込む。

include "/etc/rndv.key";

optionsステートメント

namedの動作に関する詳細なオプションを設定する。 利用可能なオプションは以下の通り。

重要なパラメータは太字にしてある。

オプション説明
directory ディレクトリパスゾーンファイルを格納するディレクトリ
datasizeデータセグメントサイズの上限
coresizeコアファイルのサイズ上限
max-cache-size キャッシュサイズ最大キャッシュバイト(Byte単位)
rescursion Yes|No再帰問い合わせの受け付け有無
rescusive-clients クライアント数再帰問い合わせの最大同時接続数
allow-query問い合わせを受け付けるホスト
allow-transferゾーン転送を許可するホスト
allow-updateゾーン情報の動的アップデートを受け付けるホスト
blackhole問い合わせを受け付けないホスト
forwarders { IPアドレス; }問い合わせの回送先DNSサーバ
forward only|first問合せ転送の失敗時の動作を設定する
notifyゾーンデータの更新をスレーブサーバに通知するかの有無
versionバージョン表示

なおフォワード(回送)は自身がゾーン情報を保存せず、キャッシュもない場合に問い合わせがあれば別のDNSサーバに問い合わせる機能のこと。

controllsステートメント

namedを操作できるホストのIPアドレス/ポート番号を指定する。

controls {
    inet 127.0.0.1 allow { localhost; }
};

zoneステートメント

ゾーン名、ゾーンタイプ、ゾーンファイルの場所を指定する。 ゾーンタイプは以下の通り。

タイプ説明
hintルートDNSサーバの指定
master指定したゾーンに対してのマスタDNSサーバ
slave指定したゾーンに対してのスレーブDNSサーバ
zone "example.com" {
    type master;
    file "example.net.zone";
};

named.confの設定

ルートDNSサーバのIPアドレスを最新情報に変更するには以下のように操作する。

dig @m.root-servers.net. ns > /var/named/[hint情報ファイル]

named-checkconfigコマンド

named.confの設定の構文チェックを行うコマンド。

named-checkconf [named.confのパス]

chrootしている場合は-tオプションでchrootディレクトリパスを指定する。

named-checkconf -t [chrootのパス] [named.confのパス]

8.2.2. rndcコマンド

namedの操作を行うコマンド。

named [サブコマンド]
サブコマンド説明
stopnamedの終了
refreshゾーンデータべースのリフレッシュ
stats統計情報をnamed.statsに書きだす
statusnamedのステータスを表示する
dumpdbキャッシュの内容をファイル出力する
reload ドメイン指定したゾーンファイルを再読み込みする
haltnamedを停止する

8.3. ゾーンファイルの管理

DNSサーバは複数ゾーンの管理ができ、ゾーン情報はゾーンごとにゾーンファイルに記載する。 ゾーンファイルはnamed.confで指定した数だけ必要になる。

ゾーンファイルの種類は以下の通り。

種類説明
hint情報ファイルルートDNSサーバ一覧
正引きファイルホスト名からIPアドレスの対応関係を記述
逆引きファイルIPアドレスからホスト名への対応関係を記述

また書式は以下の通り。

名前 [TTL値] IN リソースレコードタイプ 値

8.3.1. リソースレコード

ソースファイルに記述する内容は以下の通り。

  • $ORIGIN … レコードで補完するドメイン名の指定
  • $TTL … 他のDNSサーバがゾーンデータをキャッシュする時間の指定

またリソースレコードではゾーン情報を記述する。 ドメイン名はFDQNで指定し、最後に.をつける。 リソースレコードのタイプは以下の通り。

リソースレコードタイプ説明
SOA管理情報の記述
NSゾーンを管理するDNSサーバを記述
MXメールサーバを記述(正引きのみ)
Aホスト名に対するIPアドレスを記述(正引きのみ)
AAAAホスト名に対するIPv6アドレスを記述(正引きのみ)
CNAMEホスト名の別名に対するホスト名を記述(正引きのみ)
PTRIPアドレスに対するホスト名を記述(逆引きのみ)
TLSAデジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる

SOAレコード

ゾーンに関する基本情報を記載する。

名前 IN SOA DNSサーバ  メールアドレス (
    [値] ;Serial 
    [値] ;Refresh
    [値] ;Retry
    [値] ;Expire
    [値] ;Negative TTL
)
項目説明
Serialシリアル番号の記述
RefreshマスタDNSサーバのゾーン情報変更をスレーブDNSサーバがチェックする間隔の指定
RetryスレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後に再試行するかの指定
ExpireスレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後にゾーン情報を破棄するかの指定
Negative TTL存在しないドメインに対するキャッシュの有効期限の設定

NSレコード

DNSサーバをFDQNで指定する。 DNSサーバ1つにつき1つずつ記述する。

名前 IN NS DNSサーバ名

MXレコード

MXレコードはメールサーバがメールを送る際に参照するもの。

名前 IN MX プリファレンス値 メールサーバ名

プリファレンス値は値が小さいほど優先度が高い。 「10」ずつ値を区切るのが一般的となる。

Aレコード

ホスト名に対するIPアドレスを指定する。

ホスト名 IN A IPアドレス

AAAAレコード

ホスト名に対するIPv6アドレスを指定する。

ホスト名 IN AAAA IPv6アドレス

CNAMEレコード

ホスト名の別名を記述する。

別名 IN CNAME ホスト名

PTRレコード

IPアドレスに対するホスト名を記述する。

IPアドレス.in-addr-arpa. IN PTR ホスト名

なおIPv6の場合は4bitごとに「.」を挿入、「:」を削除記載する。

8.3.2. ゾーンファイルの設定

named-checkzoneコマンド

ゾーンファイルの構文チェックを行うコマンド。

named-checkzone [オプション] ゾーン名 ゾーンファイル名
オプション説明
-t ディレクトリchrootしている場合のディレクトリ指定
-w ディレクトリゾーンファイルのディレクトリ指定

named-compilezoneコマンド

バイナリデータのゾーンファイルの内容を確認できるコマンド。

named-compilezone

8.4. DNSサーバのセキュリティ

8.4.1. 通常のセキュリティオプション

named.confの設定で強化できるセキュリティ設定をいくつか記載する。

ゾーン転送の制限

スレーブDNSサーバはマスタDNSサーバからゾーン情報を転送する必要があるが、スレーブDNSサーバ以外はその必要がない。 ゾーン転送をスレーブDNSサーバのみに限定する場合は以下のように行う。

zone "example.net" {
    allow-transfer { 192.168.128.3; };
};

この設定により、ゾーン情報の全体を外部から問い合わせることが制限できる。

DNS問い合わせの制限

DNS問い合わせの制限は不要なDNSサーバ利用を阻止することが可能。 また再帰的な問い合わせの禁止は不正なキャッシュデータをDNSサーバに送りつけるキャッシュ汚染攻撃を回避することができる。

; 192.168.120.0/24からの問い合わせ/再帰的な問い合わせの許可
options {
    allow-query { 192.168.120.0/24; };
    allow-rescursion { 192.168.120.0/24; };
};

; 以下のゾーンはすべてのホストからの問い合わせの許可
zone "example.net" {
    allow-query { any; };
};
zone "192.168.120.in-addr.arpa" {
    allow-query { any; };
};

バージョン番号の秘匿

digコマンドによりBINDのバナー情報として表示することができる。 そのためバージョンを秘匿するにはoptionsオプション内でversionオプションに任意の文字列を指定する。

options {
    version "unknown DNS Server";
};

root以外によるnamedの実行

root権限以外でnamedを実行すれば、DNSサーバがクラッカーにより侵入されたとしても被害を最低限に抑えることができる。 BINDをパッケージでインストールするとnamedユーザが生成され、その権限で実行されることになる。

確認はps -f -C namedで可能。 chrootを使用することでさらに侵入されたときの被害をおさえることができる。

chroot: 任意のディレクトリをプロセスにとっての「/」と扱うことで、そのディレクトリ以外をアクセスできないようにする手法

この場合、namedの運用に必要なファイルはchrootディレクトリ以下に配置する必要がある。

8.4.2. DNSSEC/TSIG

DNSの仕組み強化の仕組みにはDNSSEC/TSIGなどがある。

DNSSEC(DNS Security)はゾーン情報の信頼性を保証するための仕組みで、具体的にはゾーン情報に公開鍵暗号方式の電子署名を行うことでゾーン情報が改ざんされていないこと、DNS応答が正当な管理者により行われることを保証する。 DNSSECの利用にはDNSサーバ/クライアント両方対応している必要がある。

DNSSECの仕組みは以下の通り。

  1. ゾーン情報のハッシュ値(DS)とDNSサーバの秘密鍵で暗号化したものを電子署名とする
  2. DNS問い合わせの際にゾーン情報/電子署名をクライアントに送信する
  3. クライアントは電子署名をDNSサーバの公開鍵で復号する
  4. ゾーン情報のハッシュ値と電子署名の復号結果が一致すれば保証

DNSSEC

この仕組みを順につなげることで信頼性のあるDNSのつながりが完成する。

またゾーン情報に電子署名を行う鍵をZSK(Zone Security Key)、ZSKに電子署名を行う鍵をKSK(Key Signing Key)と呼ぶ。 BIND 9.3.0以降でDNSSECは対応している。

DNSSECの設定

DNSSECをBINDで実装する手順は以下の通り。

  1. ZSK鍵ペアを作成する(ゾーンファイルを格納しているディレクトリで行う)
    • 例:dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone example.net
    • 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
  2. KSK鍵ペアを作成する
    • 例:dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone example.net
    • 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
  3. ゾーンファイルに生成した公開鍵が読みこまれるように設定する
    • $INCLUDE "鍵ファイル名"
  4. dnssec-signzoneコマンドによりゾーンファイルに署名を行う
    • 例:dnssec-signzone -o example.net example.net.zone
    • 署名後にゾーン名.signed(署名ファイル)が生成される

なお上位ゾーンへ管理する組織へDSレコード登録を申請する必要がある。

TSIGの設定

TSIG(Transaction SIGnatures)は共有秘密鍵の利用によりマスタDNSサーバになりすまし、偽のゾーンデータをスレーブDNSサーバに送ることや、ゾーンファイルを改ざんする攻撃を防ぐための仕組みのこと。 これはマスタDNSサーバ/スレーブDNSサーバがゾーン転送によりゾーンデータを同期することの性質によるもの。

TSIGの設定は以下の通り。

  1. dnssec-keygenコマンドにより共有鍵ファイルの作成
    • 例:dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
  2. named.confに共有鍵ファイルを記載する

マスタDNSサーバの例(tsig-keyは鍵名)

key "tsig-key" {
    alogorithm hmac-md5;
    secret "keyの中身":
};

zone "example.net" {
    type master;
    file "example.net.zone";
    allow-transfer { 192.168.1.100; };
};

スレーブDNSサーバの例(tsig-keyは鍵名)

key "tsig-key" {
    alogorithm hmac-md5;
    secret "keyの中身":
};

server 192.168.1.25 {
    keys { tsig-key; };
};

zone "example.net" {
    type slave;
    file "example.net.zone";
};

8.4.3. DANE

DANE(DNS-based Authentication of Named Entitie)はDNSSECの技術を応用して認証情報をDNSベースでやり取りする仕組み。 DNSSECにより、リソースレコードの正当性確認の仕組みがDNSに組み込まれたため、HTTPSなどで使われるX509の証明書とドメインの紐づけの役割を、認証局からDNSに移すことを目的にし、策定されている。

デジタル署名されたレコードをTLSAレコードと呼び、webのHTTPSで使用されるTLSと技術的には同じ方法を用いて、信頼の基盤を認証局からDNSSECに変更する。

最終更新 2025.01.19: Added ss command (683d062)