UnboundのResponse Policy ZoneによるDNS Firewall
コンテンツ
UnboundのResponse Policy Zone (RPZ)機能を使い DNS firewall を実現した際のメモ。
概要
DNS firewallはマルウェア配布サイトやフィッシングサイトへの接続を防ぐために特定のドメイン名に対する問い合わせを無効にする機能のこと。
Unboundは設定ファイル unbound.conf で local-zones や local-data を使うことでDNS firewall相当の機能を実現できたが、DNS firewall を実現する一般的な方法としてResponse Policy Zone (RPZ) が提案されている(https://tools.ietf.org/html/draft-vixie-dnsop-dns-rpz-00)。このRPZがunboundでもversion 1.10から使用できるようになった(https://nlnetlabs.nl/news/2020/Feb/20/unbound-1.10.0-released/)。
通常のDNSレコードと同様にzoneファイルを作成しドメイン毎のアクション(NXDOMAINを返すなど)を定義する。ブロックする場合は NXDOMAIN を返すように CNAME . を設定する。
| Action | RR type and RDATA |
|---|---|
| NXDOMAIN | CNAME . |
| NODATA | CNAME *. |
| PASSTHRU | CNAME rpz-passthru. |
| DROP | CNAME rpz-drop. |
例えば example.com をブロックする場合は次のようなゾーンファイル /var/unbound/db/rpz.local を用意する。
|
|
そしてこれを次のような設定ファイルで読み込む。
|
|
環境
- Unbound 1.11.0
- OpenBSD 6.8
RPZの動作確認
ログ出力 rpz-log: yes とRPZアクションの無効化 rpz-action-override: disabled を組合せることでログにRPZログを記録できる。設定 rpz-log-name を追加することで、どのRPZにマッチしたかの情報を残すことができる。
|
|
統計値
RPZの各アクション毎の実行回数が unbound-control stats, unbound-control stats_noreset で確認できる。設定で extended-statics を有効にする必要がある。
|
|
公開されている RPZ 用の Domain リスト
自分でzonefileをメンテナンスするのは手間がかかる。以下のようなブロック用のドメインリストを提供しているサイトを活用するのが現実的だろう。しかし、どのリストが良いか(使うべきか)不明である。判断基準がない。
- https://github.com/StevenBlack/hosts
- https://280blocker.net/download/
- https://urlhaus.abuse.ch/downloads/rpz/
- https://github.com/EnergizedProtection/block
ひとまず日本用情報が含まれていそうな280blocker.netとRPZ形式のzone fileを複数提供しているEnergizedProtectionを利用した(ちなみにEnergizedProtectionは280blockerも含んでいるような記述が実際のリストは空となっている https://block.energized.pro/assets/sources/filter/280blocker.txt)。
280blocker.net
提供されているのは単純なドメインのリストなので RPZ 用の zone file に変換する必要がある。例えば次のようなコマンドで変換できる。
|
|
コマンド tr で非ASCII文字と改行コードCRを削除している。このようにして作成したzonefileを /var/unbound/db/rpz.280blocker として保存して次のような設定を unbound に加える。
|
|
上の設定では実際に NXDOMAIN は返さずRPZにマッチしたログのみを記録する。ログを見て問題なさそうであれば rpz-action-override: disabled を削除する。
EnergizedProtection
RPZ形式のファイルが提供されているので設定ファイルの url で指定すれば良い。提供されているリストのうちメモリ使用量が45MB程度となるbluGoのリストを選択。より大きいリストにするとzonefileの読み込みに時間がかかる。
| Package | unbound RES | text size |
|---|---|---|
| unified | 972M | 43M |
| basic | 565M | 25M |
| blu | 217M | 9.5 |
| bluGo | 134M | 5.2M |
| Spark | 45M | 1.1M |
|
|
さきほどと同様に上の設定では実際に NXDOMAIN は返さずRPZにマッチしたログのみを記録する。ログを見て問題なさそうであれば rpz-action-override: disabled を削除する。
クライアント毎の設定
Unboundのtag機能である define-tag と tags を組合せることでクライアント毎に特定のRPZを有効にできる。
|
|
しかし、クライアント側の IPv6 は変化するのでこれは難しい。サブネット毎ぐらいであれば実現可能であるが、現在のネットワークは複数のサブネットを利用するような設計になっていないのでこれも難しい。DNSサーバのアドレスをIPv4のみ配布すれば良いがそれだとIPv6のみの端末が名前解決できなくなってしまう。IPv6のネットワークでクライアントアドレス毎に動作を変えるというは可能かもしれないがIPv4と比較すると有効性は小さいのかもしれない。
参考
作成者 Toru Mano
最終更新時刻 2023-01-01 (c70d5a1)