

DNSVizは、ドメインネームシステム(DNS)の挙動と、そのセキュリティ拡張機能(DNSSEC)を分析・可視化するためのツールスイートです。このツールスイートは、https://dnsviz.net/ で提供されているWebベースの分析を支えています。
DNSVizは、Debian、Ubuntu、Fedora、Gentoo、FreeBSDなどの主要なオペレーティングシステムのパッケージリポジトリで入手できます。また、Red Hat Enterprise Linux (RHEL) 8および9、CentOS 8および9向けのExtra Packages for Linux (EPEL) リポジトリでも提供されています。(RHELおよびCentOSへのインストールについては、注記を参照してください。)いずれの場合も、そのオペレーティングシステムで標準的なパッケージインストールコマンドを使用してインストールできます。DNSVizは、HomebrewまたはMacPortsを使用してMac OS Xにもインストールできます。
このセクションの残りでは、依存関係のリスト、仮想環境へのインストール、およびRHEL 8または9、CentOS Stream 8または9へのインストールに関する注記など、他のインストール方法について説明します。
Dockerコンテナでの実行手順については、このドキュメントの後半でも説明しています。
Python (2.7, 3.5 - 3.12) - https://www.python.org/ (Python 2.7のサポートは将来のリリースで削除される予定です。)
dnspython (1.13.0以降) - https://www.dnspython.org/
pygraphviz (1.3以降) - https://pygraphviz.github.io/
cryptography (36.0.0以降) - https://cryptography.io/
上記に記載されたソフトウェアの古いバージョンでもDNSVizで動作する可能性がありますが、サポート対象外です。例えば、cryptographyの2.6以前のバージョンでも動作するようです。また、DNSViz自体は依然としてPython 2.7で動作しますが、ソフトウェア依存関係の一部のバージョンはPython 2.7のサポートを終了していることにも注意してください:pygraphviz 1.6とdnspython 2.0.0はPython 2.7のサポートを終了しました。
OpenSSL GOST Engine - https://github.com/gost-engine/engine
OpenSSL 1.1.0以降では、アルゴリズム12(GOST R 34.10-2001)によるDNSSEC署名の検証や、タイプ3(GOST R 34.11-94)のダイジェストを作成するためにOpenSSL GOST Engineが必要です。GOSTサポートにはM2Cryptoも必要です。
M2Crypto - https://gitlab.com/m2crypto/m2crypto
DNSVizの暗号化サポートのほぼすべてはcryptography Pythonモジュールで処理されますが、アルゴリズム12(GOST R 34.10-2001)およびダイジェストタイプ3(GOST R 34.11-94)のサポートにはOpenSSL GOST Engineが必要です。このエンジンは動的にロードする必要があり、cryptographyにはそのサポートがありません。したがって、アルゴリズム12またはダイジェストタイプ3をサポートする必要がある場合は、M2Cryptoもインストールする必要があります。
ISC BIND - https://www.isc.org/bind/
コマンドラインでゾーンファイルや代替委任情報を指定して(すなわち、-N、-x、または-Dを使用して)、デプロイ前テストにDNSVizを使用する場合、1つ以上のゾーンを提供するためにnamed(8)が呼び出されます。ISC BINDが必要なのはこの場合のみであり、named(8)は(サーバーとして)実行されている必要はありません。
DebianのデフォルトのAppArmorポリシーは、デプロイ前テストのためにDNSVizからnamed(8)を呼び出す際に問題を引き起こすことが知られています。AppArmorは次のコマンドでnamed(8)に対して一時的に無効にできます:
$ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.named
デプロイ前テストが完了したら、次のコマンドでnamed(8)のAppArmorを再び有効にできます:
$ sudo apparmor_parser /etc/apparmor.d/usr.sbin.named
DNSVizを仮想環境にインストールするには、最初に仮想環境を作成して有効化し、依存関係をインストールします:
$ virtualenv ~/myenv
$ source ~/myenv/bin/activate
(myenv) $ pip install -r requirements.txt
これによりPythonパッケージである依存関係がインストールされますが、これらのパッケージの一部には自動的にインストールされない非Python依存関係(pygraphvizに必要なGraphvizや、cryptographyに必要なOpenSSLなど)があることに注意してください。
次に、Python Package Index (PyPI)からDNSVizをダウンロードしてインストールします:
(myenv) $ pip install dnsviz
または、ダウンロードまたはクローンしたDNSVizのコピーからローカルにインストールします:
(myenv) $ pip install .
DNSVizは、EPELリポジトリからRHEL 8または9、CentOS Stream 8または9にインストールできます。このセクションの手順に従ってEPELを有効にしてください。
RHEL 8および9のみ:次のコマンドでCodeReady Linux BuilderとExtra Packages for Enterprise Linux (EPEL)を有効にします:
$ sudo subscription-manager repos --enable codeready-builder-for-rhel-$(vers)-$(arch)-rpms
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(vers).noarch.rpm
($(vers)はバージョン(8または9)を指し、$(arch)はアーキテクチャ(例:x86_64またはaarch64)を指します。不明な場合は、sudo subscription-manager repos --listを実行して利用可能なオプションを確認してください。)
CentOS Stream 8または9のみ:次のコマンドでPowerToolsまたはCodeReady Linux BuilderとEPELを有効にします:
$ sudo dnf config-manager --set-enabled $(tool)
$ sudo dnf install epel-release
($(tool)はツールを指し、CentOS Stream 8の場合はpowertools、CentOS Stream 9の場合はcrbです。)
RHEL 8または9 および CentOS Stream 8または9の両方で、EPELが有効になったら、dnfを使用してDNSVizをインストールします:
$ sudo dnf install dnsviz
DNSVizは、dnsvizコマンドラインユーティリティを使用して呼び出します。dnsviz自体には、probe、grok、graph、print、queryという複数のサブコマンドがあります。より詳細なドキュメントと使用方法については、各サブコマンドに関連するマニュアルページ("dnsviz-<サブコマンド> (1)"の形式、例:"man dnsviz-probe")を参照してください。
dnsviz probeは、1つ以上のドメイン名を入力として受け取り、再帰的(デフォルト)または権威DNSサーバーのいずれかに一連のクエリを実行し、その結果はJSON形式にシリアライズされます。
設定済みのDNSリゾルバ(つまり、/etc/resolv.conf内)を使用してドメイン名example.comを分析し、クエリと応答を"example.com.json"というファイルに保存します:
$ dnsviz probe example.com > example.com.json
同じ操作:
$ dnsviz probe -o example.com.json example.com
権威サーバーに直接クエリを実行してドメイン名example.comを分析します:
$ dnsviz probe -A -o example.com.json example.com
IANAルートサーバーからのリファラルを通じてサーバーを学習するのではなく、明示的に定義された権威サーバーにクエリを実行してドメイン名example.comを分析します:
$ dnsviz probe -A \
-x example.com:a.iana-servers.org=199.43.132.53,a.iana-servers.org=[2001:500:8c::53] \
-x example.com:b.iana-servers.org=199.43.133.53,b.iana-servers.org=[2001:500:8d::53] \
-o example.com.json example.com
同じですが、dnsviz probeに名前を解決させます:
$ dnsviz probe -A \
-x example.com:a.iana-servers.org,b.iana-servers.org \
-o example.com.json example.com
ルートから開始して、権威サーバーにクエリを実行し委任を辿ることにより、ドメイン名example.comとそのすべての祖先を分析します:
$ dnsviz probe -A -a . -o example.com.json example.com
明示的な再帰リゾルバを使用して複数の名前を並列に(4スレッドで)分析します(192.0.1.2と2001:db8::1を正当なリゾルバアドレスに置き換えてください):
$ dnsviz probe -s 192.0.2.1,[2001:db8::1] -t 4 -o multiple.json \
example.com sandia.gov verisignlabs.com dnsviz.net
dnsviz grokは、JSON形式のシリアライズされたクエリ結果(つまり、dnsviz probeの出力)を入力として受け取り、入力内の対応するコンテンツに基づいて指定されたドメイン名を評価します。出力もJSON形式にシリアライズされます。
dnsviz probeによって生成されたクエリ/応答出力を処理し、シリアライズされた結果を"example.com-chk.json"というファイルに保存します:
$ dnsviz grok < example.com.json > example.com-chk.json
同じ操作:
$ dnsviz grok -r example.com.json -o example.com-chk.json example.com
情報レベルの情報のみを表示します:説明、ステータス、警告、エラー:
$ dnsviz grok -l info -r example.com.json -o example.com-chk.json
関連する警告またはエラーがある場合にのみ説明を表示します:
$ dnsviz grok -l warning -r example.com.json -o example.com-chk.json
関連するエラーがある場合にのみ説明を表示します:
$ dnsviz grok -l error -r example.com.json -o example.com-chk.json
ルートキーをDNSSECトラストアンカーとして使用し、応答の認証ステータスも示します:
$ dig +noall +answer . dnskey | awk '$5 % 2 { print $0 }' > tk.txt
$ dnsviz grok -l info -t tk.txt -r example.com.json -o example.com-chk.json
dnsviz probeの出力を直接dnsviz grokにパイプします:
$ dnsviz probe example.com | \
dnsviz grok -l info -o example.com-chk.json
同じ操作ですが、途中で生の出力を(再利用のために)保存します:
$ dnsviz probe example.com | tee example.com.json | \
dnsviz grok -l info -o example.com-chk.json
一度に複数の名前をエラーレベルで評価します:
$ dnsviz grok -l error -r multiple.json -o example.com-chk.json
dnsviz graphは、JSON形式のシリアライズされたクエリ結果(つまり、dnsviz probeの出力)を入力として受け取り、入力内の対応するコンテンツに基づいて指定されたドメイン名を評価します。出力は、渡されたオプションに応じて、画像ファイル、dot(有向グラフ)ファイル、またはHTMLファイルになります。
dnsviz probeによって生成されたクエリ/応答出力を処理し、結果を視覚的に表すグラフを"example.com.png"というpngファイルに生成します。
$ dnsviz graph -Tpng < example.com.json > example.com.png
同じ操作:
$ dnsviz graph -Tpng -o example.com.png example.com < example.com.json
同じ操作ですが、対話型HTML形式を生成します:"example.com.html"というファイルに対話型HTML出力:
$ dnsviz graph -Thtml < example.com.json > example.com.html
同じ操作(ファイル名はドメイン名と出力形式から生成されます):
$ dnsviz graph -Thtml -O -r example.com.json
代替のDNSSECトラストアンカーを使用します:
$ dig +noall +answer example.com dnskey | awk '$5 % 2 { print $0 }' > tk.txt
$ dnsviz graph -Thtml -O -r example.com.json -t tk.txt
dnsviz probeの出力を直接dnsviz graphにパイプします:
$ dnsviz probe example.com | \
dnsviz graph -Thtml -O