ドメインネームサーバ
ポイント
理解しておきたい用語と概念
- DNS
- ゾーン
- /etc/named.conf
- ゾーンファイルとレコード
- ゾーン転送
- chroot
- DNSSEC
- TSIG
- DANE
習得しておきたい技術
- /etc/named.confの設定
- ゾーンファイルの設定
- 名前解決コマンド
- rndcコマンド
- BINDのセキュリティ
- dnssec-keygenコマンド
- dnssec-signzoneコマンド
DNSの基本
DNSサーバ
- DNSサーバソフトウェアとして、BINDをがよく利用される。サーバデーモンはnamed
- 機能
- キャッシュサーバ
- 名前解決検索リクエストを受け取り、他のDNSサーバに問い合わせを行う
- コンテンツサーバ
- 自身の管理するドメインの情報を公開する
- 権威DNS
- キャッシュサーバ
- ゾーン
- DNSサーバが管轄するドメインの範囲
- 権威
- ゾーンを管理できる権限を持っていること
- 移譲
- 下位のDNSサーバに管理を移すこと
- マスタースレーブ
- マスター
- ゾーンファイルを所有するDNSサーバ
- スレーブ
- マスターのゾーン情報をコピーするDNSサーバ
- ゾーン転送
- マスターからスレーブへのコピー
- マスター
- 問い合わせを下位のDNSサーバに再起的に行う
- DNSサーバが使用するポート番号は53
- BINDのログ
- /var/log/messages (RedHat系)
- /var/log/syslog (Debian系)
DNSサーバソフトウェア
BIND
- Berkeley Internet Name Domain
- 代表的なDNSサーバでありLinuxで利用される
- namedデーモンが起動
dnsmasq
- DNSキャッシュサーバとDHCPサーバの機能を提供する軽量なソフトウェア
- ディーエヌエス マスクと読む
- コンテンツサーバの機能はなく、簡易的なDNSキャッシュサーバとして利用できる
djbdns
- 機能を分割して安全性を高めたDNSサーバ
- コンテンツサーバとキャッシュサーバの機能が分かれている
- ダニエル・J・バーンスタインによって開発されたのでdjb
PowerDNS
- コンテンツサーバおよびキャッシュサーバ機能を提供するソフトウェア
- MySQL, RDBをバックエンドデータベースとして利用できる
クライアントコマンド
hostコマンド
- 名前解決の結果のみを完結に表示
-t
リソースレコードタイプを指定
nslookupコマンド
- 現在は非推奨で後継はdig
- 対話モードでも問い合わせができる
digコマンド
- Domain Information Grouper
- 名前解決の詳細を表示。クエリを発行し得られた応答を出力して詳細を表示
- 回答はヘッダ+4つのセクション+フッタ
- ヘッダ
- digコマンドの実行結果そのものに関する情報
- セクション
- QUESTION SECION
- 問い合わせ内容
- ANSWER SECTION
- 問い合わせに対する回答
- AUTHORITY SECTION
- 問い合わせ先に権威がある場合に表示
- ADDITIONAL SECTION
- 回答したホストのIPアドレスなどの付帯情報
- QUESTION SECION
- フッタ
- Query time
- 検索に要した時間
- SERVER
- 回答したホストのIPアドレスとポート番号
- WHEN
- 問い合わせ日時
- MSG SIZE rcvd
- メッセージサイズ
- Query time
BINDの基本設定
BINDの設定はメイン設定ファイル/etc/named.confとゾーンファイルから構成される
/etc/named.conf
- いくつかのステートメントとオプションから構成される
- ステートメントはセミコロンで終わる。ステートメント内のサブステートメントもセミコロンで終わる
- aclステートメント
- ACLの定義。IPアドレスやネットワークアドレスのリストを任意の名前で定義
- controlsステートメント
- rndcコマンドの使用を許可するホストを指定
- includeステートメント
- 外部ファイルの読み込み
- keyステートメント
- 認証情報の設定
- TSIGなどで利用する鍵情報を記述
- zoneステートメント
- ゾーンの定義。ゾーンファイル名を指定する
- スレーブサーバのzoneステートメントに「masterfile-format text;」を指定すると、テキスト形式でゾーンデータを扱えるようになる(パフォーマンスは悪くなる)
- optionsステートメント
- namedの動作に関する詳細設定
- ゾーンファイルに配置するディレクトリを指定
directory
- namedの作業ディレクトリを指定
recursion [yes|no]
- 再起問い合わせを受け付けるかの設定
- キャッシュサーバであればyes, ゾーンサーバであればno
recursive-clients
max-cache-size
forward [only|first]
- 問い合わせ転送の失敗時の動作を設定
first
失敗時に自分で問い合わせするonly
失敗時に自分で問い合わせしない
forwarders
- 自身が保持しないドメイン情報の問い合わせを転送するDNSサーバのアドレスを指定
allow-query
- 問い合わせを受け付けるホストを指定。ホワイトリスト
blackhole
- 問い合わせを受け付けないホストを指定。ブラックリスト
allow-recursion
- 再起問い合わせを受け付けるホストを指定
allow-transfer
- ゾーン転送を許可するホストを指定
version
- BINDのバージョンの問い合わせに対し、出力される文字列を設定
- 実際のバージョンを隠蔽してセキュリティレベルを上げる
- named-checkconf
- named.confの構文チェック
rndcコマンド
- remote named daemon control
- namedを操作できるコマンド。ステータス表示、設定反映、停止など
- startやrestartのオプションはない
- サブコマンド
- status
- namedのステータスを表示する
- reload
- 設定を再読み込み
- 設定を再読込させるその他のコマンド
kill -HUP
cat /var/run/named.pid``- /etc/init.d/named restart
- halt
- namedを直ちに停止
- stop
- 動的な更新等を保存してからnamedを停止
- status
ゾーンファイルの管理
ゾーンに関する情報は、ゾーンごとにゾーンファイルに記述する
- ゾーンファイル名はzoneステートメントに指定
- ゾーンファイルの種類
- hint情報ファイル
- ルートDNSサーバの一覧
- 正引きファイル
- ホスト名→IPアドレス
- 逆引きファイル
- IPアドレス→ホスト名
- hint情報ファイル
- ゾーンファイルの書式
名前 [TTL値] IN リソースレコードタイプ 値
ゾーンファイルの構成
- $ORIGINディレクティブ
- ドメイン名が明示されていないレコードで補完するドメインを指定。ホスト名のみで記述された名前に追加される
$ORIGIN ドメイン名
- 省略されている場合は、/etc/named.confのzoneステートメントで指定したドメインになる
- $TTLディレクティブ
- 他のDNSサーバがゾーンデータをキャッシュの保存しておく時間を指定
$TTL 秒
- リソースレコード
- ゾーンの情報を記述
リソースレコード
- SOAレコード
- Start of Authority
- 管理情報。ゾーンに関する情報を記述する
- 必ずリソースレコードの最初に記載する
- 書式
<ドメイン> IN SOA <ネームサーバのFQDN> <管理者のメールアドレス> (各更新時間に関する秒数を定義)
- @はドメイン名を表すのでメールアドレス内で使用できない
- 最後にピリオドがないと、ドメイン名が末尾に付与されてしまう
- NSレコード
- Name Server
- ゾーンを管理するDNSサーバ
- MXレコード
- Mail Exchange
- メールサーバを記述
ドメイン [TTL] IN MX 優先度 サーバ名
- 優先度は値が小さいほど高い
- Aレコード
- ホスト名に対応するIPアドレスを定義
- 委任先のAレコードをグルーレコードと呼ぶ
- AAAAレコード
- CNAMEレコード
- Canonical Name
- ある名前に対する別名を記入する
- PTRレコード
- Pointer
- IPアドレスに対応する名前(FQDN)を記述
- 主に逆引き用IPアドレスに対応するホスト名を定義する
コマンド
- named-checkzoneコマンド
- ゾーンファイルの構文チェック、整合性チェックを行う
- named-compilezoneコマンド
- 内容をテキスト形式に変換
- BIND9.9からスレーブサーバのゾーンファイルがバイナリファイルになっているため
named-compilezone [-f 変換前ファイル形式] [-F 変換後ファイル形式] -o 出力ファイル ゾーン名 ゾーンファイル名
DNSサーバのセキュリティ
一般的なセキュリティオプション
- ゾーン転送の制限
- スレーブにだけゾーン情報を転送できるように制限する
- DNS問い合わせの制限
- 問い合わせの範囲を自分の管理するゾーンに制限
- 再帰的な問い合わせを禁止することで、不正なキャッシュデータをDNSサーバに送りつけるキャッシュ汚染攻撃を回避できる
- バージョン番号の隠蔽
- バージョンでセキュリティホール突かれる可能性があるので
- root以外によるnamedの実行
- 侵入されても被害を最小限に抑えることができる
- 被害を限定するためにchrootを利用する方法がある
- あるプロセスのルートディレクトリを指定したディレクトリに変更
chroot
- あるプロセスのルートディレクトリを、指定したディレクトリに変更する動作
- BINDを不正に操作されても変更後のディレクトリ内しか操作できないため、被害を抑えることができる
- namedのオプション
-t ディレクトリ
namedのルートディレクトリとするディレクトリを指定-u ユーザ名
namedの実行ユーザを指定-g グループ名
namedの実行グループを指定
DNSSEC
- DNS Security
- ゾーン情報に公開鍵暗号方式の電子署名を行い、ゾーン情報が改ざんされていないこと、DNS応答が正当な管理者によって行われたものであることを保証
- DNSサーバ、クライアントの双方が対応している必要がある
- dnssec-keygenコマンドで鍵を生成
TSIG
- Transaction Signatures。トランザクション署名
- マスターDNSサーバとスレーブDNSサーバで共有秘密鍵を使ってDNSサーバの偽装やなりすましを防ぐ仕組み
- ゾーン転送、rndcコマンドなどの送信元のなりすましを防ぐ
- マスターDNSで共通鍵を使ってゾーンデータに署名し、スレーブDNSサーバでそれを検証する
- クライアントとサーバの時刻が一致している必要がある。DNSメッセージ全体の署名に時刻情報を使うため
- 共通鍵の作成はdnssec-keygenコマンドを使用
- 鍵の設定
- マスタースレーブの/etc/named.confのkeyステートメントに共通鍵を設定
- serverステートメントにIPアドレスと共通鍵名を設定
- 不正なクライアントからのrndcコマンドの操作防止
/etc/named.confのkeyステートメント 設定例
key "example.com" {
algorithm hmac-md5;
secret "xxxxx";
};
DANE
- DNS-based Authentication of Named Entites
- 認証情報をDNSベースでやりとりするための仕組み
- X509の証明書とDNSの紐付けで認証を行う
dnssec-keygenコマンド
- DNSSEC, TSIGで用いる鍵生成はdnssec-keygeコマンドを使う
- 書式
dnssec-keygen [オプション] 鍵の名前(※DNSSECの場合はZone名)
- オプション
-a
アルゴリズム-b
鍵長ビット数-n nametype
鍵のオーナータイプを指定。公開鍵の生成にはZONE
, 共通鍵の生成にはHOST
を指定
dnssec-signzoneコマンド
- ゾーンファイルへの署名を行うコマンド
- 正当なDNSサーバからのゾーン情報であることを認証し、ゾーン情報が改ざんされていないことを保証する