みなさん、こんにちは。サイオステクノロジー武井です。今回はShibboleth IdPのログをGrafanaで可視化してみたいと思います。
Shibboleth IdPとは?
Shibbolethとは大学などでよく使われる学術系オープンソースシングルサインオンシステムです。SAML(Security Assertion Markup Language)をベースに、ユーザーの認証情報や属性を他のシステムやサービスに提供します。大学や研究機関が参加する学術フェデレーションにおいて、ユーザーが異なるサービスやアプリケーションにシングルサインオンでアクセスできるようにする役割を果たします。これにより、ユーザーは一度ログインするだけで、フェデレーション内の複数のサービスを利用できます。
Shibboleth IdPのログの可視化とは?
Shibboleth IdPは、若干管理系の機能が弱いところがあります。GUIによる操作が行えない、設定ファイルはテキストベース、APIが提供されていないなどです。ログもサーバーにログインして直接して見るしかないのですが、やはりこれだと運用面でちょっと不便です。
そこで今回は、そんなShibboleth IdPの弱点を補うべく、GrafanaによってログをWebベースで閲覧したり、高度な検索ができるようにしたいとおもいます。
Grafanaとは?
Grafanaは、時系列データの視覚化ツールです。システムの監視やメトリクスのトラッキングを行い、それらのデータをダッシュボード上でグラフとして美しく表示するのが得意です。Prometheus、InfluxDB、Elasticsearchなど多くのデータソースをサポートしており、それらのデータをリアルタイムでグラフ化します。ドラッグ&ドロップのインターフェースを通じてカスタマイズ可能なダッシュボードを作成でき、さまざまなパネルやウィジェットを配置してデータを視覚的に解析することができます。アラート機能も組み込まれており、特定の閾値を超えた場合に通知を受け取ることができます。これにより、システムの異常や障害を迅速に察知し、対応することが可能になります。
詳しくは、弊社のGrafanaマスター佐々木千奈さんのブログをご参照ください。
どのように実現するの?
Grafana単体では、Shibboleth IdPのログの可視化は実現できません。同じくGrafanaで提供されているPromtailとLokiというOSSを使います。
Loki
テキスト形式のログを集約してインデックス化を行うシステムです。もうちょっとわかりやすく言いますと、普通のテキストのログはRDBにSQL発行するみたいに柔軟な検索は行えませんが、それを実現するのがLokiになります。Lokiがログを集約して作成したインデックスにGrafanaから接続しますと、ログの可視化や分析が容易になります。
Promtail
Promtailは、Lokiのエージェントとして動作するツールです。システムやアプリケーションのログファイルを監視・収集し、それをLokiに転送する役割を持ちます。ログファイルを読み取る際、ラベルを付与して情報を整理・分類する能力も有しています。簡単に言えば、Promtailは「ログの収集人」として動き、見つけたログをLokiの「ログの保管庫」に持っていく役割を果たします。この連携により、大量のログを効率的に管理・検索することが可能となります。
Grafana、Loki、Promtailを組み合わせて、以下のようにShibboleth IdPのログの可視化を実現します。
-
設定:まず、PromtailをShibboleth IdPに設置します。Promtailの設定では、どのログファイルを監視するかや、どのようにログを解析・フォーマットするかを定義します。
-
ログの収集:PromtailがShibboleth IdPのログファイルを読み取ります。この際、ログエントリにはタイムスタンプやラベルが付与されます。
-
ログの送信:Promtailは読み取ったログをLokiに送信します。Lokiはこれらのログを効率的にインデックス化し、ストレージに保存します。
-
ダッシュボードの構築:Grafanaで新しいダッシュボードを作成し、Lokiをデータソースとして追加します。これにより、GrafanaはLokiからログデータを直接クエリすることができます。
-
ログの可視化:Grafanaのダッシュボード上で、Lokiからのログデータを基に、必要な情報を視覚的に表示する設定を行います。必要に応じて、特定のキーワードやラベルに基づいたフィルタリングも行えます。
こんな感じで実現できます。
試してみよう
サクッと試してみましょう。
Grafana、Loki、PromtailはDockerイメージとして提供されています。なので、これを使わない手はありません。
以前以下のブログでご紹介した「Dockerコンテナ化したShibboleth IdP」にGrafana、Loki、PromtailのDockerイメージをコンテナ化して追加してみたいと思います。
目指すべき構成はこんな感じです。
promtailはShibboleth IdPの中にエージェントとしてインストールするというのもありなのですが、これはDockerイメージが提供されているのでDockerコンテナとして構築します。Shibboleth IdPのログは、Dockerのボリュームを利用して、Shibboleth IdPとPromtailで共有します。
PromtailはtailをしたShibboleth IdPのログをLokiにHTTP経由で送信し、それを受け取ったLokiはインデックス化します。
GrafanaはLokiに接続して、インデックス化されたログを取得、可視化するというわけです。
上記の構成を実現するdocker-compose.ymlその他構成ファイルを以下のGitリポジトリにご用意しました。
https://github.com/noriyukitakei/dockerized-shibboleth-idp5-with-grafana
以下の手順で上記の環境がサクッと構築できます。
$ git clone https://github.com/noriyukitakei/dockerized-shibboleth-idp5-with-sp
$ cd dockerized-shibboleth-idp5-with-sp/idp
$ docker run -it -v $(pwd):/ext-mount --rm noriyukitakei/dockerized-shibboleth-idp5 gen-idp-conf.sh
$ cd ..
$ docker-compose up -d
じーまーで簡単ですね。ただし現状では、/opt/shibboleth-idp/logs/idp-process.logしか取得できません。
http://localhost:9080/にアクセスすると、Promtailのログの取得状況が確認できます。以下のようになっていればOKです。
Grafanaの設定を変更し、Lokiへの接続を追加する必要があります。http://localhost:3000/(Grafanaの管理画面)にアクセスして、左上の波平のおでこみたいなのをクリックして、「Connections」をクリックしてください。そして検索テキストボックスに「Loki」ろ入力すると、以下のようにLokiのデータソースが表示されるのでクリックします。
「Add new data source」をクリックします。
「URL」の部分を「http://loki:3000」と入力し、「Save & test」をクリックします。
以下のように表示されたらOKです。
左上の波平のおでこみたいなのをクリックして、「Explorer」をクリックします。接続先がLokiになっているのを確認して「Label filters」に「filename=/opt/shibboleth-idp/logs/idp-process.log」になるよう入力して「Run query」をクリックすると、Shibboleth IdPのログが表示されます。Grafanaの機能を活用すれば、あんなすごいことやこんなすごいことも出来るはずです。
まとめ
ログを可視化出来るようになれば、運用の幅がぐんと広がりますよね。あんな人があんなSPを、、、なんてのも覗き見できて面白いかもしれません。