Slide 1

Slide 1 text

© 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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

© 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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

© 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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

© 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トークン ④トークン検証 ⑤認可済み アクセス ①ユーザ認証

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

© Hitachi, Ltd. 2020. All rights reserved. QUARKUS 9

Slide 11

Slide 11 text

© 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 お薦めの参考文献

Slide 12

Slide 12 text

© 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) 取り組み(抜粋)

Slide 13

Slide 13 text

© 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

Slide 14

Slide 14 text

© Hitachi, Ltd. 2020. All rights reserved. Keycloak.Xの動作確認 ▪ トークンを用いたユーザアクセス認可のシナリオに沿って動作を実機検証 → ユーザログイン、トークン発行、トークン検証ともに問題なく動作 13

Slide 15

Slide 15 text

© 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

Slide 16

Slide 16 text

© 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"

Slide 17

Slide 17 text

© 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 コンテナ 負荷生成 ログイン スクリプト ユーザ ログイン 消費メモリ 検証 スループット 検証 起動速度 検証

Slide 18

Slide 18 text

© 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

Slide 19

Slide 19 text

© 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

Slide 20

Slide 20 text

© 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

Slide 21

Slide 21 text

© 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やメモリが少ない場合でも性能が低下しにくい 結果まとめ

Slide 22

Slide 22 text

© 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

Slide 23

Slide 23 text

© 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

Slide 24

Slide 24 text

© 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

Slide 25

Slide 25 text

© 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

Slide 26

Slide 26 text

© Hitachi, Ltd. 2020. All rights reserved. Special Thanks 本発表にあたり、実験や考察で大変お世話になりました。 この場を借りてお礼申し上げます ▪ (株)日立製作所 OSSソリューションセンタ 中村雄一さん ▪ (株)日立製作所 OSSソリューションセンタ 岡井裕矢さん ▪ (株)日立製作所 研究開発グループ 田中 晶さん ▪ (株)日立製作所 研究開発グループ 西田 寿雄さん 25

Slide 27

Slide 27 text

No content