ICTSC2026 一次予選 問題解説: 問14
問14
状況
社内の権威 DNS サーバ(BIND 9.18)が内部専用ゾーン corp.internal を配信している。外部のセキュリティ研究者から「内部ホスト一覧が取得できる」と報告があり、調査したところ外部 IP 198.51.100.77 からゾーン転送(AXFR)が成功しているログが見つかった。運用者は TSIG を使った認証付き転送を導入したつもりだが、設定ミスが疑われる。
前提条件
- ゾーンのマスターは 10.0.0.10、セカンダリは 10.0.0.11。
- OS:Linux(例:Ubuntu 20.04 / RHEL 8 系)を想定。
- BINDバージョン:BIND 9 系(例:9.18)を想定。
資料
いずれもマスターのログ
/etc/bind/named.conf 抜粋
include "/etc/bind/acl.conf";
include "/etc/bind/extra.conf";
include "/etc/bind/zones.conf";
key "axfr-key" {
algorithm hmac-sha256;
secret "BASE64SECRET==";
};
/etc/bind/acl.conf 抜粋
acl "trusted" {
10.0.0.11;
};
/etc/bind/zones.conf 抜粋
zone "corp.internal" {
type master;
file "zones/db.corp.internal";
allow-transfer { secondary-dns; };
allow-update { none; };
};
/etc/bind/extra.conf 抜粋
acl "secondary-dns" {
any;
};
/var/log/named/queries.log 抜粋
2026-08-12T04:19:58 named[1234]: client 198.51.100.77#54321: transfer of 'corp.internal' from 10.0.0.10#53: AXFR started
2026-08-12T04:19:59 named[1234]: client 198.51.100.77#54321: transfer of 'corp.internal' from 10.0.0.10#53: AXFR completed
2026-08-12T04:20:05 named[1234]: client 10.0.0.11#12345: transfer of 'corp.internal' from 10.0.0.10#53: AXFR started (TSIG verified)
2026-08-12T04:20:06 named[1234]: client 10.0.0.11#12345: transfer of 'corp.internal' from 10.0.0.10#53: AXFR completed
設問
以下の三点について答えよ。
小問(1)
外部 198.51.100.77 からの AXFR が許可された理由について説明しなさい。
正解(想定解答)
(1)外部からの AXFR が成功した直接の原因は、extra.conf に定義された ACL「secondary-dns」が any になっていたためである。
小問(2)
TSIG が定義されているにもかかわらず外部転送で TSIG が使われなかった理由を、10.0.0.11 の転送で "TSIG verified" が出ている点と対比して説明しなさい。
正解(想定解答)
(2)TSIG キーは named.conf に定義されていたが、ゾーン設定のallow-transferにkey設定が行われていなかった。
そのため転送先は接続元IPアドレスのみで判断され、TSIGを持たないクライアントからもAXFRが実行可能であった。
小問(3)
外部転送でTSIG を使用するために、「named.conf」を更新します。この場合、「named.conf」に追記する内容を示しなさい。
※内容の説明をするのではなく、実際に想定される追記内容を直接記述すること。
正解(想定解答)
(3)
zone "corp.internal" {
type master;
file "zones/db.corp.internal";
allow-transfer { key axfr-key; };
allow-update { none; };
};
※zones.conf に記載された同じゾーンは削除する。
解説
要点:AXFR許可の原因
- 外部からの AXFR が成功した原因は、allow-transfer が参照している ACL「secondary-dns」が any で定義されていたためである。
acl "secondary-dns" {
any;
};
- zones.conf では以下のように設定されている。
allow-transfer { secondary-dns; };
- その結果、実質 allow-transfer { any; }; と同じ意味になり、外部 IP 198.51.100.77 を含むすべてのホストからの AXFR を許可してしまった。
※問題文では説明のために secret "BASE64SECRET=="; という値を使用しているが、これは実際のTSIGシークレットではなく、伏字化されたサンプル値である。
要点:TSIG の挙動
-
TSIG キーは named.conf に定義されているが、TSIG を必須化する設定(allow-transfer に key を指定する)が行われていなかったため、TSIG を使わない AXFR も許可されてしまった。
-
一方、ログには以下のように 10.0.0.11 からの転送では TSIG verified が出ている。
AXFR started (TSIG verified)
-
これは セカンダリ側(10.0.0.11)が TSIG を使って転送要求を送っているためであり、マスター側は TSIG を受け入れているだけで、TSIG を必須化しているわけではない。
-
したがって、
- セカンダリ(10.0.0.11)は TSIG を使うため TSIG verified が出る
- 外部(198.51.100.77)は TSIG を使わないが、allow-transfer が any のため許可される
という挙動になった。
※問題文に記載されたログはAXFRの流れを説明するために簡略化した例です。実際のBIND9.18ログをそのまま転記したものではありません。
要点:設定ファイルの記述
解答例が複数あるので、以下に示す。
案①:named.conf に zone を追記し zones.conf の既存定義を削除
目的:既存の誤設定(allow-transfer { secondary-dns; } が any を参照)を上書きして TSIG 必須化する。
手順(例)
zones.conf の zone "corp.internal" ブロックを削除またはコメントアウト。
named.conf に以下を追記(key 定義の下、または適切な位置に):
※zones.conf に記載された同じゾーンは削除する。
zone "corp.internal" {
type master;
file "zones/db.corp.internal";
allow-transfer { key axfr-key; };
allow-update { none; };
};
※zones.conf の corp.internal ブロックを次のように編集してもよい
zone "corp.internal" {
type master;
file "zones/db.corp.internal";
allow-transfer { key "axfr-key"; };
allow-update { none; };
};
案②:allow-transfer をセカンダリ IP に限定し、server ブロックで鍵を明示
目的:IP ベースでの制限と TSIG を組み合わせて二重化する。
手順(例)
①zones.conf の zone ブロックを次のように変更:
zone "corp.internal" {
type master;
file "zones/db.corp.internal";
allow-transfer { 10.0.0.11; };
allow-update { none; };
};
②named.conf(または include 先)に server ブロックを追加(任意だが推奨):
server 10.0.0.11 {
keys { axfr-key; };
};
案③:acl "secondary-dns"の定義を修正する
要旨:extra.conf の acl "secondary-dns" を any からセカンダリの IP に変更し、zones.conf の allow-transfer { secondary-dns; }; をそのまま使う。
設定(extra.conf):
acl "secondary-dns" {
10.0.0.11;
};
鍵の使用についても明示する
server 10.0.0.11 {
keys { "axfr-key"; };
};