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
の例)の手順は以下の通り。
- Webサーバやアプリは名前解決ライブラリのリゾルバに名前解決を依頼する
- リゾルバは
/etc/resolv.conf
に指定されているDNSサーバAに問い合わせを行う - DNSサーバAはルートDNSサーバに問い合わせを行う
- ルートDNSサーバは
www.XX.com
を知らない代わりに、.com
管轄のDNSサーバCの情報を返す - DNSサーバAはDNSサーバCに対し問い合わせる
- DNSサーバCは名前解決対象のドメイン名を知らない代わりに、
XX.com
管轄のDNSサーバDの情報を返す - DNSサーバAはDNSサーバDに対し問い合わせる
- DNSサーバDは
www.XX.com
のIPアドレスを返す - DNSサーバAは得られた情報をキャッシュしリゾルバに送信する
- リゾルバは得られた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サーバに問い合わせなどを行えるコマンド。
オプション | 説明 |
---|---|
-type=レコード | レコードタイプの指定 |
-norescue | 再帰的問い合わせをしない |
hostコマンド
DNSサーバを用いてホスト/ドメインに関する情報を表示するコマンド。 デフォルトでホスト名/IPアドレスの変換のみを行い、またDNSによる名前解決の確認に利用される。
オプション | 説明 |
---|---|
-t タイプ | リソースレコードタイプの指定 |
-v | 詳細情報の表示 |
digコマンド
詳細な情報をDNSサーバから取得できるコマンド。
オプション | 説明 |
---|---|
-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は以下の通り。
- any ... すべてのIPアドレス
- localhost ... ローカルホストが使用しているIPアドレス
- none ... いずれのIPアドレスともマッチしないアドレス
includeステートメント
指定した外部ファイルを読み込む。
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アドレス/ポート番号を指定する。
zoneステートメント
ゾーン名、ゾーンタイプ、ゾーンファイルの場所を指定する。 ゾーンタイプは以下の通り。
タイプ | 説明 |
---|---|
hint | ルートDNSサーバの指定 |
master | 指定したゾーンに対してのマスタDNSサーバ |
slave | 指定したゾーンに対してのスレーブDNSサーバ |
named.confの設定
ルートDNSサーバのIPアドレスを最新情報に変更するには以下のように操作する。
named-checkconfigコマンド
named.confの設定の構文チェックを行うコマンド。
chrootしている場合は-t
オプションでchrootディレクトリパスを指定する。
8.2.2. rndcコマンド
namedの操作を行うコマンド。
サブコマンド | 説明 |
---|---|
stop | namedの終了 |
refresh | ゾーンデータべースのリフレッシュ |
stats | 統計情報をnamed.stats に書きだす |
status | namedのステータスを表示する |
dumpdb | キャッシュの内容をファイル出力する |
reload ドメイン | 指定したゾーンファイルを再読み込みする |
halt | namedを停止する |
8.3. ゾーンファイルの管理
DNSサーバは複数ゾーンの管理ができ、ゾーン情報はゾーンごとにゾーンファイルに記載する。
ゾーンファイルはnamed.conf
で指定した数だけ必要になる。
ゾーンファイルの種類は以下の通り。
種類 | 説明 |
---|---|
hint情報ファイル | ルートDNSサーバ一覧 |
正引きファイル | ホスト名からIPアドレスの対応関係を記述 |
逆引きファイル | IPアドレスからホスト名への対応関係を記述 |
また書式は以下の通り。
8.3.1. リソースレコード
ソースファイルに記述する内容は以下の通り。
$ORIGIN
... レコードで補完するドメイン名の指定$TTL
... 他のDNSサーバがゾーンデータをキャッシュする時間の指定
またリソースレコードではゾーン情報を記述する。
ドメイン名はFDQNで指定し、最後に.
をつける。
リソースレコードのタイプは以下の通り。
リソースレコードタイプ | 説明 |
---|---|
SOA | 管理情報の記述 |
NS | ゾーンを管理するDNSサーバを記述 |
MX | メールサーバを記述(正引きのみ) |
A | ホスト名に対するIPアドレスを記述(正引きのみ) |
AAAA | ホスト名に対するIPv6アドレスを記述(正引きのみ) |
CNAME | ホスト名の別名に対するホスト名を記述(正引きのみ) |
PTR | IPアドレスに対するホスト名を記述(逆引きのみ) |
TLSA | デジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる |
SOAレコード
ゾーンに関する基本情報を記載する。
項目 | 説明 |
---|---|
Serial | シリアル番号の記述 |
Refresh | マスタDNSサーバのゾーン情報変更をスレーブDNSサーバがチェックする間隔の指定 |
Retry | スレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後に再試行するかの指定 |
Expire | スレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後にゾーン情報を破棄するかの指定 |
Negative TTL | 存在しないドメインに対するキャッシュの有効期限の設定 |
NSレコード
DNSサーバをFDQNで指定する。 DNSサーバ1つにつき1つずつ記述する。
MXレコード
MXレコードはメールサーバがメールを送る際に参照するもの。
プリファレンス値は値が小さいほど優先度が高い。 「10」ずつ値を区切るのが一般的となる。
Aレコード
ホスト名に対するIPアドレスを指定する。
AAAAレコード
ホスト名に対するIPv6アドレスを指定する。
CNAMEレコード
ホスト名の別名を記述する。
PTRレコード
IPアドレスに対するホスト名を記述する。
なおIPv6の場合は4bitごとに「.」を挿入、「:」を削除記載する。
8.3.2. ゾーンファイルの設定
named-checkzoneコマンド
ゾーンファイルの構文チェックを行うコマンド。
オプション | 説明 |
---|---|
-t ディレクトリ | chrootしている場合のディレクトリ指定 |
-w ディレクトリ | ゾーンファイルのディレクトリ指定 |
named-compilezoneコマンド
バイナリデータのゾーンファイルの内容を確認できるコマンド。
8.4. DNSサーバのセキュリティ
8.4.1. 通常のセキュリティオプション
named.conf
の設定で強化できるセキュリティ設定をいくつか記載する。
ゾーン転送の制限
スレーブDNSサーバはマスタDNSサーバからゾーン情報を転送する必要があるが、スレーブDNSサーバ以外はその必要がない。 ゾーン転送をスレーブDNSサーバのみに限定する場合は以下のように行う。
この設定により、ゾーン情報の全体を外部から問い合わせることが制限できる。
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
オプションに任意の文字列を指定する。
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の仕組みは以下の通り。
- ゾーン情報のハッシュ値(DS)とDNSサーバの秘密鍵で暗号化したものを電子署名とする
- DNS問い合わせの際にゾーン情報/電子署名をクライアントに送信する
- クライアントは電子署名をDNSサーバの公開鍵で復号する
- ゾーン情報のハッシュ値と電子署名の復号結果が一致すれば保証
この仕組みを順につなげることで信頼性のあるDNSのつながりが完成する。
またゾーン情報に電子署名を行う鍵をZSK(Zone Security Key)、ZSKに電子署名を行う鍵をKSK(Key Signing Key)と呼ぶ。 BIND 9.3.0以降でDNSSECは対応している。
DNSSECの設定
DNSSECをBINDで実装する手順は以下の通り。
- ZSK鍵ペアを作成する(ゾーンファイルを格納しているディレクトリで行う)
- 例:
dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone example.net
- 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
- KSK鍵ペアを作成する
- 例:
dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone example.net
- 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
- ゾーンファイルに生成した公開鍵が読みこまれるように設定する
$INCLUDE "鍵ファイル名"
dnssec-signzone
コマンドによりゾーンファイルに署名を行う- 例:
dnssec-signzone -o example.net example.net.zone
- 署名後に
ゾーン名.signed
(署名ファイル)が生成される
なお上位ゾーンへ管理する組織へDSレコード登録を申請する必要がある。
TSIGの設定
TSIG(Transaction SIGnatures)は共有秘密鍵の利用によりマスタDNSサーバになりすまし、偽のゾーンデータをスレーブDNSサーバに送ることや、ゾーンファイルを改ざんする攻撃を防ぐための仕組みのこと。 これはマスタDNSサーバ/スレーブDNSサーバがゾーン転送によりゾーンデータを同期することの性質によるもの。
TSIGの設定は以下の通り。
dnssec-keygen
コマンドにより共有鍵ファイルの作成- 例:
dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
- 例:
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に変更する。