OpenVASでLets EncryptのSSL証明書を使うには


OpenVAS Managerのユーザー認証やWebインターフェイスへとhttps://で接続する場合にはデフォルトではOpenVMSのインストール時に生成される自己証明局(CA)やSSL証明書が使われるため、ブラウザによっては接続を拒否されてしまう場合もあるようです。
そこでSSL証明書をLet's Encryptで取得した正常なSSL証明書に入れ替えようと思ったのですが意外とネット上にも情報が少なく、いろいろと調べてみたのでその覚書です。

先ずはOpenVASの設定ファイルにSSL証明書の場所が記載されていないかを調べてみました。
すると、 /etc/openvas/openvassd.conf の中でSSL証明書の場所が設定されているのを発見したので、これをLet's Encryptで取得したSSL証明書と入れ替えてOpenVASのWebインターフェイスGreenbone Security Assistant(gsad)を再起動してみました。

/etc/openvas/openvassd.confの証明書設定と思わしき箇所
/etc/openvas/openvassd.conf
# Certificates
#
cert_file=/var/lib/openvas/CA/servercert.pem
key_file=/var/lib/openvas/private/CA/serverkey.pem
ca_file=/var/lib/openvas/CA/cacert.pem

残念ながらgsadではOpenVASの設定ファイルは読み込んでいないらしく、使われている証明書は以前のままの様です。
※実はこの設定はOpenVASをインストールした時に作ったOpenVAS ManagerとOpenVAS Scannerとの通信に使うSSL証明書のためのもので、これはいじってはいけないものだったようです…

/etc/openvas/gsad_log.confというgsadのログファイルに関する設定ファイルがあるので、もしかしたら/etc/openvas/gsad.confとかに設定できるのだろうか?とも思ったのですが、どこを探してもそんな情報はありません。

仕方がないのでgsadの起動スクリプト /etc/rc.d/init.d/gsad を読んでみたら、どうやらこのスクリプト中で直接パラメータをgsadに渡すしか手段は無いようです。 (環境変数の設定は /etc/sysconfig/gsad の中で行なうと良さそうです)

/etc/sysconfig/gsad での設定例
/etc/sysconfig/gsad
GSA_SSL_PRIVATE_KEY=/etc/letsencrypt/live/openvas.example.com/privkey.pem
GSA_SSL_CERTIFICATE=/etc/letsencrypt/live/openvas.example.com/fullchain.pem

※残念ながら中間証明書を指定することができないので、Let's Encrypt発行の証明書を使った場合、ブラウザなどでLet's Encryptがroot認証局としてインストールされていないブラウザではエラーになってしまいます。 (現在、解決策を模索中…)
証明書と中間証明書が含まれるファイルfullchain.pemを証明書ファイルとして指定すればこの問題は解決出来ることがわかりました!

CentOS 7の場合

CentOS 7の場合、サービスを起動するためのスクリプトは/etc/systemd/system/multi-user.target.wants/gsad.serviceとなりますが、一応このスクリプトの中でCentOS 6などと同様に/etc/sysconfig/gsadが読み込まれているものの、SSL証明書に関する設定GSA_SSL_PRIVATE_KEYとGSA_SSL_CERTIFICATEがgsadへと渡されている様子がないので、SSL証明書を変更したい場合には/etc/systemd/system/multi-user.target.wants/gsad.serviceに若干の修正を加えなければなりません。

オリジナルの/etc/systemd/system/multi-user.target.wants/gsad.service

/etc/systemd/system/multi-user.target.wants/gsad.service
[Unit]
Description=OpenVAS Manager
After=network.target
After=openvas-scanner.service
After=openvas-manager.service

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/gsad
ExecStart=/usr/sbin/gsad --listen $GSA_ADDRESS --port $GSA_PORT --mlisten $MANAGER_ADDRESS --mport $MANAGER_PORT $OPTIONS
Restart=always
RestartSec=1
User=root
Group=root
TimeoutSec=1200

[Install]
WantedBy=multi-user.target

/etc/sysconfig/gsadで設定されたGSA_SSL_PRIVATE_KEYとGSA_SSL_CERTIFICATEをgsadに引き渡す様に変更を加える

