みなさん、こんにちは。サイオステクノロジー武井です。今回はオープンソースのアイデンティティ・アクセス管理ソフトウェアであるKeycloakをAzure App Service上で動かしたいと思います。
Azure App Serviceとは?
Azure App Serviceは、Webアプリケーションを動作させるためのマネージドなサービスです。アプリケーションのアーカイブをAzureポータルやCLIからアップロードするだけで簡単にWebアプリケーションを動作させることが出来ます。Java、Python、PHPなどざまざまなランタイムに対応しており、ロードバランサーやストレージ等、Webアプリケーションを実行させるために必要なインフラはすでにそろっております。
このApp Serviceは、実はコンテナにも対応しておりまして、Docker Hubやプライベートレジストリ等にPushしたDockerイメージをもとに、Webアプリケーションを動かすことができます。
似たような基盤として、「Azure Kubernetes Service」がありますが、あちらはApp Serviceに比べてもっともっとすごいことができます。複数のコンテナを動かしたり、複雑な条件でコンテナをスケールさせたりとか色々できます。ただ、あまりにも複雑すぎて構築や運用が大変ともいわれています。
そこで、App Serviceの出番なのですが、それほどアプリケーションに対する要件が複雑でなく、シングルコンテナーでかつモノリシックなアプリでもいい場合は、このApp Serviceはウッテツケです。Azure Kubernetes Serviceがマイクロサービスを用いた大規模アプリ用だとすると、App Serviceは小中規模のモノリスなアプリ向けみたいなイメージです。
Azureには、Azure Kubernetes Serviceだけでなく、App Service然りAzure Container Instances然り、あらゆるケースでコンテナを有効活用する基盤がたくさんありますので、ぜひご活用下さい!!
Keycloakとは?
OpenID ConnectやOAuth、SAML等に対応したオープンソースのアイデンティティ・アクセス管理ソフトウェアです。機能は他のOSSや商用ソフトウェアと比べるとシンプルではありますが、主要な認証方式に対応しており、コミュニティによる開発も活発です。非常に将来性の高いソフトウェアと言えます。
Azure App Service上でKeycloakを動かしてみよう
Keycloakには開発元が提供しているコンテナイメージがあります。これを使って、App Service上でKeycloakを動かしてみましょう。
Keycloakの構築
まずはApp Serviceを作ります。Azureポータルの画面上部の検索ボックスに「App Service」と入力すると、「サービス」の一覧に「App Service」が表示されますので、それをクリックします。
「作成」をクリックします。
リソースグループやサブスクリプションなどは環境にご自分の環境にあったものを入れて下さい。以下の2点だけ必ず指定してください。
- 公開:Dockerコンテナー
- オペレーティングシステム:Linux
「次:Docker >」をクリックします。
コンテナの設定を行います。
設定の詳細は以下の通りになります。設定が完了したら、最後に「確認および作成」をクリックします。
オプション |
「単一コンテナー」を選択します。 |
イメージソース |
「Docker Hub」を選択します。 |
アクセスの種類 |
「パブリック」を選択します。 |
イメージとタグ |
「quay.io/keycloak/keycloak:latest」と入力します。タグはlatestとしていますが、本番ではバージョンを固定化する必要があります。 |
スタートアップコマンド |
「start –proxy=edge –hostname-strict=false」と入力します。 「–proxy=edge」は、ロードバランサー側でSSLの終端を行い、バックエンド(Keycloakのコンテナインスタンス)にhttpでリクエストを渡す場合には必須の設定です。 「–hostname-strict=false」は、これをfalseにするとホスト名を指定しなくて済みます。トークンエンドポイントなどの各種エンドポイントのホスト名を「–hostname」で指定してなければいけないのだけど、今回はささっと立ち上げて動作確認したいので、今回は指定しない方向でやります。本番では、きちんとホスト名を設定したほうが良いかかと思います。 |
内容に問題がなければ、「作成」をクリックします。
初期ユーザー名とパスワードを設定します。これらの値は、コンテナに環境変数から指定しますので、App Serviceの左部メニューから「構成」→「+新しいアプリケーション設定」の順にクリックします。
まずは、初期ユーザーのユーザー名を設定します。「名前」に「KEYCLOAK_ADMIN」、「値」に「admin」を入力して、「OK」をクリックします。
同様の手順で、初期ユーザーのパスワードも設定します。「名前」に「KEYCLOAK_ADMIN_PASSWORD」、「値」に「admin」を入力して、「OK」をクリックします。
初期ユーザー名、初期ユーザーのパスワードの追加が完了したら、「保存」をクリックします。
確認メッセージが表示されますので、「続行」をクリックします。
これでKeycloakがApp Service上で動くようになりました。次はKeycloakの設定を行います。
Keycloakの設定
Keycloakの設定を行います。
App Serviceの設定画面左部メニュー「概要」をクリックして、「URL」の値をメモります。
以下のURLにアクセスしてKeycloakの管理画面にログインします。
先程メモったURL/admin
以下の画面が表示されますので、「Username or email」「Password」の部分に、それぞれ「admin」と入力して、「Sign In」をクリックします。
クライアント(アプリケーション)の登録を行います。「Clients」をクリックします。
「Create Client」をクリックします。
「Client Type」はOpenID Connectを選択、「Client ID」には任意の名称を入力します。これがOpenID ConnectのクライアントIDになります。Client IDは後ほど使うのでメモります。最後に「Next」をクリックします。
認可コードフローで後ほど検証を行うので、「Standard flow」にチェックが入っていることを確認して、「Save」をクリックします。
さらに詳細な設定を行います。まずリダイレクトURIを設定します。「Valid redirect URIs」に「http://localhost」を入力します。
ちょっとしたにスクロールして、「Client Authentication」をOnにします。これをOnにするとOpenID ConnectでいうところのConfidential Clientになります。今回は、サーバーサイドアプリのように、クライアントシークレットを安全に保管できるクライントにて認可コードフローの検証を行いますので、この設定にします。最後に「Save」をクリックします。
「Credentials」のタブをクリックして、「Client secret」の値をメモります。
IDトークンを取得してみよう
これでKeycloakの準備は整いました。認可コードフローに基づいて、IDトークンを取得してみましょう。
まず、ブラウザにて以下のURL(認証エンドポイント)にアクセスします。
{先程メモったApp ServiceのURL}/realms/master/protocol/openid-connect/auth?client_id={クライアントID}&response_type=code&redirect_uri=http://localhost&scope=openid
例としては以下のような感じになります。
https://ntakeikeycloak.azurewebsites.net/realms/master/protocol/openid-connect/auth?client_id=testclient&response_type=code&redirect_uri=http://localhost&scope=openid
Keycloakのログイン画面が表示されますので、adminでログインします。すると、以下のようなURLにリダイレクトされるはずです。
http://localhost/?session_state=2755c2a3-b6ad-4016-a9df-abb4e161553b&code=3f17e199-97d8-4311-be01-55085d3f2438.2755c2a3-b6ad-4016-a9df-abb4e161553b.6131d1d0-db7d-4e48-94d2-1cf769c66df6
code=XXXXXXのXXXXXXの部分が認可コードになります。これをメモります。
次にトークンエンドポイントにアクセスしてIDトークンを取得します。これはcurlで取得します。以下のコマンドを実行してください。
$ curl --request POST \
--url '{先程メモったApp ServiceのURL}/realms/master/protocol/openid-connect/token' \
--header 'content-type: application/x-www-form-urlencoded' \
--data 'grant_type=authorization_code' \
--data 'client_id={先程メモしたClient ID}' \
--data 'client_secret={先程メモしたClient Secret}' \
--data 'code={先程メモした認可コード}' \
--data 'redirect_uri=http://localhost'
以下のような結果が返ってくれば成功です。id_tokenの部分がIDトークンになります。デコードすればペイロードやヘッダーが見えるはずです。
{"access_token":"XXXXXX...","expires_in":60,"refresh_expires_in":1800,"refresh_token":"XXXXXX...","token_type":"Bearer","id_token":"XXXXXX...","not-before-policy":0,"session_state":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX","scope":"openid profile email"}
まとめ
Azure App Serviceを使うと、こんなにも簡単にKeycloakを構築できるのです。まじすごいですよね。