コンテンツにスキップ

8. DNS

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サーバ

名前 説明 設定ファイル
dnsmasq DNS/DHCPサーバ機能を提供する軽量ソフトウェア /etc/dnsmasq.conf
PowerDNS コンテンツサーバ/キャッシュサーバ機能を提供する。DNSのキャッシュサーバやDHCPサーバなどの機能を持つ /etc/pdns/pdns.conf
djbdns DNSのキャッシュサーバとコンテンツサーバの機能が分かれている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アドレス(デフォルト)
ptr IPアドレスに対応するホスト名
ns DNSサーバ
mx メールサーバ
soa SOAレコード情報
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のステートメントは以下の通り。

ステートメント 説明
acl ACLの定義
controlls namedを操作できるホストの設定
include 外部ファイルの読み込み
key 認証情報の設定
options namedの操作に関する詳細設定
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 [サブコマンド]
サブコマンド 説明
stop namedの終了
refresh ゾーンデータべースのリフレッシュ
stats 統計情報をnamed.statsに書きだす
status namedのステータスを表示する
dumpdb キャッシュの内容をファイル出力する
reload ドメイン 指定したゾーンファイルを再読み込みする
halt namedを停止する

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 ホスト名の別名に対するホスト名を記述(正引きのみ)
PTR IPアドレスに対するホスト名を記述(逆引きのみ)
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鍵ペアを作成する(ゾーンファイルを格納しているディレクトリで行う)
  2. 例:dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone example.net
  3. 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
  4. KSK鍵ペアを作成する
  5. 例:dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone example.net
  6. 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
  7. ゾーンファイルに生成した公開鍵が読みこまれるように設定する
  8. $INCLUDE "鍵ファイル名"
  9. dnssec-signzoneコマンドによりゾーンファイルに署名を行う
  10. 例:dnssec-signzone -o example.net example.net.zone
  11. 署名後にゾーン名.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に変更する。