/etc/systemd/system/multi-user.target.wants/gsad.service
[Unit]
Description=OpenVAS Manager
After=network.target
After=openvas-scanner.service
After=openvas-manager.service

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/gsad
ExecStart=/usr/sbin/gsad --listen $GSA_ADDRESS --port $GSA_PORT --mlisten $MANAGER_ADDRESS --mport $MANAGER_PORT $OPTIONS --ssl-private-key $GSA_SSL_PRIVATE_KEY --ssl-certificate $GSA_SSL_CERTIFICATE
Restart=always
RestartSec=1
User=root
Group=root
TimeoutSec=1200

[Install]
WantedBy=multi-user.target

/etc/systemd/system/multi-user.target.wants/gsad.serviceに変更を加えた後はsystemdのデーモンをリロードしないと設定が反映されないのでご注意を!

# systemctl daemon-reload

参考資料

/etc/rc.d/init.d/gsad で設定可能な環境変数とその内容
環境変数 内容
GSA_ADDRESS gsadで待機するアドレスを指定します
GSA_PORT gsadで待機するポート番号を指定します
GSA_SSL_PRIVATE_KEY SSL証明書のプライベートキーファイル(pem)の場所を指定します
GSA_SSL_CERTIFICATE SSL証明書(pem)の場所を指定します
GSA_REDIRECT HTTPをHTTPSにリダイレクトします
GSA_REDIRECT_PORT このポート番号<ポート番号>からHTTPにリダイレクトします。
MANAGER_ADDRESS OpenVASマネージャーのIPアドレス。
MANAGER_PORT OpenVASマネージャのポート番号
gsad起動時に指定可能なオプションの一覧
オプション 内容
--drop-privileges 特権を削除します。
-f、--foreground フォアグラウンドで実行します。
--http-only SSLを使用せずにHTTPのみを提供します。
--listen= で待機します。
--mlisten= OpenVASマネージャーのIPアドレス。
-p、--port=<ポート番号> ポート番号に<ポート番号>を使用します。
-m、--mport=<ポート番号> OpenVASマネージャのポート番号に<ポート番号>を使用します。
-r、--rport=<ポート番号> このポート番号<ポート番号>からHTTPにリダイレクトします。
-R、--redirect HTTPをHTTPSにリダイレクトします。 (これはデフォルト動作です)
--no-redirect HTTPをHTTPSにリダイレクトしません。
-v、--verbose 進行状況メッセージを表示します。
-V、--version バージョンを出力して終了します。
-k、--ssl-private-key=<ファイル> <ファイル>をHTTPSの秘密鍵として使用します。
-c、--ssl-certificate=<ファイル> HTTPSの証明書として<ファイル>を使用します。
--dh-params=<ファイル> Diffie-Hellmanパラメータファイル
--do-chroot chrootを実行します。
--secure-cookie 安全なcookieを使用します。 (HTTPS使用時には暗黙で指定されます)
--timeout=<数値> セッションを終了するまでのユーザーアイドル時間。 (分)
--debug-tls=<レベル> <レベル>でTLSデバッグを有効にする
--gnutls-priorities=<文字列> GnuTLS優先順位文字列。
--face=<ディレクトリ> サブディレクトリ<ディレク>のインタフェースファイルを使用します。
--guest-username=<ユーザ名> ゲストユーザのユーザ名。ゲストログインを有効にします。
--guest-password=<パスワード> ゲストユーザのパスワード。デフォルトはゲストのユーザ名です。
--http-frame-opts= X-Frame-Options HTTPヘッダー。デフォルトは「SAMEORIGIN」です。
--http-csp = Content-Security-Policy HTTPヘッダー。デフォルトは "default-src 'self" unsafe-inline "; img-src' self 'blob :; frame-ancestors' self '"です。
--http-guest-chart-frame-opts= X-Frame-OptionsゲストチャートのHTTPヘッダー。デフォルトは ""です。
--http-guest-chart-csp = コンテンツセキュリティポリシーHTTPヘッダー。デフォルトは "default-src 'self" unsafe-inline "; img-src' self 'blob :; frame-ancestors *"になります。