ドメインネームサーバー
DNS サーバーの基本設定
DNS (Domain Name System) はホスト名と IP アドレスの対応情報を管理するシステムである。 対応情報はゾーンと呼ばれる単位で分散管理され、ゾーンは階層型で構成される。 ゾーン内の情報を管理および提供するのが DNS サーバーである。 対して DNS サーバーが提供するサービスを利用するのは DNS クライアントである。
DNS が提供する主なサービス
- 正引き: ホスト名から IP アドレスを取得するサービス
- 逆引き: IP アドレスからホスト名に取得するサービス
- メール: ドメイン名とメールサーバー名を対応付けるサービス
DNS リゾルバー
DNS クライアントが利用する DNS サーバーを管理するライブラリルーチンである。 /etc/resolv.conf
に利用する DNS サーバーの IP アドレスを記述する。
BIND
BIND (Berkeley Internet Name Domain) は広く使われる DNS サーバーソフトウェアである。 現在の最新バージョンは 9 なので、BIND9 と呼ばれる。
DNS のサービスを提供するデーモンは named (/usr/sbin/named
) である。 UDP の 53 番ポートで提供され、場合によって TCP も提供される。 サービス名は domain である。 起動時に設定ファイル /etc/named.conf
を読み込む。
マスターサーバー
マスターサーバーはオリジナルのゾーンデータを持つサーバーである。 対してバックアップや負荷分散を目的として、ゾーンデータのコピーを持つサーバーはスレーブサーバーである。
スレーブサーバー
通常ドメインを取得する際にはマスターサーバーとスレーブサーバーの 2 台を登録する必要がある。 スレーブサーバーは SOA (Start Of Authority) レコードで指定された周期でマスターサーバー内のゾーンデータのシリアル番号を確認する。 更新されていた場合はゾーン全体のデータをコピーするゾーン転送を行う。
再帰問い合わせ
サーバーに対してルートゾーンから他のドメインのサーバーに対してクエリーを要求する問い合わせである。 再帰問い合わせを処理するサーバーを再帰ネームサーバーと呼ぶ。 クライアントから再帰問い合わせを受けたサーバーは非再帰問い合わせを繰り返し、最終的に目的のドメインサーバーから答えを受け取る。 再帰ネームサーバーは他のドメインのサーバーから得た答えをそのレコードの TTL (Time To Live) で指定された秒数だけキャッシュとして保持する。 キャッシュとして問い合わせデータを保持するサーバーをキャッシングネームサーバーと呼ぶ。
ゾーンのオリジナルデータを管理するサーバーは権威サーバーもしくはコンテンツサーバーと呼ぶ。 不特定多数の外部から再帰的な問い合わせを許可しているサーバーをオープンリゾルバーと呼ぶ。 オープンリゾルバーは DDoS 攻撃の標的となる可能性があるので、利用は推奨されない。 特定のホストやネットワークからの問い合わせのみを許可するように構成する。
問い合わせ先のサーバーは forwarders ステートメントで指定する。 forward ステートメントでフォワーダーで解決できなかった場合の挙動を設定できる。
BIND の設定ファイル
- options
- directory: zone ステートメントで指定したファイルを配置するディレクトリを指定
- allow-query: 問い合わせを許可するネットワークやホストを指定
- blackhole: 問い合わせを拒否するネットワークやホストを指定
- recursion [yes|no]: 再帰問い合わせを許可もしくは拒否する
- allow-recursion: 再帰問い合わせを許可するネットワークやホストを指定
- allow-transfer: ゾーン転送を許可するホストの IP アドレスを指定
- acl: アドレスのリストに対応した名前をつける
- forwarders: 再帰問い合わせ先サーバーの IP アドレスを指定
- forward: 再帰問い合わせで解決しなかった際の挙動
- only: ローカルサーバーでは解決をしない
- first: ルートサーバーから繰り返して解決する
- version: 指定したバージョンを表示する
- zone: ルートゾーン、正引きゾーンもしくは逆引きゾーンを定義する
- type: ゾーンの種類を定義する
- hint: ルートゾーンの場合
- master: マスターサーバーの場合
- slave: スレーブサーバーの場合
- file: IP アドレスとホスト名の対応付けを記述するゾーンファイル名
- masters: スレーブサーバーの時、マスターサーバーの IP アドレスを指定
- masterfile-format: マスターサーバーからゾーン転送されてきたデータの格納形式を指定 (raw, text)
- type: ゾーンの種類を定義する
BIND 設定ファイルの記述例
options {
directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "mylpic.com" IN {
type master;
file "zone.mylpic.com";
};
zone "16.172.in-addr.arpa" IN {
type master;
file "zone.16.172.in-addr.arpa";
};
named-checkconf コマンド
BIND 設定ファイルの書式を確認する。
named-checkconf [オプション] [ファイル名]
- ファイル名: デフォルトは
/etc/named.conf
セキュリティ
named を安全に実行するためのオプションがいくつかある。
- -t: chroot jail 環境で実行する
- -u: 非特権ユーザーで実行する
ゾーンの管理
DNS ゾーンファイル
zone ブロック中の file サブステートメントでゾーンファイルを指定する。 $ORIGIN
ディレクティブでゾーンを指定できる。 ゾーンファイルには SOA, NS, A, MX, PTR, CNAME などのリソースレコードを記述する。 そのほかに管理権限の定義、ネームサーバーの定義、ホスト名と IP アドレスのマッピングなどレコードの書式に沿って 1 行ごとに記述する。
ゾーンファイルのレコード書式
ドメイン要素名 生存時間 オブジェクトアドレスタイプ レコードタイプ データ
フィールド | 説明 |
---|---|
ドメイン要素名 | ドメイン名、ホスト名、IP アドレスなど |
生存時間 (TTL) | キャッシュ内での生存時間 (秒) |
オブジェクトアドレスタイプ | IN と記述 |
レコードタイプ | SOA, NS, A, PTR, MX, CNAME などのレコードタイプを指定 |
データ | レコードタイプに対応したデータを記述 |
TTL
設定方法は 3 通りある。
- RR (Resource Record) の第 2 フィールドで指定
- $TTL ディレクティブで指定
- SOA レコードでネガティブキャッシュの TTL を指定
$TTL ディレクティブで TTL を指定するとその行以降の RR のデフォルト値となる。
ORIGIN
$ORIGIN ディレクティブは記述した行以降の RR 中の . で終わらない名前の最後に付加するドメインを定義する。 既定では /etc/named.conf
の zone ステートメントで定義したドメイン名となるが、これを変更できる。 $ORIGIN ディレクティブはゾーンファイル中のどの行にも記述できる。
ネガティブキャッシュ TTL
他のサーバーからの NXDOMAIN (ドメインが存在しない) 応答をキャッシュする時間である。 SOA レコードの最後のフィールドで指定する。 1 時間 〜 3 時間で指定することが推奨される。 BIND9 のデフォルトは 3 時間となっている。
レコードタイプ
レコードタイプ | 正式名称 | 説明 |
---|---|---|
SOA | Start Of Authority | 管理権限の定義 |
NS | Name Server | ネームサーバーの定義 |
A | Address | ホスト名から IP アドレスへの対応づけを定義 |
PTR | Pointer | IP アドレスからホスト名への対応づけを定義 |
MX | Mail Exchanger | ドメイン名からメールサーバー名への対応づけを定義 |
CNAME | Canonical Name | 別名から正規名への対応づけを定義 |
データフィールド内のリフレッシュ間隔、リトライ間隔、失効時間、TTL は秒単位だが単位をつけると変更できる。
- M: 分
- H: 時
- D: 日
- W: 週
SOA レコードのデータフィールド
フィールド | 説明 |
---|---|
管理ホスト名 | マスターサーバーのホスト名 |
管理者メールアドレス | ユーザー名.ドメイン名 |
シリアル番号 | 更新時に 1 以上増加する |
リフレッシュ間隔 | スレーブが更新を確認する間隔 |
リトライ期間 | アクセスできなかった時、スレーブがリトライする時間 |
失効時間 | アクセスできなかった時、スレーブがデータを破棄するまでの時間 |
TTL | ネガティブキャッシュの TTL |
MX レコード
MX レコードには A レコードによって定義された正規名を書く。
NS レコード
NS レコードで管理を委任するサブドメインと、管理ネームサーバーの名前を記述する。 gllue レコードと呼ばれる下位ドメインのネームサーバーを繋げる役割の A レコードも記述する。
PTR レコード
逆引きゾーンのレコード問い合わせに IP アドレスを返す。 レコードの最後に「.」をつけない場合は相対名と解釈され、末尾に ORIGIN が付与される。
named-chekzone コマンド
ゾーンファイルの書式をチェックする。 問題なければ OK と表示される。
named-checkzone [オプション] ゾーン名 ゾーンファイル名
named-compilezone コマンド
ゾーンファイルの書式をチェックする。 問題なければ OK と表示される。
named-compilezone [オプション] -o [dump ファイル名] ゾーン名 ゾーンファイル名
- -o: 指定したファイルに結果をテキスト形式でダンプする
サーバーの制御、デバッグ、クライアントコマンド
ログ
syslog にログを記録する。
- デフォルト
- ファシリティ: daemon
- プライオリティ: info
rndc コマンド
サーバー named を制御する。
# named ステータス表示
rndc status
# named 停止
rndc stop
# 設定ファイルの再読み込み
rndc reload
# 指定ゾーンの再読み込み
rndc reload ゾーン名
# キャッシュ内容のダンプ
rndc dumpdb
dig コマンド
DNS サーバーに問い合わせを行う。
dig [@サーバー] [オプション] ドメイン
- @サーバー名: 問い合わせるサーバーを指定
- -r [レコードタイプ]: 問い合わせるレコードタイプを指定
- a: A レコード
- any: すべてのレコードタイプ
- mx: MX レコード
- ns: NS レコード
- soa: SOA レコード
- axfr: ゾーン転送
- -x [IP アドレス]: 逆引きの指定
- +resourse: RD (recursion desired) ビットを立てて再起問い合わせをリクエストする
- +noresourse: RD ビットを立てず、非再起問い合わせをリクエストする
- +trace: ルートゾーンからの問い合わせをトレースする
- +notrace: ルートゾーンからの問い合わせをトレースしない
- +short: 結果を簡潔に表示する
- +noshort: 結果を詳細に表示する
セクション
セクション | 説明 |
---|---|
Header | メッセージの内容を表すフラグやステータスとして表示されるサーバーからの応答コード |
Question | クライアントからの問い合わせ内容 |
Answer | サーバーからの回答 |
Authority | 問い合わせたゾーンについての機能を有するサーバーの情報 |
Addtional | 非再帰問い合わせに対するサーバーへの回答など |
Header セクションのフラグ
フラグ | 説明 |
---|---|
qr (Query) | 問い合わせの時はこのフラグが立ち、応答は立たない |
aa (Authoritative Answer) | ドメイン機能を有するサーバーへの応答 |
rd (Recursion Desired) | 再帰問い合わせをリクエストした際にこのフラグが立つ |
ra (Recursion Available) | サーバーが再帰問い合わせを許可したときにこのフラグが立つ |
Header セクションのステータス
ステータス | 説明 |
---|---|
NOERROR | エラーなし |
FORMERR | フォーマットエラー: サーバーが問い合わせを解釈できない |
SERVFAIL | サーバーエラー: サーバー内部の問題で問い合わせを処理できない |
NXDOMAIN | ドメインの権限を有するサーバーのデータ内に問い合わせしたドメインが存在しない |
NOTIMP | サーバーには問い合わせを処理する機能がない |
REFUSED | サーバーのポリシー設定により、問い合わせが拒否された |
TSIG (Transaction Signature)
TSIG は共有秘密鍵と一方向性ハッシュ関数を使用したトランザクションレベル認証のためのプロトコルである。 クライアント認証の仕組みとして利用できる。
あらかじめ、クライアントとサーバーで同じ秘密鍵を設定しておく必要がある。 クライアント側のデフォルトでは /etc/rndc.key
ファイルを参照する。 TSIG 用の秘密鍵は HMAC-MD5 アルゴリズムを利用する必要がある。
- クライアントは共有秘密鍵を使用した HMAC-MD5 によって DNS メッセージのハッシュ値を計算して暗号化する
- 上記ハッシュ値とハッシュ化した現在の時刻を元の DNS メッセージの Additional セクションに追加する
- Addtional セクションを含む DNS メッセージをサーバーに送信する
- サーバーは受信した DNS メッセージをクライアントと同じ計算方法でハッシュし、暗号化する
- 受信した値と計算したハッシュ値を比較し、値に相違がなく時刻が定めた期間内であれば送信元の正当性とデータの完全性を認証する
dnssec-keygen コマンド
TSIG 共有秘密鍵を生成する。 共有秘密鍵を作成する場合、オーナータイプは USER を指定する。 DNSSEC で使用する鍵のペアの場合、オーナータイプは ZONE を指定する。
dnssec-keygen [オプション] 鍵の名前
- -a: 暗号化アルゴリズムを指定する (HMAC-MD5, RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512, ECCGOST)
- -b: 生成する鍵のビット長を指定する (デフォルト 128, RSA 鍵の場合は 512 ~ 2048)
- -n: 鍵のオーナータイプを指定する (ZONE, HOST, USER)
DNSSEC (DNS Security Extentions)
デジタル署名による生成元の正当性と DNS データの完全性を提供する。 サーバーがゾーンデータを秘密鍵で署名し、クライアントはサーバーの公開鍵で生成元の正当性とデータの完全性検証する。 ゾーンへの署名は dnssec-signzone コマンドで行う。
- サーバーは公開鍵と秘密鍵のペアを生成する
- サーバーは公開鍵をゾーンデータに登録する
- サーバーは秘密鍵を使用してゾーンのリソースレコードをハッシュ計算し、暗号化する
- サーバーはハッシュ計算した署名をゾーンデータに登録する
- サーバーはクライアントのリクエストに応じてゾーンデータを送信する
- クライアントはサーバーの公開鍵を使用してリソースレコードのハッシュを復号化する
- クライアントはサーバーの署名と複合した署名を検証する
BIND 以外の DNS サーバー
- dnsmasq: DNS, DHCP, TFTP 機能を持つサーバープログラム
- djbdns:コンテンツ DNS サーバーとキャッシング DNS サーバーを分離してセキュリティ強化
- コンテンツ DNS サーバー:
/usr/sbin/tinydns
- キャッシング DNS サーバー:
/usr/sbin/dnscashe
- コンテンツ DNS サーバー:
- PowerDNS (pdns, pdns-server, pdns-recursor): 複数のバックエンドをサポートする DNS サーバー
コメント