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

Keycloak on Quarkus

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

id

December 10, 2020
Tweet

More Decks by id

Other Decks in Technology

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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"

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide