Zabbix 3.0 にクライアント認証だけでログインする

先の記事で Zabbix 3.0 のフロントエンドにクライアント認証を追加しました。
しかし先の記事にも書いたとおり、これだけではStartSSL でクライアント証明書を発行した人 (StartSSL を利用ユーザーなど) 全員を承認してしまいます。

そこで、クライアント証明書に記述されている情報を使って、特定の証明書の所有者だけを承認するようにします。
さらに、せっかくクライアント認証で個人を特定するのですから、その情報を使って Zabbix にログインまでできるようにもしましょう。

クライアントを特定する情報

クライアント証明書を特定するには、一般に発行元と発行先の情報を使います。
発行元の情報は先の記事の設定により、StartSSL に特定できるので、ここでは発行先で限定するようにします。
発行先は証明書の Subject の記述を見ることで知ることができます。
確認のために StartSSL で取得したクライアント証明書の Subject の記述を見ると、CN と emailAddress のふたつの相対識別名だけが定義されていて、両方に同じメール アドレスが登録されていることが分かります。
当然のことですが、メール  アドレスにはクライアント証明書を取得したときに指定したものが記されています。

つまり、クライアント証明書による認証で個人を特定するには、この Subject に記されたメール アドレスを使えばいいということです。
ここでは Subject の CN の値で特定することにします。

特定のクライアント証明書を認証

Apache で SSLVerifyClient require ディレクティブを有効にすると、クライアント証明書の Subuject の CN の値が環境変数 SSL_CLIENT_S_DN_CN に、emailAddress が SSL_CLIENT_S_DN_Email に設定されるようになります。

クライアント証明書の Subject の CN の値で接続の可否を判定するには、SSLRequire ディレクティブを使い、SSL_CLIENT_S_DN_CN が特定のメールアドレスと一致するかどうかを比較します。
メール アドレスが zabbixuser@example.jp のときに接続を許可し、それ以外のときに拒否したいのなら、 SSLRequire %{SSL_CLIENT_S_DN_CN} =~ /^zabbixuser@example.jp$/i" のようにします。
なお、SSLRequire ディレクティブは Directory レベルに追加します。

example.jp ドメインのメール アドレス全部を許可するなら SSLRequire %{SSL_CLIENT_S_DN_CN} =~ /@example.jp$/i のようにします。
また、example.jp ドメインのメール アドレスでのアクセスは許可するが、retire@example.jp は許可したくないというときは、以下のように設定します。

これらでは、環境変数 SSL_CLIENT_S_DN_CN の他に SSL_CLIENT_VERIFY の値を確認しています。
環境変数 SSL_CLIENT_VERIFY は、SSLCACertificateFile ディレクティブで指定した証明書の認証局発行したクライアント証明書が使われたときにだけ、"SUCCESS" の文字列が設定されます。
冗長ですが、SSL_CLIENT_VERIFY の値を確認することで、不正なアクセスの可能性を少しでも減らすようにしてみました。

このように Apache に設定することで、特定のクライアント証明書に対してだけアクセスを許可できます。
これで、クライアント証明書に記された発行先のメール アドレスで認証・承認する仕組みができたと言えます。

クライアント証明書はたいていの場合、個々人 (メール アドレス毎) に発行されます。
つまり、クライアント証明書の発行先個々人を認証・承認する仕組みができたことになります。

しかし、Zabbix を使うには、クライアント認証、つまり個々人のメール アドレスで認証・承認されたにも関わらず、その後に改めて Zabbix のフォームでログインを行わなくてはなりません。
そこで、クライアント証明書で認証・承認できれば、フォームを使わずそのまま Zabbix にログインできるようにします。

クライアント認証から Zabbix のログインへ

クライアント認証を行っているのは Apache なので、まずは Apache からクライアント認証に使ったメール アドレスを Zabbix に渡すように設定します。

実は Zabbix には、Web サーバーの BASIC 認証で承認されたユーザー名を、そのまま引き継いでログインさせるという機能が実装されています。

つまり、Apache によるクライアント認証で承認に使ったクライアント証明書のメール アドレスを、BASIC 認証のユーザー名と同じように扱うことができればなんとかなりそうでです。

Apache のドキュメントによると、AuthBasicFake ディレクティブが使えば、希望の動作を実現できそうです。
クライアント認証・承認では、クライアント証明書に記述されているメール アドレスを、環境変数 SSL_CLIENT_S_DN_CN で参照しました。
つまり、 AuthBasicFake %SSL_CLIENT_S_DN_CN% とすることで、クライアント認証で承認に使ったクライアント証明書のメール アドレスが BASIC 認証のユーザー名として扱われるようになります。

上のクライアント認証と合わせて、example.jp ドメインのメールアドレスをクライアント認証で承認し、そのメール アドレスをそのまま Zabbix に引き継いでログインさせるには、Apache で以下のような設定をすればいいことになります。

クライアント認証のどの情報が Zabbix のログインに渡されるかを確認するために、クライアント認証するように設定したディレクトリに以下の内容の phpinfo.php ファイル作成して、Web ブラウザで接続、表示します。

本記事ではクライアント認証だけで Zabbix にログインしようとしており、クライアント認証するように設定したディレクトリは /usr/share/zabbix なので、作成するファイルは /usr/share/zabbix/phpinfo.php です。

そして、Web ブラウザで接続する URL は https://<Zabbix のホスト>/zabbix/phpinfo.php になります。
Web ブラウザでこの URL に接続すると、Apache から PHP に渡されるサーバー変数が一覧表示されます。

