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

SPIRE Updates

SPIRE Updates

SPIFFE Meetup Tokyo #3 で発表したスライドとなります。
https://spiffe-jp.connpass.com/event/205213/

発表時の録画は以下を参照ください。
https://youtu.be/idKs7wK7dOI

Ryuma Yoshida

April 20, 2021
Tweet

More Decks by Ryuma Yoshida

Other Decks in Technology

Transcript

  1. ゼットラボ株式会社 ▶ 2015年に設⽴されたヤフー株式会社100%⼦会社 + ヤフーの⼤規模インフラを⽀える基盤開発と R&D を実施 ▶ 代表的なプロダクト +

    Kubernetes as a Service(KaaS) + ZAP(KaaS ベースのアプリケーション実⾏基盤) + ZAP は Z Lab の新しいプロダクト ▶ これまでの取り組みは会社ホームページの News を参照 + https://zlab.co.jp ▶ R&D で得られたナレッジは Qiita で外部発信 + https://qiita.com/organizations/zlab
  2. SPIRE Server の API のリファクタリング ▶ 従来の SPIRE Server の

    API には課題があった + リソース志向な設計になっていない + 例) エントリー管理⽤途の Registration API で Join Token ⽣成や Bundle 管理 + アクセス制御機能を提供するにも権限を細分化することが難しい ▶ コミュニティでの議論を経てリソース志向な API にリファクタリング + Agent、Bundle、Entry、SVID のようにリソース単位で API を細分化 + API のサービス定義は https://github.com/spi ff e/spire-api-sdk で管理 ▶ リファクタリングに関する議論は https://github.com/spi ff e/spire/issues/1057 を参照
  3. Nested SPIRE 構成での JWT SVID サポート ▶ 異なる SPIRE Server

    で発⾏された JWT SVID を検証できない問題が⻑らく課題となっていた + https://github.com/spi ff e/spire/issues/1190 ▶ この課題は SPIRE と JWT の仕様に起因していた + SPIRE Server は SVID の署名に使⽤する鍵をプロセス単位で独⾃に持つ + JWT は X.509 証明書のようなトラストチェーンの仕組みを持っていない ▶ この課題を解決するために開発されたのが UpstreamAuthority プラグイン + SPIRE Server が独⾃に持つ JWT SVID の検証鍵を異なる SPIRE Server に配布する仕組みを実装 + 検証鍵の配布機能を追加する形で UpstreamCA プラグインを UpstreamAuthority プラグインに置き換え ▶ 現時点では検証鍵の配布機能が実装されているのは UpstreamAuthority “spire” プラグインのみ + Nested SPIRE 構成を採⽤することで JWT SVID の課題をクリアできる SPIRE Server SPIRE Server SPIRE Server Nested SPIRE 構成
  4. クライアントライブラリの改善 ▶ Go SPIFFE v2 のリリース + v1 は柔軟性に⽋けていて Federation

    や JWT SVID サポートなど重要な機能が未実装な状態だった + v1 が抱えていた課題を解決するためにゼロから再設計して v2 を開発 + 利⽤しやすいように High Level と Low Level の別タイプの API クライアントを提供 + ドキュメント、テスト、実装例も拡充 + 詳細は https://github.com/spi ff e/go-spi ff e/tree/master/v2 を参照 ▶ Java SPIFFE の改善 + 新しいインターフェースが追加されて機能性が向上 + リファクタリングが実施されてモジュール性が向上、同時にテストも拡充 + 詳細は https://github.com/spi ff e/java-spi ff e/pull/22 を参照
  5. ドキュメントの拡充 ▶ v1.0.0 リリースに向けたドキュメント整備 + メンテナンスのガイドライン + バージョニングとリリースサイクル ▶ 不⾜していたドキュメントを追加

    + SPIRE Server の冗⻑化とデプロイパターン + SPIRE Server と SPIRE Agent のモニタリング⽅法 + その他 多数 ▶ よく使⽤されるユースケースのチュートリアルを追加 + Envoy の SPIRE 連携 + Nested SPIRE と Federated SPIRE + OIDC 認証 + その他 多数
  6. ▶ v0.12.2( 2021-04-15 JST ) ▶ v0.12.1 / v0.11.3 /

    v0.10.2( 2021-03-05 JST ) ▶ v0.12.0( 2020-12-19 JST ) ▶ v0.11.2( 2020-10-30 JST ) ▶ v0.11.1( 2020-10-01 JST ) ▶ v0.11.0( 2020-09-01 JST ) ▶ v0.10.1( 2020-06-24 JST ) ▶ v0.10.0( 2020-04-23 JST ) 2020年6⽉に CNCF の Sandbox プロジェクトから Incubating プロジェクトに昇格 この1年で3度のマイナーバージョンアップ(v0.10.x, v0.11.x, v0.12.x)を実施
  7. ▶ v0.12.2( 2021-04-15 JST ) ▶ v0.12.1 / v0.11.3 /

    v0.10.2( 2021-03-05 JST ) ▶ v0.12.0( 2020-12-19 JST ) ▶ v0.11.2( 2020-10-30 JST ) ▶ v0.11.1( 2020-10-01 JST ) ▶ v0.11.0( 2020-09-01 JST ) ▶ v0.10.1( 2020-06-24 JST ) ▶ v0.10.0( 2020-04-23 JST ) + Nested SPIRE 構成での JWT SVID サポート(#1190, その他) + UpstreamAuthority プラグインの開発(#1190, その他) + SPIRE Server の実装が改善されてデータベースの読み取り負荷が約 1/5 に軽減(#1439) + Registration Entry の変更に応じた SPIRE Agent の SVID キャッシュ機能の改善 (#1441, #1477) + 設定ファイルでの環境変数展開と CLI によるバリデーション(#1453, #1471, #1489) ※ 他の変更点は対象バージョンのリリースノートを参照
  8. ▶ v0.12.2( 2021-04-15 JST ) ▶ v0.12.1 / v0.11.3 /

    v0.10.2( 2021-03-05 JST ) ▶ v0.12.0( 2020-12-19 JST ) ▶ v0.11.2( 2020-10-30 JST ) ▶ v0.11.1( 2020-10-01 JST ) ▶ v0.11.0( 2020-09-01 JST ) ▶ v0.10.1( 2020-06-24 JST ) + UpstreamAuthority “vault” プラグインのサポート(#1611, #1632) + Z Lab で開発した https://github.com/zlabjp/spire-vault-plugin がアップストリームに取り込まれた + 現在も継続的に UpstreamAuthority “vault” プラグインへのコントリビュートを実施している + SPIRE Agent での Envoy の SDS サポートが常時有効になる(#1579) + SPIRE では X.509 SVID を SDS の API を介して Envoy にセットする機能がサポートされている ▶ v0.10.0( 2020-04-23 JST ) ※ 他の変更点は対象バージョンのリリースノートを参照
  9. ▶ v0.12.2( 2021-04-15 JST ) ▶ v0.12.1 / v0.11.3 /

    v0.10.2( 2021-03-05 JST ) ▶ v0.12.0( 2020-12-19 JST ) ▶ v0.11.2( 2020-10-30 JST ) ▶ v0.11.1( 2020-10-01 JST ) ▶ v0.11.0( 2020-09-01 JST ) + SPIRE Server の API のリファクタリング(#1057, その他) + WorkloadAttestor “unix” プラグインで Linux の補助グループのセレクターをサポート(#1771) + Kubernetes Workload Registrar で CRD モードと Reconcile モードをサポート(#1581, #1761) + Federation が実験的機能から標準機能に昇格(#1656, #1737, #1777) + DataStore プラグインから拡張性が削除されてプラグインに使⽤制限(#1707) + ビルトインされた DataStore “sql” プラグインしか利⽤できなくなった ▶ v0.10.1( 2020-06-24 JST ) ▶ v0.10.0( 2020-04-23 JST ) ※ 他の変更点は対象バージョンのリリースノートを参照
  10. ▶ v0.12.2( 2021-04-15 JST ) ▶ v0.12.1 / v0.11.3 /

    v0.10.2( 2021-03-05 JST ) ▶ v0.12.0( 2020-12-19 JST ) ▶ v0.11.2( 2020-10-30 JST ) ▶ v0.11.1( 2020-10-01 JST ) + UpstreamAuthority “aws_pca” プラグインで Trust Bundle に任意の CA 追加をサポート(#1574) + Node Attestation リクエストのレート制限の無効化をサポート(#1794, #1870) + 有効化されている場合は IP 単位で 1秒に 1 Node Attestation というレート制限が掛かる ▶ v0.11.0( 2020-09-01 JST ) ▶ v0.10.1( 2020-06-24 JST ) ▶ v0.10.0( 2020-04-23 JST ) ※ 他の変更点は対象バージョンのリリースノートを参照
  11. ▶ v0.12.2( 2021-04-15 JST ) ▶ v0.12.1 / v0.11.3 /

    v0.10.2( 2021-03-05 JST ) ▶ v0.12.0( 2020-12-19 JST ) ▶ v0.11.2( 2020-10-30 JST ) + レート制限を⾏う処理のエラーメッセージのロギング改善(#1901) + SPIRE Server で⼤量のログが出⼒される課題の解決 ▶ v0.11.1( 2020-10-01 JST ) ▶ v0.11.0( 2020-09-01 JST ) ▶ v0.10.1( 2020-06-24 JST ) ▶ v0.10.0( 2020-04-23 JST ) ※ 他の変更点は対象バージョンのリリースノートを参照
  12. ▶ v0.12.2( 2021-04-15 JST ) ▶ v0.12.1 / v0.11.3 /

    v0.10.2( 2021-03-05 JST ) ▶ v0.12.0( 2020-12-19 JST ) + SPIRE Server と SPIRE Agent でデバッグ⽤のエンドポイントをサポート(#1792) + SPIRE Agent に多くのエントリーが紐付いている際の⼤幅なパフォーマンス改善(#1859, その他) + SPIRE Server が DataStore 読み込みを数秒毎に定期実⾏してデータをキャッシュするようになった + 都度読込ではなく定期実⾏になったので SPIRE Server と SPIRE Agent のデータ同期が多少遅延する仕様 + UpstreamAuthority “vault” プラグインでの Vault の認証周りと証明書チェーン制御周りの改善 (#1871, その他) + SPIRE Server の古い API である Registration API と Node API が⾮推奨となる(#1997) + SPIRE Agent で再 Node Attestation が必要になったら SVID が削除されて停⽌するようになった(#1797) ▶ v0.11.2( 2020-10-30 JST ) ▶ v0.11.1( 2020-10-01 JST ) ▶ v0.11.0( 2020-09-01 JST ) ▶ v0.10.1( 2020-06-24 JST ) ▶ v0.10.0( 2020-04-23 JST ) ※ 他の変更点は対象バージョンのリリースノートを参照
  13. ▶ v0.12.2( 2021-04-15 JST ) ▶ v0.12.1 / v0.11.3 /

    v0.10.2( 2021-03-05 JST ) + CVE 対応のセキュリティアップデート + CVE-2021-27098: https://github.com/spi ff e/spire/security/advisories/GHSA-h746-rm5q-8mgq + CVE-2021-27099: https://github.com/spi ff e/spire/security/advisories/GHSA-q7gm-mjrg-44h9 ▶ v0.12.0( 2020-12-19 JST ) ▶ v0.11.2( 2020-10-30 JST ) ▶ v0.11.1( 2020-10-01 JST ) ▶ v0.11.0( 2020-09-01 JST ) ▶ v0.10.1( 2020-06-24 JST ) ▶ v0.10.0( 2020-04-23 JST ) ※ 他の変更点は対象バージョンのリリースノートを参照
  14. ▶ v0.12.2( 2021-04-15 JST ) + KeyManager “aws_kms” プラグインのサポート(#2066) +

    AWS Key Management Service で SVID 署名鍵を管理できるようになった + SVID 署名を外部サービスに委譲できる初めてのプラグイン + UpstreamAuthority “gcp_cas” プラグインのサポート(#2172) + Google Cloud の Certi fi cate Authority Service で作成した CA を上位 CA に設定できるようになった + Noti fi er “k8sbundle” プラグインで Admission Webhooks の CA Bundle ローテーションをサポート(#2022) + SVID 署名のレート制限の無効化をサポート(#2142) + 有効化されている場合は IP 単位で 1秒に 500 署名リクエストというレート制限が掛かる ▶ v0.12.1 / v0.11.3 / v0.10.2( 2021-03-05 JST ) ▶ v0.12.0( 2020-12-19 JST ) ▶ v0.11.2( 2020-10-30 JST ) ▶ v0.11.1( 2020-10-01 JST ) ▶ v0.11.0( 2020-09-01 JST ) ▶ v0.10.1( 2020-06-24 JST ) ※ 他の変更点は対象バージョンのリリースノートを参照
  15. サーバーレス環境のサポート(#1843) ▶ 現在 SPIRE ではサーバーレス環境のワークロードに SVID を配布する仕組みが実装されていない + ワークロードを実⾏するホストで SPIRE

    Agent を稼働させる SPIRE の仕様が適合できない + Workload API を介した SVID 配布ではなく別の仕組みが必要となる ▶ SPIRE Server から任意の外部シークレットストアに SVID を保存する仕組みが設計された + 例) AWS Secrets Manager、Google Cloud Secret Manager ▶ サーバーレス環境のワークロードはシークレットストアから SVID を取得する + AWS Lambda であれば AWS Secrets Manager から SVID 取得 + Google Cloud Functions であれば Google Cloud Secret Manager から SVID 取得 ▶ この仕組みは SPIRE Agent を稼働させることが難しい機密性が⾼い環境にも応⽤できる可能性アリ ▶ サーバーレス環境のサポートに向けたタスクは https://github.com/spi ff e/spire/projects/9 を参照
  16. TPM を利⽤した Node Attestation(#1003) ▶ Trusted Platform Module(TPM)= 機密情報を安全に管理するためのセキュリティモジュール +

    鍵管理や署名検証などのセキュリティ機能が搭載されている + マザーボードに直接取り付けられており OS や他のハードウェアからアクセス不可能なのでセキュア ▶ TPM ベースの X.509 証明書と秘密鍵で Node Attestaion を実⾏する仕組みの提案 + Node Attestation に利⽤する Attestation Data を安全に管理することが⽬的 + 基本的な仕組みは X.509 証明書と秘密鍵の所有を検証する NodeAttestor “sshpop” / “x509pop” と同じ + サードパーティ製として Bloomberg 社から NodeAttestor “tpm” プラグインが公開されていたりする + https://github.com/bloomberg/spire-tpm-plugin ▶ 業界標準に沿った実装の提案を元にコミュニティで議論が進められている + IEEE 802.1 WG が公開している “Standard for Local and Metropolitan Area Networks - Secure Device Identity” + Trusted Computing Group(TCG)が公開している “TPM 2.0 Keys for Device Identity and Attestation”
  17. DataStore プラグインの改良(#1945) ▶ 現在 DataStore プラグインでは拡張性がサポートされていない + SPIRE 利⽤者が独⾃のプラグインを開発できない +

    ビルトインされた DataStore “sql” プラグインしか利⽤できない + SQLite、MySQL、PostgreSQL をサポート ▶ DataStore プラグインを拡張性を持った作りに改良する提案 + SQL ストアと KV ストアの両⽅をサポートするシンプルなインターフェースが求められる + 設計を⾒直して新たに SQL プラグインと KV プラグインを開発することが提案されている + 実現されれば etcd などの KV ストアを SPIRE Server のデータストアとして利⽤可能になる ▶ KV ストアをサポートする上で重要な検討事項を整理しながら議論が進められている
  18. SVID 署名鍵の強制ローテーションと強制失効(#1934) ▶ SVID 署名鍵が漏洩した際に迅速な対応ができる仕組みの提案 + 最初のスコープは署名鍵の強制ローテーションと強制失効 + SPIRE Agent

    と Workload の SVID 失効や CRL サポートなどはスコープ外 + 署名鍵が盗まれるとワークロードのなりすましが可能になり⾮常に危険な状態 ▶ SPIRE Server の署名鍵のローテーション機能と失効機能を任意のタイミングで実⾏できるイメージ + 通常時は旧署名鍵の有効期限 1/2 で新署名鍵が⽣成されて 1/6 で署名鍵を切り替わる仕様 ▶ 実装⽅針を固めるために考慮事項を整理しながら議論が進められている + 新署名鍵の検証鍵が SPIRE Agent や Federation したシステムに “⼗分” 伝搬されたかを把握する仕組みが必要 + SPIRE Agent に旧署名鍵の失効を通知して SVID ローテーションや旧検証鍵の削除を実⾏させる仕組みが必要 + 強制ローテーションと強制失効により SPIRE Server へのリクエストが増加して負荷が⾼まること + その他 多数
  19. Certi fi cate Transparency のサポート(#1858) ▶ 証明書発⾏を監査する仕組みである Certi fi cate

    Transparency(CT)をサポートする提案 + CT が利⽤できると SPIRE から発⾏された全ての X.509 SVID が監査可能になる + X.509 SVID の誤発⾏や悪意がある発⾏のリスクを軽減できる ▶ SPIRE Server が SVID を発⾏したら外部の CT サーバーに発⾏記録を登録する仕組みが提案されている + CT サーバーから返された SCT は X.509 SVID の x509v3 拡張属性の新フィールドに格納 + SCT = Signed Certi fi cate Timestamp + SCT フィールドを持った SVID のみを信⽤された証明書として扱う ▶ 新しいプラグインを開発する議論が進められている + CT サーバーと通信して SVID を記録する機能 + SCT を取得して SVID に SCT フィールドを追加する機能
  20. Break-glass モード(#1542) ▶ SPIRE Server で障害が発⽣すると最悪の場合サービスの障害に直結すること予想される + ワークロードへの SVID 配布やローテーションが停⽌

    + SVID の期限が切れてワークロード間の相互認証などが失敗する可能性がある ▶ SPIRE Server の障害時でもワークロードへの SVID 提供が続けられる仕組みが提案されている + SPIRE Server で不具合が発⽣していたら SPIRE Agent の ID 検証を緩和するなど + この仕組みが有効な状態を Break-glass モードと呼んでいる ▶ SPIRE における障害の定義や Break-glass モードの実装⽅法を整理しながら議論が進められている ▶ “Break-glass” という⽤語は⽕災報知器などが設置されたガラス全⾯にある記載に由来している + 緊急時には誰でもアクセスできるがガラスがあることで簡単にアクセスできない && 記録が残る仕組み + https://www.dictionary.com/e/slang/break-the-glass/ + Break-Glass Access Control Models という⽤語も存在していた + https://en.wikipedia.org/wiki/Computer_access_control#Break-Glass_Access_Control_Models
  21. まとめ ▶ SPIRE の注⽬すべき変更点 + SPIRE Server の API のリファクタリング

    + Nested SPIRE 構成での JWT SVID サポート + クライアントライブラリの改善 + ドキュメントの拡充 ▶ SPIRE の直近のリリース状況 + CNCF の Incubating プロジェクトに昇格 + この1年で3度のマイナーバージョンアップ ▶ SPIRE に今後実装が予定されている機能 + サーバーレス環境のサポート + TPM を利⽤した Node Attestation + DataStore プラグインの改良 + SVID 署名鍵の強制ローテーションと強制失効 + Certi fi cate Transparency のサポート + Break-glass モード
  22. まとめ ▶ SPIRE の注⽬すべき変更点 + SPIRE Server の API のリファクタリング

    + Nested SPIRE 構成での JWT SVID サポート + クライアントライブラリの改善 + ドキュメントの拡充 ▶ SPIRE の直近のリリース状況 + CNCF の Incubating プロジェクトに昇格 + この1年で3度のマイナーバージョンアップ ▶ SPIRE に今後実装が予定されている機能 + サーバーレス環境のサポート + TPM を利⽤した Node Attestation + DataStore プラグインの改良 + SVID 署名鍵の強制ローテーションと強制失効 + Certi fi cate Transparency のサポート + Break-glass モード SPIRE の開発は活発に進められており v1.0.0 がリリースされる⽇も近い
  23. まとめ ▶ SPIRE の注⽬すべき変更点 + SPIRE Server の API のリファクタリング

    + Nested SPIRE 構成での JWT SVID サポート + クライアントライブラリの改善 + ドキュメントの拡充 ▶ SPIRE の直近のリリース状況 + CNCF の Incubating プロジェクトに昇格 + この1年で3度のマイナーバージョンアップ ▶ SPIRE に今後実装が予定されている機能 + サーバーレス環境のサポート + TPM を利⽤した Node Attestation + DataStore プラグインの改良 + SVID 署名鍵の強制ローテーションと強制失効 + Certi fi cate Transparency のサポート + Break-glass モード Z Lab は今後も SPIFFE/SPIRE への コントリビュートを継続していく