Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Keycloak on Quarkus

00851927294532e0742c2c174730dff0?s=47 id
December 10, 2020

Keycloak on Quarkus

a Kubernetes-Native Java Stack based Identity and Access Manager

認証基盤OSS「Keycloak」がQuarkusというKuberntes Native向けJavaフレームワークに対応し始めました。本セッションではQuarkus版Keycloakをコンテナ化し、簡単な動作確認および性能検証を行った結果を紹介します。

OpenShift.Run Winter 2020

00851927294532e0742c2c174730dff0?s=128

id

December 10, 2020
Tweet

Transcript

  1. © Hitachi, Ltd. 2020. All rights reserved. Keycloak on Quarkus

    a Kubernetes-Native Java Stack based Identity and Access Manager #openshiftjp Hitachi, Ltd. R&D Group Takaya Ide 2020/12/10
  2. © Hitachi, Ltd. 2020. All rights reserved. 本セッションの趣旨 ▪ ID・アクセス管理OSSのKeycloakにおいて、

    Quarkus版ディストリビューションが開発中 ▪ Quarkusはコンテナに適したJavaフレームワーク。 KubernetesやOpenShift上での活躍が期待される ▪ 本セッションではQuarkus版Keycloakをコンテナ化し、 性能評価を実施した結果を共有 1
  3. © Hitachi, Ltd. 2020. All rights reserved. 目次 1. 背景

    ◇ API公開の広がり ◇ Keycloak 2. Keycloak.X ◇ Keycloak on OpenShift ◇ Keycloakの改善 ◇ Quarkus ◇ Keycloak.X 3. Keycloak.Xのコンテナ化 ◇ 利用時のTips ◇ 実行サンプル 4. 性能評価 ◇ メモリ消費量 ◇ スループット ◇ 起動時間 ◇ 考察 5. まとめ 2
  4. © Hitachi, Ltd. 2020. All rights reserved. API公開の広がり ▪ API:外部からサービス機能を呼び出す

    インタフェース ▪ DXの一環として各分野でAPI公開/活用が進展 3 2017年の銀行法改正による オープンAPI活用推進 政府や自治体の情報を民間企業から 利用しやすくするためにAPIを活用 外部組織やモバイルアプリとのインタフェースと してAPI公開が一般化 金融 公共 商業 {API}
  5. © Hitachi, Ltd. 2020. All rights reserved. ケーススタディ ▪ アプリから銀行の預金残高を確認するサービスを考える

    ▪ 「OAuth 2.0を用いて残高取得APIを公開しよう」 ▪ ユーザ管理、社内DB連携、アクセストークン発行・検証、脆弱性対策、 アプリ新機能に伴う公開APIの増加、etc. etc. … 4 ③ユーザ認証および第三者へのAPIアクセス認可の確認 ④第三者のAPIアクセスを認可 ①アクセス ②認可リクエスト ⑥トークンを用いたAPIアクセス ⑤トークン発行 サービス 銀行 APIサーバ ユーザ OAuth 2.0を用いたAPIアクセスの概略図
  6. © Hitachi, Ltd. 2020. All rights reserved. Keycloak ▪ モダンなアプリ・サービスのためのID・アクセス管理OSS

    ▪ 特徴 ◇ OAuth 2.0, OIDC, SAMLなどの標準プロトコルに対応 ◇ 外部LDAP、Active Directory、RDBとの連携 ◇ 外部IDプロバイダ連携によるソーシャルログイン対応 ◇ 商用版あり(Red Hat Single Sign On) ▪ CNCF Incubating Projectへの登録を提案中 ◇ https://github.com/cncf/toc/pull/463 5
  7. © Hitachi, Ltd. 2020. All rights reserved. Keycloakを用いたケーススタディ ▪ 認証・認可処理をKeycloakに移譲

    ▪ APIサーバはAPIの処理に注力 6 ③ユーザ認証および第三者へのAPIアクセス認可の確認 ④第三者のAPIアクセスを認可 ①アクセス ②認可リクエスト ⑥トークンを用いたAPIアクセス ⑤トークン発行 サービス 銀行 APIサーバ ユーザ OAuth 2.0を用いたAPIアクセスの概略図 Keycloak (認可サーバ) ⑦トークン検証
  8. © Hitachi, Ltd. 2020. All rights reserved. Keycloak on OpenShift

    7 ▪ KubernetesやOpenShift上のアプリでのAPIを公開したい → 公式コンテナあり。また、keycloak-operator※にて運用を支援 ▪ 3scaleなどのAPIゲートウェイと連携し、API管理基盤を実現 ※ keycloak-operator:Kubernetes上にてインストール、更新、バックアップ、リストア等の運用を自動化するソフトウェア OpenShift Keycloak (認証認可サーバ) 3scale (API Gateway) APIサーバ API利用者 API管理基盤 keycloak operator ②トークン発行 運用自動化 ③アクセス withトークン ④トークン検証 ⑤認可済み アクセス ①ユーザ認証
  9. © Hitachi, Ltd. 2020. All rights reserved. Keycloakの改善 ▪ Keycloak

    v1.0のリリースは2014年 ◇ コンテナ技術が台頭する前 ◇ Javaで実装され、Java EE APサーバのWildFly上で動作 ▪ Keycloakをよりスリムで、便利で、将来性のあるものにできないか ◇ 消費リソースの削減 ◇ スケール性の向上 ◇ 設定容易化 ◇ etc. 8
  10. © Hitachi, Ltd. 2020. All rights reserved. QUARKUS 9

  11. © Hitachi, Ltd. 2020. All rights reserved. Quarkus ▪ Red

    Hat社が主導するKubernetes-Native Java Stack ◇ 高速起動、省メモリの特徴を持つ ◇ JVM上での動作以外にネイティブコンパイルが可能 ▪ OpenShiftのサポート対象(保証、開発ツール連携) https://www.redhat.com/en/blog/introducing-quarkus-red-hat-openshift 10 JVM Hot Spot GraalVM Quarkus Core Jandex Gizmo Graal SDK ArC (DI) Quarkus Extensions Quarkusアーキテクチャ ▪ Understanding Quarkus ◇ 情報が多い。Quarkus内部設計も記載 ◇ https://developers.redhat.com/books/understan ding-quarkus ▪ Quarkus Technical Deep Dive – Japanese ◇ 日本語で全体像を把握できる ◇ https://speakerdeck.com/chiroito/quarkus- technical-deep-dive-japanese お薦めの参考文献
  12. © Hitachi, Ltd. 2020. All rights reserved. Keycloak.X Project ▪

    Keycloak改善に向け、実験的に大胆な変更を追加するプロジェクト https://github.com/keycloak/keycloak-community/tree/master/design/keycloak.x ▪ フレームワークにQuarkusを採用 ▪ 現在開発中。JVM版は既に動作可能? 検証 11 ▪ 起動時間と消費メモリの削減 ▪ 設定容易化 ▪ スケーリング容易化 ▪ 無停止アップデート ▪ 機能拡張性の向上 目的(抜粋) ▪ Quarkusの採用 ▪ 構成オプションの環境変数化(WIP) ▪ ストレージレイヤの刷新(WIP) ▪ REST/gRPC経由での カスタムプロバイダー提供(WIP) 取り組み(抜粋)
  13. © Hitachi, Ltd. 2020. All rights reserved. Keycloak.Xのコンテナ化 ▪ Keycloak.Xをコンテナで動かす

    ▪ 公式のDockerfileあり※ ◇ Keycloak.Xバイナリは未配布 ◇ Dockerfile改修もしくは Keycloak.Xバイナリ配信が必要 ▪ Keyloak.Xバイナリのビルド ◇ 右Dockerfileにて可能 ◇ 2020年12月現在、 Masterブランチのみビルド可能 12 ARG MAVEN_VERSION=3.6.3 ARG JAVA_VERSION=11 # Specify the Commit ID to stabilize the build ARG COMMIT_ID=a01dcc54565542bfd72006c2e155ce3aa11fe01d FROM maven:${MAVEN_VERSION}-openjdk-${JAVA_VERSION} as build ARG KEYCLOAK_VERSION ARG ARTIFACT_DIR ARG COMMIT_ID WORKDIR /opt # [NOTE] it spends over 10 minutes RUN git clone https://github.com/keycloak/keycloak.git RUN cd ./keycloak && \ git pull && \ git checkout ${COMMIT_ID} # [NOTE] it spends over 70 minutes RUN cd ./keycloak/quarkus && \ mvn -f ../pom.xml clean install \ -DskipTestsuite -DskipExamples -DskipTests \ -Pquarkus,distribution -e # The binary was built on /opt/keycloak/distribution/bin ※ keycloak/keycloak-containerリポジトリにて公開 https://github.com/keycloak/keycloak-containers/tree/master/server-x
  14. © Hitachi, Ltd. 2020. All rights reserved. Keycloak.Xの動作確認 ▪ トークンを用いたユーザアクセス認可のシナリオに沿って動作を実機検証

    → ユーザログイン、トークン発行、トークン検証ともに問題なく動作 13
  15. © Hitachi, Ltd. 2020. All rights reserved. Keycloak.X 利用時のTips ▪

    Keycloak.Xのデザインノートの情報が詳しい(※ドラフト版) https://github.com/keycloak/keycloak-community/blob/master/design/keycloak.x/configuration.md ◇ そこに情報がなければCLIのヘルプメッセージかテストコードを参照 ▪ 動的プロパティと静的プロパティが存在 ◇ 動的プロパティ:環境変数や起動オプションで指定 ◇ 静的プロパティ:サーバイメージ再生成要。 ./bin/kc.sh config コマンドで指定 ◇ 2020年12月現在、 --db 及び --features[-x] が静的プロパティ ▪ プロパティとは別に環境変数にて初期adminアカウントの設定要 ◇ KEYCLOAK_ADMIN / KEYCLOAK_ADMIN_PASSWORD ▪ 死活監視およびメトリクス取得用のエンドポイントあり ◇ /health/live , /health/ready , /metrics ◇ 機能有効化のための metrics.enabled オプションが認識されず 14
  16. © Hitachi, Ltd. 2020. All rights reserved. Keycloak.Xの実行サンプル ▪ 外部PostgreSQLサーバを用いる構成の

    docker-compose.yml ▪ 動的プロパティは環境変数で設定 ▪ 静的プロパティであるDBベンダは CLIにて設定 ◇ コミュニティ公式の Dockerfileを使用している場合、 auto-config機能でも設定可能 https://github.com/keycloak/keycloak- containers/tree/master/server-x 15 version: '3' volumes: postgres_data: driver: local services: postgres: image: postgres:13.0-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: keycloak POSTGRES_USER: keycloak POSTGRES_PASSWORD: password keycloak: image: my-keycloak-x:a01dcc5 environment: KC_DB_USERNAME: keycloak KC_DB_PASSWORD: password KC_DB_SCHEMA: public KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak KC_HTTP_ENABLED: 'true' KEYCLOAK_USER: admin KEYCLOAK_PASSWORD: password ports: - 8080:8080 depends_on: - postgres entrypoint: '' command: > bash -c "./bin/kc.sh config --db=postgres-10 && ./bin/kc.sh start"
  17. © Hitachi, Ltd. 2020. All rights reserved. 性能測定 通常のKeycloakとKeycloak.Xで消費メモリ、スループット、起動時間を比較 16

    実験構成 ▪ Keycloak[.X]コンテナの基本設定 ◇ vCPU:3 ◇ Javaヒープメモリ:8GB ◇ ログインユーザ数:1万人 ◇ 同時接続 / worker thread数:64 ▪ コンテナイメージ ◇ Keycloak:jboss/keycloak:11.0.3 ◇ Keycloak.X:自作※ ◇ Javaはopenjdk-11.0.9 ▪ 3回計測し、平均を算出 ※コミットID a01dcc5時点のKeycloak.Xをビルド トークン検証API リクエスト VM VM Keycloak.X コンテナ Postgres コンテナ Keycloak コンテナ Postgres コンテナ 負荷生成 ログイン スクリプト ユーザ ログイン 消費メモリ 検証 スループット 検証 起動速度 検証
  18. © Hitachi, Ltd. 2020. All rights reserved. 結果(1/3) – 消費メモリ

    ▪ ログインユーザ数に応じたメモリ消費量※1をグラフ化 ▪ 消費メモリはユーザ数に線形比例(両者とも相関係数 > 0.99) ▪ Keycloak.XはKeycloakより50MBほど消費メモリが少ない 17 ※1 GC直後のヒープサイズの値をGCログから取得 85 96 123 203 303 31 49 80 156 252 0 100 200 300 400 0 1,000 10,000 50,000 100,000 Memory Usage (MB) Number of logged in users ログインユーザ数に応じたメモリ消費量変化 Keycloak Keycloak.X
  19. © Hitachi, Ltd. 2020. All rights reserved. 結果(2/3) – スループット

    ▪ CPUやメモリの割当量を変化させつつスループット(rps)を測定 ▪ CPUやメモリが潤沢な場合、両者同程度のスループット ▪ Keycloak.XはCPUやメモリが少ない場合でもスループットが低下しにくい 18 1843 3024 3350 3367 3293 3356 3352 3375 0 1000 2000 3000 4000 128 256 1024 4096 Throughput (req/seq) Memory (MB) メモリ量に応じたスループット Keycloak Keycloak.X 1463 2730 3351 3492 3445 2957 3382 3365 3390 3406 0 1000 2000 3000 4000 1 2 3 4 8 Throughput (req/sec) Number of CPUs CPU数に応じたスループット変化 Keycloak Keycloak.X
  20. © Hitachi, Ltd. 2020. All rights reserved. 結果(3/3) – 起動時間

    ▪ CPU数に応じたKeycloak[.X]の起動時間を測定※1 ▪ Keycloak.Xの起動時間はKeyxloakの 1/3 程度 19 ※1 起動時間はログから取得 32.5 19.8 16.0 15.9 11.0 6.3 5.8 5.5 0 5 10 15 20 25 30 35 1 2 3 4 Startup time (sec) Number of CPUs CPU数に応じた起動時間の変化 Keycloak Keycloak.X
  21. © Hitachi, Ltd. 2020. All rights reserved. 性能評価のまとめと考察 考察 ▪

    消費メモリおよび起動速度にてQuarkusの特徴が反映された ▪ メモリが少ない際のスループットの差は消費メモリの違いによるGC発生頻度の影響か ▪ CPUが少ない場合のスループットの差の理由は調査中 ▪ Keycloak.XはCPUを3コアから1コアに減らしても 88% の性能を維持 → CPU 1コアのコンテナを3個起動すればスループットを増やせる可能性 20 評価対象 結果サマリ 消費メモリ Keycloak.X はログインユーザ数に依らず50MBほど消費メモリが少ない 起動速度 Keycloak.Xは通常版の1/3の時間で起動 スループット 最大速度は両者同等。 Keycloak.X はCPUやメモリが少ない場合でも性能が低下しにくい 結果まとめ
  22. © Hitachi, Ltd. 2020. All rights reserved. まとめ ▪ Keycloak

    はID・アクセス管理のOSS ◇ keycloak-operatorを用いたKubernetes/OpenShift対応 ◇ Quarkusを採用した実験版 Keycloak.X が開発中 ▪ Keycloak.X をコンテナ化し、評価を実施 ◇ バイナリを用意すればコンテナ化が可能 ◇ トークン発行・検証などの動作確認に成功 ◇ 通常のKeycloakより消費メモリは50MB削減、起動速度は1/3に低減 ◇ 通常のKeycloakよりCPUやメモリが少なくとも性能が低下しにくい 21
  23. © Hitachi, Ltd. 2020. All rights reserved. ThinkIT連載 : Keycloakで実現するAPIセキュリティ

    ▪ 日立のKeycloak有識者が連載している解説記事 ▪ https://thinkit.co.jp/series/9721 ▪ 次回以降、Istio, Quarkus, strimziのKeycloak連携を解説予定 22 画像出典元: https://thinkit.co.jp/series/9721
  24. © Hitachi, Ltd. 2020. All rights reserved. 参考文献 ▪ Understanding

    Quarkus, https://developers.redhat.com/books/understanding-quarkus (2020.11) ▪ Quarkus Technical Deep Dive – Japanese, https://speakerdeck.com/chiroito/quarkus-technical-deep-dive-japanese (2020.8) ▪ Quarkus Runtime Performance, https://quarkus.io/blog/runtime-performance (2019.7) ▪ Quarkus vs Spring Boot - Part 2, http://www.mastertheboss.com/soa-cloud/quarkus/quarkus-vs-spring-boot-part-2 (2020.7) ▪ Keycloak, https://www.keycloak.org/ (2020.11) ▪ Keycloak.X https://github.com/keycloak/keycloak-community/tree/master/design/keycloak.x (2020.6) ▪ Keycloak.X Server Configuration, https://github.com/keycloak/keycloak-community/blob/master/design/keycloak.x/configuration.md (2020.11) ▪ Keycloak.X Docker Image, https://github.com/keycloak/keycloak-containers/tree/master/server-x ▪ CNCF TOC, https://github.com/cncf/toc/pull/463 (2020.6) ▪ KeycloakによるAPIセキュリティの基本, https://thinkit.co.jp/article/17559 (2020.5) 23
  25. © Hitachi, Ltd. 2020. All rights reserved. Trademarks ▪ Keycloak,

    OpenShift, JBoss and Wildfly are registered trademarks of Red Hat, Inc. in the United States and other countries. ▪ OpenID is a trademark or registered trademark of OpenID Foundation in the United States and other countries. ▪ その他記載の会社名、製品名、サービス名、その他固有名詞は、 それぞれの会社の商標または登録商標です ▪ 本発表中の文章、図では、TM、マークは表記しておりません 24
  26. © Hitachi, Ltd. 2020. All rights reserved. Special Thanks 本発表にあたり、実験や考察で大変お世話になりました。

    この場を借りてお礼申し上げます ▪ (株)日立製作所 OSSソリューションセンタ 中村雄一さん ▪ (株)日立製作所 OSSソリューションセンタ 岡井裕矢さん ▪ (株)日立製作所 研究開発グループ 田中 晶さん ▪ (株)日立製作所 研究開発グループ 西田 寿雄さん 25
  27. None