サーバー変数の一覧

この中にある _SERVER["PHP_AUTH_USER"] が AuthBasicFake ディレクティブで登録されたサーバー変数です。
クライアント認証に利用したクライアント証明書の Subject の CN の値、StartSSL で取得したクライアント証明書なら発行時のメール アドレスになっているはずです。
なお、対応するパスワードである _SERVER["PHP_AUTH_PW"] が password になっていますが、これは AuthBasicFake ディレクティブでパスワードを登録するように指定しなかったためです。
Zabbix で Web サーバーの BASIC 認証をそのまま引き継いでログインするときは、パスワードを利用しませんのでこの値が何であっても問題ありません。

次はクライアント認証で承認したユーザー (メール アドレス) を Zabbix のユーザーとして登録します。
登録するユーザーのエイリアスは、クライアント証明書の Subject の CN の値です。
繰り返しになりますが、この値は StartSSL で取得したクライアント証明書の発行時のメール アドレスであり、 phpinfo(INFO_VARIABLES) で確認したサーバー変数 _SERVER["PHP_AUTH_USER"] の値です。
ユーザーを登録するときに、パスワードは何でも構いません。

クライアント認証するユーザーを追加
クライアント認証するユーザーの追加の官僚
クライアント認証するユーザーを追加

なお、クライアント認証の承認でそのまま Zabbix にログインできるようにすると、Zabbix のログイン フォームは一切使われなくなります。
このため、クライアント証明書の Subject の CN の値になりそうにもない Admin というユーザーは Zabbix にログインできなくなります。
この後で、クライアント認証の承認だけで Zabbix にログインできるようにしますが、その前にクライアント証明書でログイン出来るユーザーの中に Zabbix の特権管理者権限を持つユーザーを一人以上登録してください。

クライアント証明書の Subject の CN の値で Zabbix のユーザーを登録したら、いよいよ Zabbix のログイン フォームをスキップするための設定を行います。
しつこいようですが、くれぐれも Zabbix の特権管理者権限を持つユーザーを登録しておくのを忘れないようにしてください。

設定箇所は、Zabbix の「管理」の「認証」ページにあります。

Zabbix の認証方式を変更
Zabbix の認証方式変更の確認
Zabbix の認証方式変更の完了

この Web ページの「デフォルトの認証」を「HTTP」に変えて「更新」ボタンをクリックするだけです。
「更新」ボタンをクリックした後に表示される確認のメッセージに「OK」をクリックすれば、クライアント認証の後の Zabbix のログイン フォームがスキップされるようになります。

万一、クライアント証明書でログインするユーザーに Zabbix の特権管理者権限を付け忘れてしまったり、クライアント証明書を失効してログインできなくなってしまったときは、Zabbix の設定が保存されているデータベースを直接操作して、「デフォルトの認証」を「Zabbix のデータベース内のユーザー情報」に戻す必要があるかもしれません。
そのときは、Zabbix のデータベースの config テーブルの authentication_type フィールドの値を 0 にしてください。
config テーブルにはレコードが 1 つしか登録されてないはずですが、複数のレコードがあったとしても、全レコードの authentication_type フィールドの値を 0 にして構いません。
例えば、以下のようなコマンドを実行します。

ところで

先にクライアント認証でクライアント証明書を個別に認証するため、Apache に以下のような設定を追加しました。

これはクライアント証明書の Subject の CN の値で承認の可否を判断しています。
その目的は、Zabbix へのログインを許すかどうかにあります。
しかし、クライアント認証後に Zabbix にログインできるのは、クライアント証明書の Subject の CN の値が Zabbix のユーザーとしてとろくされている場合だけです。
ですから、Apache でクライアント証明書の CN を判定するのは冗長と言ってもいいでしょう。

そこで Apache の設定から CN の値の判定を除いた以下を使うのも一案でしょう。

関連記事

  • Zabbix 3.0 にクライアント認証を追加2016.4.18 (月) Zabbix 3.0 にクライアント認証を追加 レンタル サーバーに Zabbix をインストールして使っているユーザーはかなり多いと思います。 筆者も他聞に漏れず、レンタル サーバーに Zabbix をインストールして使っています。正確にはレンタル サーバーというよりも、レンタル VPS […]
  • クライアント認証でログインできるようにしたら Zabbix API がエラーになる2016.4.30 (土) クライアント認証でログインできるようにしたら Zabbix API がエラーになる Zabbix には、外部プログラムから Zabbix が管理する情報を取り扱うための仕組みとして、Zabbix API が存在します。 Zabbix API を使えば、Web UI を使わずにプログラムなどから Zabbix […]
  • Zabbix 3.0 をインストール2016.3.22 (火) Zabbix 3.0 をインストール 1年半毎の LTS リリースの予定から順調に 9ヶ月ほど送れて Zabbix 3.0 LTS がリリースされました。 ちなみに、ポイントリリースになる 2.6 は出ないままに終わりそうです。 もっとも、監視に必要な機能は Zabbix 2.2 […]
  • Web サイトを HTTPS にしてみた2014.8.19 (火) Web サイトを HTTPS にしてみた 前回の記事で、この Web サイトのサーバー証明書を StartSSL で取得する手順を書いた。 この記事ではそれに引き続くかたちで、Web サイトを HTTPS 対応にした手順を控えておく。 Web サーバー […]

コメントを残す