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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for わだよし わだよし
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

Avatar for わだよし

わだよし

November 07, 2020
Tweet

More Decks by わだよし

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