Unboundを使ってみよう

こんにちは。サイオステクノロジー 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:
;; ->>HEADER

A レコードに加えて 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 IN

DNSSEC の無効化

DNSSEC を利用する際は、必要な設定情報はすべてパッケージに同梱されているため、特に設定を変更する必要はありませんが、DNSSEC を無効にしたい場合は、unbound.conf にて下記の設定を変更して unbound を再起動してください。

val-permissive-mode: no
 ↓「no」を「yes」に変更
val-permissive-mode: yes

「yes」にすることで、セキュリティチェックが失敗したメッセージは、SERVFAIL ではなくクライアントに返されます。それでもセキュリティチェックが実行され、メッセージが安全であると判断された場合、AD ビットが返信される可能性があります。

以上で Unbound のインストールと DNSSEC の使用を説明しました。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です