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. Outline • プレゼンター紹介 • 認証・認可 - 認証・認可について - 認証・認可基盤を構築する手段の比較 •

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

    技術スタック・経験 - Java - パブリッククラウド・PaaS(特に Azure/AWS/heroku ) - CRM・SFA・MA( Salesforce ) - 証券・生保 Web システムの各行程 - IoT/AI を用いたソリューションのPoC/プロダクション化 - 開発部門責任者/コーポレートIT/採用・評価
  3. 認証・認可 • 認証 - Authentication - 相手が誰・何であるかを確認すること - 要素と例 •

    知る要素 :パスワード認証 • 持つ要素 :携帯電話・キャッシュカード • 備える要素 :指紋認証・顔認証 - その他 • 多要素認証( Multi-Factor Authentication )
  4. 構築手段比較 • Keycloak を用いた“基盤”により共通化・汎用化 分類 代表例 特徴 フルスクラッチ Spring Security

    〇 自由度が高い △ 実装コストがそれなりに必要 OSS Keycloak 〇 GUI で認証・認可を実現 △ 構築は比較的楽だが、運用は必要 SaaS Auth0 〇 サーバの構築と運用が不要 △ 細かなカスタマイズは出来ない
  5. 特徴(2/2) • 機能 - シングルサインオン - GUI ベースのレルム(≒ポリシー)・ユーザ管理 - Open

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

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

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

    2.0 ) - 認可サーバが発行したアクセストークンを利用し API をコール - 詳細は後程 引用:http://www.hitachihyoron.com/jp/archive/2020s/2020/03/03a04/image/fig_01.png
  9. 工夫②:Keycloak Gatekeeper の導入 • [従来] Keycloak との認証処理が API 毎に必要 -

    汎用化したい - できれば実装したくない Keycloak Java Web Application API A:認証 + 処理 A API B:認証 + 処理 B API C:認証 + 処理 C
  10. 工夫②: 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
  11. 主要なサンプルコード • pom.xml • application.properties • SecurityConfig.java • その他 -

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

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

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

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

    KeycloakHelper.java(86行) • getAccessToken() • getLoginUserInfo() - KeycloakService.java(311行) • getRealmClient() • convertToUserDetail() • registerKeycloakUser() • updateKeycloakUser() • deleteKeycloakUser()
  16. アプリとインフラのはざま • 狙い通りにならなかった時の切り分けが難しい - IE 11 で動かない!? • Keycloak の設定?

    • クライアントの実装? • ネットワーク? • docker? - ログが期待できなくても tcpdump を取ろう • フォームに不要なパラメータを埋め込んでいた(keycloak を疑ってすみません)
  17. まとめ • 認証・認可 • Keycloak を用いて開発生産性を向上 - コードレスでのカスタマイズ(ログイン画面・パスワードポリシー) - Keycloak

    Gatekeeper を用いたマルチテナント化 • これからやりたいこと - 外部 IdP 連携 • 過不足あるユーザ情報のやりとりが求められる - 別プロダクトへの適用 • Spring Security で実装 -> 認証・認可基盤としてマイクロサービス化 - FAPI( Financial-grade API )準拠 • 最近関連リポジトリが keycloak に移管された
  18. We’re HIRING!!!(インフキュリオンデジタル) - Fintech Startup( BaaS プラットフォーム事業) - 創業 2018年7月4日

    - 代表 丸山 弘毅( Fintech 協会代表理事) - メンバー数 31名 - 平均年齢 36歳 - エンジニア比 65% - 社名の由来 Infinite Curiosity - ミッション 事業をつくる、人をつくる - 開発組織 - Java 積極採用(8以降、Spring) - 書籍購入支援制度(1万円/月、個人所有) - Microsoft Financial Servicesアワード受賞
  19. 参考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