こんにちは。サイオステクノロジー OSS サポート担当何敏欽です。
Unbound は、オープンソースソフトウェアであり、DNSSEC 機能を持つ DNS キャッシュサーバ (リゾルバ) です。CentOS7/RHEL7 では、Unbound をディストリビューションのパッケージとして採用されています。今回は CentOS7/RHEL7 に unbound を導入し、DNSSEC 機能を使用してみます。
インストール
yum で unbound をインストールします。
# yum install unbound 読み込んだプラグイン:langpacks, product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. ... インストール: unbound.x86_64 0:1.6.6-1.el7 完了しました!
Unbound の設定方法 を参考に設定を行ないます。Unbound の設定ファイル (unbound.conf)形式はとてもシンプルで、1つの設定ファイルのみで全ての設定が可能というのも特徴的です。元のファイルに変更を加える前に、設定ファイルの雛形をコピーすることをお勧めします。
# cp /etc/unbound/unbound.conf /etc/unbound/unbound.conf_bk
unbound.conf を編集したら、unbound-checkconf コマンドで unbound の設定ファイルのエラーを検査します。
# unbound-checkconf /etc/unbound/unbound_server.key: No such file or directory [1549247123] unbound-checkconf[7488:0] fatal error: server-key-file: "/etc/unbound/unbound_server.key" does not exist
ドキュメント通りに最小限の設定しか行なっていませんが、エラーが出力されました。/etc/unbound/unbound_server.key が存在しないと言っていますね。
確認します。
# ll /etc/unbound/ 合計 96 drwxr-xr-x. 2 root unbound 30 2月 4 11:35 conf.d -rw-r--r--. 1 root root 435 10月 20 2017 dlv.isc.org.key -rw-r--r--. 1 root root 13026 10月 20 2017 icannbundle.pem drwxr-xr-x. 2 root unbound 29 2月 4 11:35 keys.d drwxr-xr-x. 2 root unbound 36 2月 4 11:35 local.d -rw-r--r--. 1 root root 938 10月 20 2017 root.key -rw-r--r--. 1 root root 34397 2月 4 11:38 unbound.conf -rw-r--r--. 1 root root 34356 2月 4 11:36 unbound.conf_bk
確かに unbound_server.key が存在しないですね。
調べてみたところ、unbound_control.key の生成は unbound-keygen サービスを起動する必要があるようです。なお、unbound_control.key はインストール時またはブート時に自動的に生成されるのではなく、初回 unbound が起動された際に生成されます。今回みたいに unbound を起動せずに、unbound-checkconf コマンドを実行すると当該エラーが出力されます。ということで、とりあえず unbound-keygen を起動します。
# systemctl status unbound-keygen ● unbound-keygen.service - Unbound Control Key And Certificate Generator Loaded: loaded (/usr/lib/systemd/system/unbound-keygen.service; disabled; vendor preset: disabled) Active: inactive (dead) # systemctl start unbound-keygen # systemctl status unbound-keygen ● unbound-keygen.service - Unbound Control Key And Certificate Generator Loaded: loaded (/usr/lib/systemd/system/unbound-keygen.service; disabled; vendor preset: disabled) Active: active (exited) since 月 2019-02-04 11:41:25 JST; 1min 3s ago ...
unbound_server.key が生成されたかを確認します。
# ll /etc/unbound/ 合計 112 drwxr-xr-x. 2 root unbound 30 2月 4 11:35 conf.d -rw-r--r--. 1 root root 435 10月 20 2017 dlv.isc.org.key -rw-r--r--. 1 root root 13026 10月 20 2017 icannbundle.pem drwxr-xr-x. 2 root unbound 29 2月 4 11:35 keys.d drwxr-xr-x. 2 root unbound 36 2月 4 11:35 local.d -rw-r--r--. 1 root root 938 10月 20 2017 root.key -rw-r--r--. 1 root root 34397 2月 4 11:38 unbound.conf -rw-r--r--. 1 root root 34356 2月 4 11:36 unbound.conf_bk -rw-r-----. 1 root unbound 2455 2月 4 11:41 unbound_control.key -rw-r-----. 1 root unbound 1330 2月 4 11:41 unbound_control.pem -rw-r-----. 1 root unbound 2459 2月 4 11:41 unbound_server.key ★生成された -rw-r-----. 1 root unbound 1318 2月 4 11:41 unbound_server.pem
再度 unbound-checkconf を実行したら、「no errors」と出力されました。
# unbound-checkconf unbound-checkconf: no errors in /etc/unbound/unbound.conf
unbound を起動します。
# systemctl start unbound # systemctl enable unbound Created symlink from /etc/systemd/system/multi-user.target.wants/unbound.service to /usr/lib/systemd/system/unbound.service. # systemctl status unbound ● unbound.service - Unbound recursive Domain Name Server Loaded: loaded (/usr/lib/systemd/system/unbound.service; enabled; vendor preset: disabled) Active: active (running) since 月 2019-02-04 11:11:46 JST; 1min 17s ago ...
DNSSEC の使用
DNSSEC は DNS 応答の偽造を防ぐために導入されました。Dnssec-trigger はコンピュータが DNS トラフィックに対して DNSSEC 検証を有効にするためのアプリケーションです。Dnssec-trigger は設定が確立されるまで、ローカルホストを介してテストを実行します。
- Dnssec-trigger は、最初は DHCP によって提供されたリゾルバを使用しようとします。
- Dnssec-trigger は、応答と関連する署名自体を検証します。
- その試みがうまくいかない場合、Unbound は利用可能なフォールバックの方法をいくつか試行します。
- 53ポート経由の発信通信が不可能であることが判明した場合、Unbound は 80ポートを使用して DNS クエリを送信を試みます。
- それでもうまくいかない場合、443 ポートを使用して同じことを試みます。
- 試したフォールバックの方法も失敗する場合、Dnssec-trigger は諦めて、一時的に DNSSEC 検証を無効にするようにユーザに促します。
yum で dnssec-trigger をインストールします。
# yum install dnssec-trigger 読み込んだプラグイン:langpacks, product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. ... インストール: dnssec-trigger.x86_64 0:0.11-22.el7 完了しました!
dnssec-trigger は dnssec-triggerd デーモンとして稼働します。dnssec-triggerd を起動します。
# systemctl start dnssec-triggerd # systemctl enable dnssec-triggerd Created symlink from /etc/systemd/system/dnssec-trigger.service to /usr/lib/systemd/system/dnssec-triggerd.service. Created symlink from /etc/systemd/system/multi-user.target.wants/dnssec-triggerd.service to /usr/lib/systemd/system/dnssec-triggerd.service.
dig コマンドに +dnssec オプションを付与して、DNSSEC が稼働しているかどうかを確認します。
# dig +dnssec whitehouse.gov ; > DiG 9.9.4-NNN-9.9.4-72.el7 > +dnssec whitehouse.gov ;; global options: +cmd ;; Got answer: ;; ->>HEADERA レコードに加えて RRSIG (リソースレコードの電子署名) が返されます。「flags」の行に、「ad」フラグが出力されていれば署名の検証に成功することを意味します。
下記のように「status」が「SERVFAIL」となっている場合、検証に失敗する意味します。
# dig +dnssec dnssec-failed.org ; > DiG 9.9.4-RedHat-9.9.4-72.el7 > +dnssec dnssec-failed.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER同時に /var/log/messages に下記のメッセージが出力されます。
Feb 5 15:56:27 bin7.6 unbound: [5429:2] info: validation failure dnssec-failed.org. A INDNSSEC の無効化
DNSSEC を利用する際は、必要な設定情報はすべてパッケージに同梱されているため、特に設定を変更する必要はありませんが、DNSSEC を無効にしたい場合は、unbound.conf にて下記の設定を変更して unbound を再起動してください。
val-permissive-mode: no ↓「no」を「yes」に変更 val-permissive-mode: yes「yes」にすることで、セキュリティチェックが失敗したメッセージは、SERVFAIL ではなくクライアントに返されます。それでもセキュリティチェックが実行され、メッセージが安全であると判断された場合、AD ビットが返信される可能性があります。
以上で Unbound のインストールと DNSSEC の使用を説明しました。