Compnet

仕事とか遊びとか、日々折々

2016-04-18(月)

Zabbix 3.0 にクライアント認証を追加

Posted by Nakane, R. in technical   

Note

この記事は旧ブログから移行した記事です。 元記事は ここ にあります。

レンタル サーバーに Zabbix をインストールして使っているユーザーはかなり多いと思います。 筆者も他聞に漏れず、レンタル サーバーに Zabbix をインストールして使っています。 正確にはレンタル サーバーというよりも、レンタル VPS サーバーですが。

Zabbix にはログイン フォームがあり、ここにユーザー名と正しいパスワードを入力して初めて使えます。 ログイン フォームは Web アプリケーションにとっては基本ですが、ネットワーク越しにユーザー名とパスワードの組を送ることになるのが不安です。 そこで SSL 化 (HTTPS ) して、ログイン フォームの前後だけでも通信路を暗号化して、ユーザー名とパスワードが平文のまま送られないようにしたりもします。 しかし、SSL で通信路を暗号化しても総当たり攻撃には無力なままです。

そこで、クライアント証明書によるクライアント認証で、Zabbix の不正利用を防ごうと思います。

Locked Zabbix

クライアント証明書によるクライアント認証を行うには、予め SSL 化 (HTTPS) しておく必要があります。 SSH 化 (HTTPS) する方法の説明は省略します。 また、クライアント認証の設定方法も、Web サーバー アプリケーション毎に異なりますが、ここでは Apache を対象にします。

クライアントに配布するクライアント証明書を発行する認証局を独自には建ることはせずに、StartSSL で発行したものを使うことにします。 StartSSL でのクライアント証明書の発行方法の説明も、思い切って省略します。

クライアント認証に必要な証明書

クライアント証明書によるクライアント認証を Apache で行う際には、クライアント証明書を発行した認証局の証明書、俗に言う CA 証明書が必要です。 先に書いたようにクライアント証明書は StartSSL で発行したものを使うので、StartSSL の CA 証明書が必要になります。 なお、他の認証局の場合は分かりませんが、StartSSL では Web サーバーの SSL 化 (HTTPS) で使う CA 証明書と、クライアント認証に使う CA 証明書は別なので注意してください。

StartSSL の CA 証明書は https://startssl.com/root からダウンロードできます。 ダウンロードする証明書は、StartSSL 自身の証明書である StartCOM Certification Authority 証明書とクライアント証明書の署名の証明書の StartCom Class 1 Client CA のふたつです。 https://startssl.com/root の Web ページで、「Root CA Certificates」タブの「Root 1 - StartCOM Certification Authority」セクションの「cr.cert (pem)」のリンクと、「Intermediate CA Certificates」タブの「Client Certifacates」セクションの「(1)Class 1 Client Certificate」の「StartCOM Class 1 Client CA (pem)」のリンクからダウンロードできます。

ファイル形式に pem と der の2種類がありますが、どちらも pem 形式をダウンロードします。 ダウンロードしたファイル名は ca.crt と sca.client1.ca.pem になるはずです。

ふたつの証明書ファイルをダウンロードしたら、sca.client1.ca.pem ファイルを前に、ca.crt ファイルが後ろになるように、ふたつのファイルを結合します。 結合後のファイル名は startssl.client1.ca.pem にでもします。

cat sca.client1.ca.pem ca.crt >startssl.client1.ca.pem
sudo mkdir -p /etc/apache2/certs
sudo mv startssl.client1.ca.pem /etc/apache2/certs

そして、Apache から参照しやすいように、結合したファイルを /etc/apache2/certs ディレクトリに置きます。

ダウンロードから /etc/apache2/certs ディレクトリに置くまでを一気に行うには、以下のようなコマンドを使います。

sudo mkdir -p /etc/apache2/certs/
(wget -O- https://startssl.com/certs/sca.client1.crt; wget -O- https://startssl.com/certs/ca.crt) | sudo tee /etc/apache2/certs/startssl.client1.ca.pem >/dev/null</pre></div>

https://startssl.com/certs/sca.client1.crt は「Intermediate CA Certificates」タブの「Client Certifacates」セクションの「(1)Class 1 Client Certificate」の「StartCOM Class 1 Client CA (pem)」のリンクが、 https://startssl.com/certs/ca.crt は、「Root CA Certificates」タブの「Root 1 - StartCOM Certification Authority」セクションの「cr.cert (pem)」のリンクが差す URL です。

念のために、作成した startssl.client1.ca.pem ファイルのアクセス権を調整します。

sudo chown root. /etc/apache2/certs/startssl.client1.ca.pem
sudo chmod u=rw,go=r /etc/apache2/certs/startssl.client1.ca.pem

Apache の設定

クライアントに配布するクライアント証明書を発行する認証局の証明書が用意できたので、Apache でクライアント証明書を要求するように設定します。

Apache にクライアント証明書を要求させるには、以下のディレクティブを追加します。

SSLCACertificateFile certs/startssl.client1.ca.pem
SSLVerifyDepth 2
SSLVerifyClient require

SSLCACertificateFile ディレクティブは Server または Host のレベルに、SSLVerifyDepth と SSLVerifyClient と SSLVerifyDepth のふたつのディレクティブは Server、Host、Directory の任意のレベルに追加します。

例えば以下のように設定します。

<VirtualHost _default_:443>
      :
    SSLCACertificateFile certs/startssl.client1.ca.pem
      :
    <Directory /usr/share/zabbix>
          :
        SSLVerifyDepth  2
        SSLVerifyClient require
          :
    </Directory>
      :
</VirtualHost>

これで Apache を再起動するか、設定を再読み込みさせれば、クライアント証明書によるクライアント認証されるようになります。 ただし、クライアント認証できるとはいえ、このままでは StartSSL で発行したクライアント証明書のすべてが承認されてしまいます。 つまり StartSSL の利用ユーザー全員がこのサイトにアクセスできるということです。 クライアント認証で承認された後に、Zabbix のフォームでログインする必要があるので、そこまでの心配はありませんが、クライアント認証を設定した意味合いとしては弱いとしか言い様がありません。

そこで次は、クライアント認証で承認される人を制限するとともに、Zabbix のフォームを省略してクライアント認証だけでログインできるようにします。

....この文章は、表題に Zabbix と書いた割にはほとんど Zabbix と関係無い気がする。

Comments