Keycloakを使ってZabbixをSAML認証でログインする
はじめに
ご家庭内や小さなオフィス内などでZabbixやgrafanaなどが動いているけど、ユーザ管理はそれぞれというところも多いのではないでしょうか。私個人の検証環境もそのような問題を抱えていましたので今回は、keycloakというOSSのSSOができるものをZabbixと連携されてみようと思います。
なかなか解説記事がないのですが、以下の記事が丁寧に手順の省略なく書かれていましたので、大変参考になりました。今回はこの記事をベースに日本語化したKeycloakでの用語を使って手順を追ってみます。
この記事で説明すること
- keycloakでzabbix用のクライアントの作成・設定
- zabbixでのSAML認証設定
この記事で説明しないこと
- keycloakの導入
- SSOの説明・SAMLの説明など、基礎知識
- zabbixの導入
前提環境など
本記事では以下の環境が構築済みであることを前提としています。
まずは、Keycloak, Zabbixそれぞれ以下のバージョンでインストール済みです。
- keycloak
- Zabbix Server 5.0.5
アクセスURLはそれぞれ以下と仮定します。
- keycloak: https://keycloak.example.com/
- Zabbix: https://zabbix.example.com
ユーザは同一のメールアドレスを用いてkeycloak、zabbixそれぞれに最低1ユーザ作成済みとします。
設定
Zabbixへの証明書追加
まずは、Zabbix側に証明書を作成します。
# cd /usr/share/zabbix/conf/certs
# openssl req -x509 -sha256 -newkey rsa:2048 -keyout sp.key -out sp.crt -days 3650 -nodes -subj '/CN=my common name'
'/CN=my common name' の部分のmy common nameは適当な名前に変更できます。
Dockerで構築されている場合は、/usr/share/zabbix/conf/certsをホスト側にマウントし、ホスト側で生成しても大丈夫です。公式のdocker-compose.yamlでは最初からマウントするようになっていたとおもいます。
次は、keycloak側の証明書を取得するために、以下のURLにアクセスします。
"https://sso.techrunnr.com/auth/realms/<realmname>/protocol/saml/descriptor"
※realmnameについては、自分で設定したものに置き換えてください。
アクセスするとXMLが表示されます。
表示されたXMLの中に「X509Certificate」という要素がありますので、その中身をコピーします。
コピーしたデータをZabbixサーバに以下のファイルとして、保存します。
# cd /usr/share/zabbix/conf/certs
# vi idp.cert
パーミションを変更します。
# chmod 644 idp.crt
# chmod +x idp.crt
Keycloak側でクライアントを作成する
Keycloakの管理画面にログインし、使用するレルムを選択します。その後、クライアントを開きます。
作成ボタンより、新規クライアントを作成します。
クライアントIDは、任意のIDを指定します。ここでは分かりやすく「zabbix」としています。
クライアントプロトコルはSAMLを指定します。
- Name IDフォーマット:email
- SAMLを処理するマスターURL:"https://zabbix.example.com/zabbix/index_sso.php?acs"
- 有効なリダイレクトURI:"https://zabbix.example.com/*"
- ログアウト・サービスのRedirectバインディングURL:"https://zabbix.example.com/index_sso.php?sls"
マッパーの作成
ZabbixにSAML経由でログインする際に、何をキーとして、KeycloakのユーザとZabbixのユーザを紐付けるかと言う設定が必要になります。(すごい雑な説明です)
クライアント→Zabbixと開くと、マッパーというタブがあるのでそこから設定していきます。作成ボタンより新規作成します。
以下の設定内容で作成します。
- マッパータイプ:User Attribute
- ユーザー属性:zabbixuser
- Friendly Name:zabbixuser
- SAML Attribute Name:zabbixuser
クライアント・スコープの設定
左側のメニューから「クライアント・スコープ」を開きます。一覧にrole_listがあるのでクリックします。マッパーのタブより、role_listを開きます。
Single Role Attributeを有効にします。
ユーザ設定の編集
keycloakに登録済みのユーザでZabbixにログインできるよう設定をします。
管理画面の管理→ユーザとすすみzabbixにログインさせたいユーザを編集します。
属性タブより、キー:zabbixuser・値:メールアドレスとし作成します。
この際のメールアドレスはzabbixに登録したメールアドレスと一致させてください。
これにより、SAMLでログインした際、メールアドレスでユーザの一致を実施させます。
Zabbix Server側の設定
Zabbixの管理画面の管理→認証よりSAML認証の設定を実施します。
設定項目は以下の通りです。
- IdPエンティティID:"https://keycloak.example.com/auth/realms/miler-engineer-club"
- SSOサービスURL:"
https://keycloak.example.com/auth/realms/miler-engineer-club/protocol/saml" - SLOサービスURL:"https://keycloak.example.com/auth/realms/miler-engineer-club/protocol/saml"
- ユーザー名の属性:"zabbixuser"
- SPのエンティティID:"zabbix"
- SPのNameIDフォーマット:"urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
入力完了したら更新をクリックでSAML認証が使えるようになります。
SSOでのログインを試してみる
ここまできたらあとは試すことができます。
Zabbixのログイン画面を開くと通常のログイン画面の下にSSOでのログインリンクが登場します。
「Sign in with Single Sign-On (SAML)」のリンクをクリックするとKeycloakのログイン画面が表示されます。keycloakにログインすると、そのままzabbixにリダイレクトされます。
トラブルシューティング
基本的には、冒頭で記載したURL通りにやればうまくいきますが、私特有の構築環境などの影響でいくつか詰まるところがありましたので、内容と対処方を記載したいと思います。
zabbixをリバースプロキシ環境下で動かしているとredirect urlが不正となる
私の環境では、zabbixをDockerコンテナで動かし、さらに別のDockerコンテナで動かしているリバースプロキシでHTTPSを終端しアクセスできるようにしています。
その際、あくまでZabbix自身はHTTPで稼働しているという扱いなので、SAML認証時のURLパラメータで渡すredirect_urlが"http://zabbix.example.com" のようになります。しかし、keycloakで設定した有効なリダイレクトURLは、"https://zabbix.example.com/*" なので、無効であるとされ認証がうまくいきません。
ここで考えられる最も簡単ですぐ思いつく方法は、keycloakの有効なリダイレクトURLにhttp://zabbix.example.com/* を追加することです。これでSAML認証自体はできるようになりますが、新たな問題が発生します。それは、redirect_urlがHTTPとなり暗号化されていない通信先となり警告が出るようになります。リバースプロキシでHTTPSに必ずリダイレクトされるとはいうものの、この警告はあまり望ましくありません。これを解消するには、ZabbixがSAML認証の際に渡すredirest_urlパラメータをhttpsからはじめるURLにする必要があります。
そのために、zabbixに自己証明書をいれ、リバースプロキシ→Zabbix間もHTTPS通信にすることで解決させました。最初はそれをせずに自身のURLを指定する設定項目がないかを探しましたがありませんでした。幸運にもzabbixは証明書を用意すれば簡単にhttps化できるので助かりました。
おわりに
なんとか、SAML認証でzabbixにログインさせることができました。まだ、解説記事をなぞったレベルなのでSSOの基礎から少しずつ理解を深めたいと思います。
Discussion