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

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

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

yo41sawada

November 07, 2020
Tweet

More Decks by yo41sawada

Other Decks in Technology

Transcript

  1. JJUC CCC 2020 Fall
    認証・認可基盤に
    Keycloak
    を使って開発生産性を上げた話
    7th Nov. 2020 Yoshihisa Wada(わだよし、@yo41sawada)

    View full-size slide

  2. Outline
    • プレゼンター紹介
    • 認証・認可
    - 認証・認可について
    - 認証・認可基盤を構築する手段の比較
    • Keycloak
    - Keycloak について
    - ユースケース
    - デモ
    • 工夫したところ/サンプルコード
    • 難しいところ
    • まとめ
    • おまけ

    View full-size slide

  3. プレゼンター紹介
    YOSHIHISA WADA (わだよし、@yo41sawada)
    株式会社インフキュリオンデジタル CTO DX推進部 部長
    出身:福井県
    趣味:フットサル、ランニング、読書
    技術スタック・経験
    - Java
    - パブリッククラウド・PaaS(特に Azure/AWS/heroku )
    - CRM・SFA・MA( Salesforce )
    - 証券・生保 Web システムの各行程
    - IoT/AI を用いたソリューションのPoC/プロダクション化
    - 開発部門責任者/コーポレートIT/採用・評価

    View full-size slide

  4. 認証?認可?

    View full-size slide

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

    View full-size slide

  6. 認証・認可
    • 認証
    - Authentication
    - 相手が誰・何であるかを確認すること
    - 要素と例
    • 知る要素 :パスワード認証
    • 持つ要素 :携帯電話・キャッシュカード
    • 備える要素 :指紋認証・顔認証
    - その他
    • 多要素認証( Multi-Factor Authentication )

    View full-size slide

  7. 認証・認可
    • 認可
    - Authorization
    - 相手に権限を認めること・可能にすること
    - 例
    • アクセス認可
    • 認可コードフロー

    View full-size slide

  8. 構築手段比較
    • Keycloak を用いた“基盤”により共通化・汎用化
    分類 代表例 特徴
    フルスクラッチ Spring Security 〇 自由度が高い
    △ 実装コストがそれなりに必要
    OSS Keycloak 〇 GUI で認証・認可を実現
    △ 構築は比較的楽だが、運用は必要
    SaaS Auth0 〇 サーバの構築と運用が不要
    △ 細かなカスタマイズは出来ない

    View full-size slide

  9. Keycloak
    https://www.keycloak.org/

    View full-size slide

  10. Google トレンド

    View full-size slide

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

    View full-size slide

  12. 特徴(2/2)
    • 機能
    - シングルサインオン
    - GUI ベースのレルム(≒ポリシー)・ユーザ管理
    - Open ID Connect / SAML をサポート
    - 外部 IdP 連携
    - よくあるカスタマイズ(パスワードポリシー、ログイン画面etc)
    - 各種 API 提供
    • クライアントアダプター提供

    View full-size slide

  13. ユースケース①:ログイン認証
    • 気軽にやりたい
    - パスワードポリシーの設定
    - ソーシャルログインなどの外部 IdP 連携
    - 認証画面のカスタマイズ
    • できればやりたくない
    - ID/Password の保持
    - イチからの実装

    View full-size slide

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

    View full-size slide

  15. ユースケース②:API の保護
    • API はオープン化へ
    • RFC 6749 ( OAuth 2.0 )
    - 認可サーバが発行したアクセストークンを利用し API をコール
    - 詳細は後程
    引用:http://www.hitachihyoron.com/jp/archive/2020s/2020/03/03a04/image/fig_01.png

    View full-size slide

  16. デモ
    - 公式サイト
    - 管理コンソールの操作
    - ユーザ認証

    View full-size slide

  17. 工夫したところ

    View full-size slide

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

    View full-size slide

  19. 工夫②:Keycloak Gatekeeper の導入
    • [従来] Keycloak との認証処理が API 毎に必要
    - 汎用化したい
    - できれば実装したくない
    Keycloak
    Java Web Application
    API A:認証 + 処理 A
    API B:認証 + 処理 B
    API C:認証 + 処理 C

    View full-size slide

  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

    View full-size slide

  21. 工夫③:マルチテナント化
    • 複数の導入先へ 1アプリケーション(インスタンス)で提供
    - 認可リバースプロキシ
    - テナント毎にログイン画面を適用
    - テナント毎に独自ドメインを適用
    Keycloak Gatekeeper
    Keycloak
    Java Web Application
    A B C
    レルム A
    レルム B
    レルム C
    テナント A
    テナント B
    テナント C

    View full-size slide

  22. サンプルコード

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  28. 難しいところ

    View full-size slide

  29. アプリとインフラのはざま
    • 狙い通りにならなかった時の切り分けが難しい
    - IE 11 で動かない!?
    • Keycloak の設定?
    • クライアントの実装?
    • ネットワーク?
    • docker?
    - ログが期待できなくても tcpdump を取ろう
    • フォームに不要なパラメータを埋め込んでいた(keycloak を疑ってすみません)

    View full-size slide

  30. まとめ
    • 認証・認可
    • Keycloak を用いて開発生産性を向上
    - コードレスでのカスタマイズ(ログイン画面・パスワードポリシー)
    - Keycloak Gatekeeper を用いたマルチテナント化
    • これからやりたいこと
    - 外部 IdP 連携
    • 過不足あるユーザ情報のやりとりが求められる
    - 別プロダクトへの適用
    • Spring Security で実装 -> 認証・認可基盤としてマイクロサービス化
    - FAPI( Financial-grade API )準拠
    • 最近関連リポジトリが keycloak に移管された

    View full-size slide

  31. We’re HIRING!!!(インフキュリオンデジタル)
    - Fintech Startup( BaaS プラットフォーム事業)
    - 創業 2018年7月4日
    - 代表 丸山 弘毅( Fintech 協会代表理事)
    - メンバー数 31名
    - 平均年齢 36歳
    - エンジニア比 65%
    - 社名の由来 Infinite Curiosity
    - ミッション 事業をつくる、人をつくる
    - 開発組織
    - Java 積極採用(8以降、Spring)
    - 書籍購入支援制度(1万円/月、個人所有)
    - Microsoft Financial Servicesアワード受賞

    View full-size slide

  32. 参考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

    View full-size slide