2023/09/06 に行われた OCHaCafe Season7 #4 で用いた資料です。
セキュアなWeb APIの作り方~cert-manager & Keycloak~Oracle Cloud Hangout Café – Season 7 #4Shuhei KawamuraCloud ArchitectOracle Digital, Oracle Corporation JapanSeptember 6, 2023
View Slide
Copyright © 2023, Oracle and/or its affiliates2• 所属• 日本オラクル株式会社• Oracle Digital• 普段の業務• Digital Nativeなお客様を技術面でご支援• コミュニティ• OCHaCafe• CloudNative Days – Observability川村 修平 (Shuhei Kawamura)@shukawamX/GitHub/Qiita
Copyright © 2023, Oracle and/or its affiliates3Agenda1. セキュアなWeb API2. cert-manager3. Keycloak
Copyright © 2023, Oracle and/or its affiliates4セキュアなWeb API
Copyright © 2023, Oracle and/or its affiliates5OWASP• 組織が信頼できるアプリケーションやAPIを開発、維持できることを目的としたオープン・コミュニティのことOWASP API Security Project• 潜在的にセンシティブなAPIをソフトウェア提供の一部としてデプロイする組織が増え続けていることに対処するために設計されたプロジェクトのこと• 安全でないAPIの潜在的なリスクを強調し、これらのリスクをどのように軽減できるかを説明することで、ソフトウェア開発者とセキュリティ評価者に価値を提供することを目指すOWASP – Open Worldwide Application Security Project
Copyright © 2023, Oracle and/or its affiliates6API1:2023 – オブジェクトレベルの認可の不具合API2:2023 – 認証の不具合API3:2023 – オブジェクト・プロパティレベルの認可の不具合API4:2023 – 無制限のAPIリソース消費API5:2023 – 関数レベルの認可不具合API6:2023 – 機密性の高いビジネスフローへの無制限アクセスAPI7:2023 – サーバーサイドリクエストフォージェリAPI8:2023 – セキュリティの誤設定API9:2023 – 不適切な在庫管理API10:2023 – APIの非安全な消費参考: https://owasp.org/API-Security/editions/2023/en/0x11-t10/OWASP Top 10 API Security Risks – 2023今日のテーマに関連!(+ 証明書管理)
Copyright © 2023, Oracle and/or its affiliates7cert-manager
Copyright © 2023, Oracle and/or its affiliates8• インターネットなどコンピュータ間の通信において、セキュアな通信を実現するためのプロトコル• 元々は、SSLというプロトコルが利用されていたが、脆弱性が発見されたため、新たにTLSが設計• SSLという名称が広く普及していることから、実際にはTLSを使用している場合でもSSLやSSL/TLSと表記されることも多い• 以前は、導入に当たってのコストや、応答速度の低下の懸念があり、導入をしない/一部のみ導入するなどの対応が行われていたが、SSL化されていないWebサイトがブラウザ上で警告表示されるようになったり、SSL化されているWebサイトが検索サイトで上位に表示されるなどの変更があり“常時SSL“が求められるようになったSSL/TLSとはSSL(Secure Socket Layer)/TLS(Transport Layer Security)トップページサービスメニュー 店舗情報 予約フォームトップページサービスメニュー 店舗情報 予約フォーム情報入力があるページのみSSL化 常時SSL化
Copyright © 2023, Oracle and/or its affiliates9SSL/TLSの機能・役割確かな相手と安全に通信するための技術通信内容の暗号化 通信相手の認証改ざんの検出??1. 「鍵」を用いてデータを暗号化2. 「鍵」を用いてデータを復号第三者が盗聴してもデータの解読が不可第三者が改ざんした場合、元のハッシュ値と一致しなくなり、改ざんの検知が可能1. データからハッシュ値を計算2. 取得したデータからハッシュ値を計算・照合1. 電子証明書を要求3. 証明書を検証 2. 電子証明書を送付認証局に認められた電子証明書とそれに対応する鍵を持たないため、なりすますことが出来ない
Copyright © 2023, Oracle and/or its affiliates10認証局(CA)• 公開鍵とその所有者を証明するための電子証明書を発行する機関のこと• 認証局自体も、自身が信頼できる認証局であることを証明するために、より上位の認証局によって正当性を保証• 最上位の認証局 → ルート認証局、そのほかの認証局 → 中間認証局/下位認証局デジタル証明書• 公開鍵の所有者を証明する証(サーバー証明書、クライアント証明書、ルート証明書、etc.)• 証明書の標準フォーマット: X.509, SPKI, etc.• 公開鍵の所有者から提出された証明書署名要求(= Certificate Signing Request)を元に、認証局の秘密鍵によってデジタル署名されることで発行される大規模な環境になると、証明書発行・管理の一連のプロセスを人手で実施するのは辛くなってくるので、自動化する→ Automatic Certificate Management Environment認証局(CA)とデジタル証明書
Copyright © 2023, Oracle and/or its affiliates11ACME(Automatic Certificate Management Environment)• RFC 8555• 証明書管理における一連の手続きを自動化するためのプロトコルを規定• 鍵ペアの作成• 証明書署名要求の作成、認証局への送信• ドメイン名利用権の検証• 証明書の設定、更新• ACME標準で定義されているチャレンジを使用し、証明しようとしているドメイン名が制御下にあることを検証• HTTP-01チャレンジ• DNS-01チャレンジ• TNS-ALPN-01チャレンジ(割愛)ACME
Copyright © 2023, Oracle and/or its affiliates12• 最も多く使われているチャレンジ• ドメイン設定に関する知識が不要で、証明書の取得が簡単に自動化可能• 80番ポートでのみ実行可能(=80番ポートがブロックされている場合には動作しない)• ワイルドカード証明書の発行は不可HTTP-01チャレンジ証明書の利用者認証局1. 証明書署名要求(CSR)3. トークン返却5. ファイルの配置が完了したことを認証局に通知6. Web Serverからファイル取得を試みる (.well-known/acme-challenge/)8. 証明書発行jnfTX…7sjnfTX…7s9. 証明書設定http:///.well-known/acme-challenge/2. トークン発行4. トークンをWeb Serverに設定7. (ファイル取得がOKなら)証明書発行
Copyright © 2023, Oracle and/or its affiliates13• HTTP-01が動作しない環境下でも適切に動作する• ワイルドカード証明書の発行が可能• DNS-01に対応したDNSプロバイダでのみ動作するDNS-01チャレンジ証明書利用者認証局1. 証明書署名要求(CSR)3. トークン返却 jnfTX…7s5. レコードの追加が完了したことを認証局に通知6. 認証対象のサブドメインのTXTレコードを確認8. 証明書発行DNS Host_acme-challenge.ochacafe.dev IN TXT jnfTX…7sjnfTX…7s9. 証明書設定2. トークン発行4. 認証対象のサブドメイン (_acme-challenge) のTXTレコードにトークンを設定7. (TXTレコード確認がOKなら)証明書発行
Copyright © 2023, Oracle and/or its affiliates14※https://letsencrypt.org/ja/docs/client-options/ から一部引用ACMEクライアントの実装BashGetSSLacme.shdehydratedght-acne.shbacmewdfcert.shCOpenBSD acme-clientuacmeacme-client-portableApache httpdmod_mdCycloneAcmeC++acme-lwesp32-acme-clientClojurecertificaatConfiguration management toolsAnsible acme_certificate moduleTerraform ACME ProviderAnsible collection: acmeDoacme-lw-dDominoCertMaticaHCL DominoDockerCrypt::LEacme.shletsproxyGoCaddyLegoacmetoolLets-proxy2autocertTraefikACMEzStep CLIJ8acertmanager ← 今日はこれHAProxyHAProxy clientJavaPJACManageEngine Key Manager PlusKubernetesKCertLuaMako Server’s ACME PluginMicrosoft AzureAzure WebApp SSL ManagerApp Service AcmebotKey Vault AcmebotAz-Acmenginxnjs-acmelua-resty-auto-sslNginx ACMElua-resty-acmeNode.jsGreenlock for Express.jsacme-http01-azure-key-vault-middlewareOpenshiftopenshift-acmePerlacmeCrypt::LEPHPkelunik/acme-clientHiawathaFreeSSL.tech AutoYet another ACME clientitr-acme-client PHP libraryAcme PHPRW ACME clientPythonACME Tinysimp_leacmebotseweracme-dns-tiny (Python 3)Automatoesacertmgracme-cert-toolserverPKIRustACMEdacme-redirectWindows / IISCrypt::LEwin-acmePosh-ACMECertesACME-PSkelunik/acme-clientCertify The WebWinCertes Windows clientGetCert2TekCERTServerCertera※その他、ライブラリや連携プロジェクト多数…
Copyright © 2023, Oracle and/or its affiliates15• cert-manager is the de facto standard for X.509 certificates in Kubernetes environments• by Ricardo Torres, Chief Engineer of Open Source & Cloud Native at The Boeing Company• Jetstackが開発したKubernetes, OpenShiftでX.509証明書を扱うためのカスタム・コントローラー• CNCF incubating project• 証明書の取得、更新、利用のプロセスを簡素化cert-managerhttps://github.com/cert-manager/cert-manager参考: https://cert-manager.io/docs/cert-managerletsencrypt-stagingletsencrypt-prodhashicorp-vault ochacafe.devIssuer.letsencrypt-prodsignedkeypairvenafi-tppvenafi-as-a-serviceIssuersCertificates K8s Secrets
Copyright © 2023, Oracle and/or its affiliates16cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: example-appnamespace: examplesannotations:kubernetes.io/ingress.class: nginxspec:rules:- host: example.comhttp:paths:- backend:service:name: example-appport:number: 8080path: /pathType: Prefix
Copyright © 2023, Oracle and/or its affiliates17cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror Issuer0. ACMEアカウントの登録apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: letsencrypt-prodspec:acme:server: https://acme-v02.api.letsencrypt.org/directoryemail: [email protected]privateKeySecretRef:name: letsencrypt-prodsolvers:- http01:ingress:class: nginxSecret(letsencrypt-prod)0. 秘密鍵をSecretに保管
Copyright © 2023, Oracle and/or its affiliates18cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror Issuer0. ACMEアカウントの登録Secret(letsencrypt-prod)0. 秘密鍵をSecretに保管apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: example-appnamespace: examplesannotations:kubernetes.io/ingress.class: nginxcert-manager.io/cluster-issuer: letsencrypt-prodspec:tls:- hosts:- example.comsecretName: example-tls-secretrules:- host: example.comhttp:paths:- backend:service:name: example-appport:number: 8080path: /pathType: Prefix
Copyright © 2023, Oracle and/or its affiliates19cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror Issuer0. ACMEアカウントの登録Certificate1. 証明書署名要求(CSR)Secret(letsencrypt-prod)0. 秘密鍵をSecretに保管
Copyright © 2023, Oracle and/or its affiliates20cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror Issuer0. ACMEアカウントの登録Certificate2. トークンjnfTX…7sSecret(letsencrypt-prod)0. 秘密鍵をSecretに保管1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates21cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror Issuer0. ACMEアカウントの登録Certificate2. トークンACME ServiceACME Podbackend3. 追加3. 作成3. 作成 &トークン配置port: 8089jnfTX…7sSecret(letsencrypt-prod)0. 秘密鍵をSecretに保管1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates22cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror IssuerSecret(letsencrypt-prod)0. ACMEアカウントの登録Certificate2. トークン3. 追加3. 作成3. 作成 &トークン配置port: 80894. Webサーバからファイル取得を試みるACME ServiceACME PodbackendjnfTX…7s0. 秘密鍵をSecretに保管1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates23cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror IssuerSecret(letsencrypt-prod)0. ACMEアカウントの登録Certificate2. トークン3. 追加3. 作成3. 作成 &トークン配置port: 80894. Webサーバからファイル取得を試みる5. (ファイル取得がOKなら)証明書発行ACME ServiceACME PodbackendjnfTX…7s0. 秘密鍵をSecretに保管1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates24cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror IssuerSecret(letsencrypt-prod)0. ACMEアカウントの登録2. トークン3. 追加3. 作成3. 作成 &トークン配置port: 80894. Webサーバからファイル取得を試みる5. (ファイル取得がOKなら)証明書発行Certificate6. 証明書発行ACME ServiceACME PodbackendjnfTX…7s0. 秘密鍵をSecretに保管1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates25cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttp://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror IssuerSecret(letsencrypt-prod)0. 秘密鍵をSecretに保管0. ACMEアカウントの登録2. トークン3. 追加3. 作成3. 作成 &トークン配置port: 80894. Webサーバからファイル取得を試みる5. (ファイル取得がOKなら)証明書発行CertificateTLS Secret6. 証明書発行7. 証明書をTLS Secretに格納ACME ServiceACME PodbackendjnfTX…7s1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates26cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendhttps://example.com/fooLet’s Encrypt ACME ServiceCluster Issueror IssuerSecret(letsencrypt-prod)0. 秘密鍵をSecretに保管0. ACMEアカウントの登録2. トークン3. 追加3. 作成3. 作成 &トークン配置port: 80894. Webサーバからファイル取得を試みる5. (ファイル取得がOKなら)証明書発行CertificateTLS Secret6. 証明書発行7. 証明書をTLS Secretに格納8. 設定ACME ServiceACME PodbackendjnfTX…7s1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates27cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendLet’s Encrypt ACME ServiceCluster Issueror IssuerSecret(letsencrypt-prod)0. 秘密鍵をSecretに保管0. ACMEアカウントの登録2. トークン4. Webサーバからファイル取得を試みる5. (ファイル取得がOKなら)証明書発行CertificateTLS Secret6. 証明書発行7. 証明書をTLS Secretに格納9. 削除port: 8089ACME ServiceACME Podbackendhttps://example.com/foo8. 設定1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates28cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendLet’s Encrypt ACME ServiceCluster Issueror IssuerSecret(letsencrypt-prod)0. 秘密鍵をSecretに保管0. ACMEアカウントの登録2. トークン4. Webサーバからファイル取得を試みる5. (ファイル取得がOKなら)証明書発行CertificateTLS Secret6. 証明書発行7. 証明書をTLS Secretに格納https://example.com/foo8. 設定1. 証明書署名要求(CSR)
Copyright © 2023, Oracle and/or its affiliates29cert-manager architecture overview w/ Let’s EncryptWorker NodesIngressServicePodbackendLet’s Encrypt ACME ServiceCluster Issueror IssuerSecret(letsencrypt-prod)0. 秘密鍵をSecretに保管0. ACMEアカウントの登録2. トークン4. Webサーバからファイル取得を試みる5. (ファイル取得がOKなら)証明書発行CertificateTLS Secret6. 証明書発行7. 証明書をTLS Secretに格納https://example.com/foo8. 設定1. 証明書署名要求(CSR)DEMO
Copyright © 2023, Oracle and/or its affiliates30証明書の更新プロセス → cert-managerのコア機能に含まれ、自動的に行われる!更新処理がトリガーされる例:• Certificate.spec.secretNameに記載されたSecret( = 証明書の実体)が存在しない• 発行された証明書の公開鍵が、Secretに格納された秘密鍵と一致しない場合• 証明書の更新が必要な場合• 有効期限切れ、更新時期が現在 or 過去の場合• cmctlを用いて手動で更新をトリガーした場合• cmctl: クラスタ内のcert-managerとそのリソース管理のためのコマンドラインツール• etc.参考: https://cert-manager.io/docs/faq/#when-do-certs-get-re-issued証明書の更新
Copyright © 2023, Oracle and/or its affiliates31• KubernetesでX.509証明書を簡潔に扱うためのカスタム・コントローラー• Let’s Encrypt, HashiCorp Vault, Venafi, プライベートPKIなど様々なIssuerに対応• 証明書自動管理のプロトコル(=ACME)とチャレンジ(HTTP | DNS -01)を最低限理解するとcert-managerが裏側で実施していることの理解がしやすい• Let’s EncryptをIssuerに使っている場合は、レート制限に注意!• https://letsencrypt.org/ja/docs/rate-limits/cert-managerまとめ
Copyright © 2023, Oracle and/or its affiliates32Keycloak
Copyright © 2023, Oracle and/or its affiliates33認証(Authentication/AuthN)• ID/パスワードに代表される情報を用いてユーザー/システムの本人性を検証すること• 認証の3要素• 知識 – Something You Know(SYK)/What You Know(WYK)• 所有 – Something You Have(SYH)/What You Have(WYH)• 生体 – Something You Are(SYA)/What You Are(WYA)• HTTP 401 Unauthorized – The request requires user authentication.認可(Authorization/AuthZ)• ユーザー/システムに対して特定の処理を行うことを許可すること• HTTP 403 Forbidden – The server understood the request, but id refusing to fulfill it.→ OpenID Connect 1.0, OAuth 2.0という標準仕様が広く使われる認証と認可
Copyright © 2023, Oracle and/or its affiliates34認可を扱うフレームワークでRFC 6749で定義認可サーバーから発行されるアクセストークンを用いてクライアントからリソースサーバーに対するアクセス制御を行うアクセストークンは、実装方法が決まっていないが大別すると以下の2種類• 識別子型: ランダムな文字列を用いる。その文字列を元に認可サーバーに問い合わせる(= トークンイントロスペクション)と、認可に必要な情報が得られる• 内包型: JWT等のエンコード方式を用いて認可に必要な情報を内包している形式ふんわりと理解するOAuth 2.0リソースオーナー認可サーバークライアントリソースサーバー認可に関する情報
Copyright © 2023, Oracle and/or its affiliates35OAuth 2.0でエンドユーザーの認証には足りない要素を自前で補い“無理やり”実施する → OAuth認証…は、色々よろしくないということでOAuth 2.0ベースに安全に認証(ID)連携する仕様を定義 → OpenID Connect 1.0OpenID Connect 1.0 = OAuth 2.0 + IDトークン(認証連携に必要な情報をまとめたもの) + Profile APIアクセストークンとは違い、IDトークンは実装方法(エンコード方法/クレームの内容)が標準化されているふんわりと理解するOpenID Connect 1.0EnduserOpenIDProviderRelyingPartyエンドユーザーに関する情報UserinfoEndpointエンドユーザーに関する情報Profile APIOpenID Connect 1.0の肝は、• エンドユーザーの認証をRPの代わりにOPが実施すること• 認証した結果を信頼するために必要な情報(IDトークン)をOP → RPに連携すること• 信頼するために必要な情報が含まれるようにIDトークンが標準化されていること• 誰が?誰を?誰のために?どんな認証方式で?、etc.エンドユーザーに関する情報エンドユーザーに関する情報OAuth 2.0とは名前が変わる
Copyright © 2023, Oracle and/or its affiliates36参考: マイクロサービスの認証・認可とJWTJOSE, OAuth 2.0, OpenID Connect 1.0について
Copyright © 2023, Oracle and/or its affiliates37• 認可サーバー/OpenID Providerを自分たちで実装する• 認可サーバー/OpenID Providerを実装したプロダクト/サービスを用いる• Keycloak, Okta, Auth0, Identity Domains, …→ 今回のテーマは、“認可サーバー/OpenID Providerを実装したプロダクト/サービスを用いる“ことOAuth 2.0, OpenID Connect 1.0をサービスに組み込むIdentity Domains/IDCS・・・
Copyright © 2023, Oracle and/or its affiliates38• Open Source Identity and Access Management For Modern Applications and Services• CNCF incubating project• 最新版は、Version 22.0.1 (※2023/09現在)• Version 17.0.0にデフォルトのディストリビューションがWildFlyからQuarkusに• 開発者が自分で実装する必要のあるセキュリティ機能を提供• Realmという論理単位でユーザー等を管理することでマルチテナントな運用も可能とする• 様々なプラットフォームに対応• Docker, Kubernetes, OpenJDK, OpenShift, PodmanKeycloakhttps://github.com/keycloak/keycloak
Copyright © 2023, Oracle and/or its affiliates39Keycloak - Realmユーザー、資格情報、ロール、グループを管理するKeycloakの論理単位Master RealmRealm 1Realm 2Realm 3AdminUser ApplicationUser ApplicationUser Application参考: https://www.keycloak.org/docs/latest/server_admin/index.html#the-master-realm管理者アカウントが他のRealmを管理するために使用する組織内のユーザーとそれらが必要とするアプリケーションを管理
Copyright © 2023, Oracle and/or its affiliates40• Single-Sign On/Out *• Standard Protocol Support * – OpenID Connect, OAuth 2.0, SAML• Identity Brokering & Social Login * – Google, GitHub, Facebook, Twitter(X), and other IdP• User Federation – LDAP, Active Directory• Kerberos Bridge• Centralized Management for admins and users *• Theme support *• Two-factor Authentication * – Google Authenticator, FreeOTP, …参考: https://www.keycloak.org/docs/latest/server_admin/index.html#featuresKeycloakが提供するセキュリティ機能 1/2 *: 本日扱う内容
Copyright © 2023, Oracle and/or its affiliates41• Login flows *• Session Management *• Token mappers *• CORS support• Service Provider Interface(SPI)• Client adapter – JavaScript applications, Wildfly, JBoss EAP, Tomcat, Jetty, Spring, etc.• Supports any platform/language support• OpenID Connect Relying Party library *• SAML 2.0 Service Provider library参考: https://www.keycloak.org/docs/latest/server_admin/index.html#featuresKeycloakが提供するセキュリティ機能 2/2 *: 本日扱う内容
Copyright © 2023, Oracle and/or its affiliates42ユーザー向けのページのカスタマイズが可能• Account management, Admin console, Emails, Login forms, Welcome pagethemes//に必要なファイルを格納することでページのカスタマイズが可能• テーマに関する設定ファイル(theme.properties)• 静的コンテンツ(HTML, CSS, JavaScript, Image, Message Bundle, …)Keycloakが提供するセキュリティ機能テーマのカスタマイズ引用: https://www.keycloak.org/docs/22.0.1/server_development/#_themesK8s上にKeycloakを構築している場合は、• 必要なファイル(設定ファイル、静的コンテンツ)をtarやzip等にアーカイブする• アーカイブしたコンテンツをConfigMapに設定する• ConfigMapを/opt/keycloak/themes/マウントする• initContainersでコンテンツを/opt/keycloak/themes/に配置する等の対応が考えられる
Copyright © 2023, Oracle and/or its affiliates432FA = リソースやデータにアクセスするために、2 種類の本人証明を要求すること• e.g. 記憶(ID/Password)+ 所有(Authenticator)Keycloakでは、以下に対応• TOTP(Time-based)/H(Hash-based)OTP: Google Authenticator, FreeOTP• FIDO/Passkey対応のAuthenticator: Security key by Yubico, Windows Hello, iPhone, …後述するLogin flowsのカスタマイズにて、認証フローに組み込むことが可能Keycloakが提供するセキュリティ機能Two-Factor Authentication(2FA)
Copyright © 2023, Oracle and/or its affiliates44Built-inされているフローに加えて、カスタムのフローを定義することができる例• 任意のユーザーの自己登録• パスワードの回復• 電子メールの確認• パスワードの更新要求• 2FA/パスワードレス認証を実現する認証フローKeycloakが提供するセキュリティ機能Login flowsのカスタマイズ
Copyright © 2023, Oracle and/or its affiliates45管理者、ユーザー自身でセッションの参照、管理が可能Keycloakが提供するセキュリティ機能セッション管理
Copyright © 2023, Oracle and/or its affiliates46ユーザーの属性やロール、グループなどをKeycloakが払い出すトークンにマッピングできる機能例:”groups”というclaimが必要だが、Keycloak標準ではトークンに含まれないので、Keycloak内のグループを”groups” claimにマッピングするKeycloakが提供するセキュリティ機能Token mappers
Copyright © 2023, Oracle and/or its affiliates47• Keycloakの管理コンソールから設定をする• 直感的な操作で設定が行える• UIから設定したRealmの設定をエクスポートも可能• Realmを設定するための構成情報を書き、それを元に設定する• 構成情報がコードとして管理できる(= Infrastructure as Code)• 設定を投入する手段は様々• Keycloak Admin ConsoleにRealm定義(JSON)を取り込む• Keycloak Admin REST API – Realms Admin• Keycloak Operator• mrparkers/terraform-provider-keycloak• pulumi/pulumi-keycloak• …Keycloakの設定方法アレコレ
Copyright © 2023, Oracle and/or its affiliates481. Keycloak管理コンソールからPulumi用のクライアントを作成する1. 管理者権限を渡しても良いが、OIDC(Client Credentials Grant)ベースで最小限の権限を持ったクライアントを作成する方が安全にIaCツールを扱える2. 環境変数 or PulumiのConfigにURL, ClientID, ClientSecretを渡す3. packages/keycloak を参照しながらプロビジョニングしたいリソースを宣言的に定義する4. `pulumi preview`で作成されるリソースを確認する5. `pulumi up`でリソースを作成するe.g. Pulumiを用いた宣言的なKeycloakのRealm定義
Copyright © 2023, Oracle and/or its affiliates49以下の設定を持つKeycloak – Realm(OCHaCafe)を宣言的に定義、構築するDemoIaCツール(Pulumi)を用いた宣言的なKeycloakのRealm定義Master Realm Realm - OCHaCafeAdmin User Application.├── Pulumi.prod.yaml├── Pulumi.yaml├── data├── index.ts├── node_modules├── package-lock.json├── package.json├── providers└── tsconfig.jsonpulumipreview|upOpenID Connect 1.0 -Client Credentials Grantadmin/ChangeMe!!guest/ChangeMe!!Social Login – Googlecurl-rphelidon-rp
Copyright © 2023, Oracle and/or its affiliates50Democurl + KeycloakでOpenID Connect - 認可コードフローを理解するEnd-User Relying Party Identity Provider UserInfo EndpointOpenID Connectスタートリダイレクト認証リクエスト認証画面認証情報入力権限委譲の確認画面権限委譲の同意認証レスポンス(認可コード)トークンリクエストトークンリクエストトークンレスポンス(ID・アクセストークン)プロフィールの要求プロフィールの提供IDトークンの検証認可エンドポイントトークンエンドポイントリダイレクトURI
Copyright © 2023, Oracle and/or its affiliates51e.g. エンドユーザーの認証連携 ~ APIリソースの保護OAuth 2.0 + OpenID Connect 1.0Worker NodesエンドユーザーOPRP, ClientDeployment2. OIDC –AuthZ Code FlowDeploymentDeploymentRSDeployment5. AT検証Flexible LoadBalancer1. /auth/login3. /api/** w/ AT4. API Callw/ AT
Copyright © 2023, Oracle and/or its affiliates52OracleがホストするOSSプロジェクト• GitHubでソースコードを公開: https://github.com/oracle/helidonマイクロサービスアプリケーションが必要とする機能を提供するJavaライブラリの集合体• Executable JARとして動作し、コンテナ化との相性 〇• 必要なコンポーネントを追加して拡張することも可能マイクロサービスの開発・運用を支援する機能を提供• REST Client, Config, OpenAPI, GraphQL, gRPC, …• Health, Metrics(OpenMetrics), Tracing(OpenTracing), Fault Tolerance, …2つのプログラミングモデルを提供• Helidon MP: 宣言的記法(Java/Jakarta EE開発者フレンドリー)• Helidon SE: 関数型記法Helidonクラウドネイティブなマイクロサービスを開発するためのJavaアプリケーションフレームワーク
Copyright © 2023, Oracle and/or its affiliates53OpenTelemetry(OTel)• 分散トレーシングやメトリクスなどのデータを収集、処理、エクスポートするためのオープンソースプロジェクト• 2019年に、OpenCensus, OpenTracingがOpenTelemetryとして統合• MicroProfile 6.0(Helidon 4系)では、OpenTelemetryに対応! // お楽しみに!参考: Tracing(分散トレーシング)標準化について引用:https://microprofile.io/compatible/5-0/ 引用:https://microprofile.io/compatible/6-0/
Copyright © 2023, Oracle and/or its affiliates54Provider Type DescriptionOIDC Provider Authentication OIDC – 認可コードフローのサポートHTTP Basic Authentication Authentication HTTP Basic認証のサポートHTTP Digest Authentication Authentication HTTP Digest認証のサポートHeader Assertion Authentication ヘッダーの値に基づいたユーザーのアサーションHTTP Signature Authentication 署名を用いたサービス間通信の保護IDCS Roles Role Mapping 認証済みユーザーのロールをIDCSから取得ABAC Authorization Authorization 属性ベースの認可制御をサポートGoogle Login Authentication GoogleログインのサポートJWT Provider Authentication JWTの検証機能をサポートHelidon – Security Providerエンドポイント保護のためのプロバイダーを豊富に用意引用: https://helidon.io/docs/v3/#/mp/security/providers
Copyright © 2023, Oracle and/or its affiliates55Demo: エンドユーザーの認証連携 ~ APIリソースの保護OAuth 2.0 + OpenID Connect 1.0 + API GatewayWorker NodesエンドユーザーOPRP, ClientAPI GatewayFlexible LoadBalancerDeployment2. OIDC –AuthZ Code FlowDeploymentDeploymentRSDeploymentendpoints required scopes/cowsay/say cowsay:say/cowsay/think cowsay:think5. AT検証1. /auth/login3. /api/** w/ AT4. API Callw/ AT
Copyright © 2023, Oracle and/or its affiliates56• Open Source Identity and Access Management For Modern Applications and Services• IAMにおける一般的なユースケースのサポートに加え、高いカスタマイズ性を持つKeycloakまとめ
Copyright © 2023, Oracle and/or its affiliates57• OWASP API Security• https://owasp.org/API-Security/• cert-manager• https://cert-manager.io/docs/• Keycloak• https://www.keycloak.org/docs/22.0.1/server_development/• 実践 Keycloak ―OpenID Connect、OAuth 2.0を利用したモダンアプリケーションのセキュリティー保護• https://learning.oreilly.com/library/view/shi-jian-keycloak-openid/9784814400096/• デモコード• https://github.com/oracle-japan/ochacafe-secure-api参考情報
Thank youCopyright © 2023, Oracle and/or its affiliates58