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

認証・認可基盤に Keycloak を使って開発生産性を上げた話

86b08b89a4ccfc0847046d1abe60824a?s=47 yo41sawada
November 07, 2020

認証・認可基盤に Keycloak を使って開発生産性を上げた話

JJUC CCC 2020 Fall の登壇資料です。
https://confengine.com/jjug-ccc-2020-fall/schedule/rich#session-28680-info

keyword
- BaaS ( Banking as a Service )
- Keycloak
- OpenID Connect / OAuth 2.0
- Java / Spring Boot

86b08b89a4ccfc0847046d1abe60824a?s=128

yo41sawada

November 07, 2020
Tweet

Transcript

  1. JJUC CCC 2020 Fall 認証・認可基盤に Keycloak を使って開発生産性を上げた話 7th Nov. 2020

    Yoshihisa Wada(わだよし、@yo41sawada)
  2. Outline • プレゼンター紹介 • 認証・認可 - 認証・認可について - 認証・認可基盤を構築する手段の比較 •

    Keycloak - Keycloak について - ユースケース - デモ • 工夫したところ/サンプルコード • 難しいところ • まとめ • おまけ
  3. プレゼンター紹介 YOSHIHISA WADA (わだよし、@yo41sawada) 株式会社インフキュリオンデジタル CTO DX推進部 部長 出身:福井県 趣味:フットサル、ランニング、読書

    技術スタック・経験 - Java - パブリッククラウド・PaaS(特に Azure/AWS/heroku ) - CRM・SFA・MA( Salesforce ) - 証券・生保 Web システムの各行程 - IoT/AI を用いたソリューションのPoC/プロダクション化 - 開発部門責任者/コーポレートIT/採用・評価
  4. 認証?認可?

  5. 運転免許証でざっくり理解する認証・認可 認証 認可

  6. 認証・認可 • 認証 - Authentication - 相手が誰・何であるかを確認すること - 要素と例 •

    知る要素 :パスワード認証 • 持つ要素 :携帯電話・キャッシュカード • 備える要素 :指紋認証・顔認証 - その他 • 多要素認証( Multi-Factor Authentication )
  7. 認証・認可 • 認可 - Authorization - 相手に権限を認めること・可能にすること - 例 •

    アクセス認可 • 認可コードフロー
  8. 構築手段比較 • Keycloak を用いた“基盤”により共通化・汎用化 分類 代表例 特徴 フルスクラッチ Spring Security

    〇 自由度が高い △ 実装コストがそれなりに必要 OSS Keycloak 〇 GUI で認証・認可を実現 △ 構築は比較的楽だが、運用は必要 SaaS Auth0 〇 サーバの構築と運用が不要 △ 細かなカスタマイズは出来ない
  9. Keycloak https://www.keycloak.org/

  10. Google トレンド

  11. 特徴(1/2) • オープンソース - Javaベース - Tomcat 等多くのアプリケーションコンテナに対応 • 導入が用意

    - 解凍のみ - docker版もあり
  12. 特徴(2/2) • 機能 - シングルサインオン - GUI ベースのレルム(≒ポリシー)・ユーザ管理 - Open

    ID Connect / SAML をサポート - 外部 IdP 連携 - よくあるカスタマイズ(パスワードポリシー、ログイン画面etc) - 各種 API 提供 • クライアントアダプター提供
  13. ユースケース①:ログイン認証 • 気軽にやりたい - パスワードポリシーの設定 - ソーシャルログインなどの外部 IdP 連携 -

    認証画面のカスタマイズ • できればやりたくない - ID/Password の保持 - イチからの実装
  14. ユースケース②:API の保護 • API はオープン化へ • RFC 6749 ( OAuth

    2.0 ) - 認可サーバが発行したアクセストークンを利用し API をコール - 詳細は後程
  15. ユースケース②:API の保護 • API はオープン化へ • RFC 6749 ( OAuth

    2.0 ) - 認可サーバが発行したアクセストークンを利用し API をコール - 詳細は後程 引用:http://www.hitachihyoron.com/jp/archive/2020s/2020/03/03a04/image/fig_01.png
  16. デモ - 公式サイト - 管理コンソールの操作 - ユーザ認証

  17. 工夫したところ

  18. 工夫①:ユーザ一覧表示画面における描画性能改善 • ユーザ詳細をアプリDB側に集約し高速化

  19. 工夫②:Keycloak Gatekeeper の導入 • [従来] Keycloak との認証処理が API 毎に必要 -

    汎用化したい - できれば実装したくない Keycloak Java Web Application API A:認証 + 処理 A API B:認証 + 処理 B API C:認証 + 処理 C
  20. 工夫②: Keycloak Gatekeeper の導入 • Keycloak Gatekeeper による API Gateway

    パターンの適用 - OpenID Connect 対応 - Louketo Proxy へ移管された Keycloak Gatekeeper Keycloak Java Web Application A C 認証 API A:処理 A API B:処理 B API C:処理 C
  21. 工夫③:マルチテナント化 • 複数の導入先へ 1アプリケーション(インスタンス)で提供 - 認可リバースプロキシ - テナント毎にログイン画面を適用 - テナント毎に独自ドメインを適用

    Keycloak Gatekeeper Keycloak Java Web Application A B C レルム A レルム B レルム C テナント A テナント B テナント C
  22. サンプルコード

  23. 主要なサンプルコード • pom.xml • application.properties • SecurityConfig.java • その他 -

    KeycloakHelper.java(86行) • getAccessToken() • getLoginUserInfo() - KeycloakService.java(311行) • getRealmClient() • convertToUserDetail() • registerKeycloakUser() • updateKeycloakUser() • deleteKeycloakUser()
  24. 主要なサンプルコード • pom.xml • application.properties • SecurityConfig.java • その他 -

    KeycloakHelper.java(86行) • getAccessToken() • getLoginUserInfo() - KeycloakService.java(311行) • getRealmClient() • convertToUserDetail() • registerKeycloakUser() • updateKeycloakUser() • deleteKeycloakUser()
  25. 主要なサンプルコード • pom.xml • application.properties • SecurityConfig.java • その他 -

    KeycloakHelper.java(86行) • getAccessToken() • getLoginUserInfo() - KeycloakService.java(311行) • getRealmClient() • convertToUserDetail() • registerKeycloakUser() • updateKeycloakUser() • deleteKeycloakUser()
  26. 主要なサンプルコード • pom.xml • application.properties • SecurityConfig.java • その他 -

    KeycloakHelper.java(86行) • getAccessToken() • getLoginUserInfo() - KeycloakService.java(311行) • getRealmClient() • convertToUserDetail() • registerKeycloakUser() • updateKeycloakUser() • deleteKeycloakUser()
  27. 主要なサンプルコード • pom.xml • application.properties • SecurityConfig.java • その他 -

    KeycloakHelper.java(86行) • getAccessToken() • getLoginUserInfo() - KeycloakService.java(311行) • getRealmClient() • convertToUserDetail() • registerKeycloakUser() • updateKeycloakUser() • deleteKeycloakUser()
  28. 難しいところ

  29. アプリとインフラのはざま • 狙い通りにならなかった時の切り分けが難しい - IE 11 で動かない!? • Keycloak の設定?

    • クライアントの実装? • ネットワーク? • docker? - ログが期待できなくても tcpdump を取ろう • フォームに不要なパラメータを埋め込んでいた(keycloak を疑ってすみません)
  30. まとめ

  31. まとめ • 認証・認可 • Keycloak を用いて開発生産性を向上 - コードレスでのカスタマイズ(ログイン画面・パスワードポリシー) - Keycloak

    Gatekeeper を用いたマルチテナント化 • これからやりたいこと - 外部 IdP 連携 • 過不足あるユーザ情報のやりとりが求められる - 別プロダクトへの適用 • Spring Security で実装 -> 認証・認可基盤としてマイクロサービス化 - FAPI( Financial-grade API )準拠 • 最近関連リポジトリが keycloak に移管された
  32. おまけ

  33. We’re HIRING!!!(インフキュリオンデジタル) - Fintech Startup( BaaS プラットフォーム事業) - 創業 2018年7月4日

    - 代表 丸山 弘毅( Fintech 協会代表理事) - メンバー数 31名 - 平均年齢 36歳 - エンジニア比 65% - 社名の由来 Infinite Curiosity - ミッション 事業をつくる、人をつくる - 開発組織 - Java 積極採用(8以降、Spring) - 書籍購入支援制度(1万円/月、個人所有) - Microsoft Financial Servicesアワード受賞
  34. 参考URL・書籍 • 認証・認可 - http://www.hitachihyoron.com/jp/archive/2020s/2020/03/03a04/index.html - https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe - https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be -

    ソフトウェアデザイン 2020年11月号 • Keycloak - https://github.com/keycloak/keycloak - https://www.keycloak.org/downloads - https://keycloak-documentation.openstandia.jp/ - https://thinkit.co.jp/article/14839 - https://qiita.com/advent-calendar/2017/keycloak-by-openstandia - https://www.atmarkit.co.jp/ait/series/7363/ • Keycloak × Spring Boot - https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-keycloak/ • Keycloak Gatekeeper - https://github.com/louketo/louketo-proxy/releases - https://qiita.com/k2n/items/635e0b08ecac421c56d2 • その他 - https://github.com/yo41sawada/jjugccc2020fall - https://thinkit.co.jp/series/9721 - https://www.ogis-ri.co.jp/news/themistruct/docs/20180228_FinancialICTConference2018_OGIS_1.pdf
  35. None