SPIFFE in Action

SPIFFE in Action

SPIFFE Meetup Tokyo #1 - connpass https://spiffe-jp.connpass.com/event/126507/

E32fe793290d1e72b0a78648da9c687b?s=128

Naoki Ainoya

May 14, 2019
Tweet

Transcript

  1. SPIFFE Meetup #1 2019/05/14
 @naokiainoya SPIFFE in Action

  2. Naoki Ainoya / @naokiainoya ▶ 基盤研究開発エンジニア@ZLab ▶ “Kubernetes as a

    Service”に必要なインフラの開発に従事 + SPIFFE/SPIREへの取り組みはその仕事のひとつ
  3. 本⽇お話したいこと ▶ SPIREͷ֓ཁ ▶ SPIREͷߏ੒ཁૉ ▶ SPIREͰSVIDΛൃߦ͢Δ·Ͱͷϑϩʔ ▶ ZLabͰͷऔΓ૊Έ +

    SPIFFE/SPIREΛ࢖༻ͨ͠OpenStackͰͷSecure Introduction ͷ࣮૷ ▶ Further Challenges
  4. SPIREの概要

  5. SPIREとは ▶ SPIFFEの参照実装 + https://github.com/spiffe/spire + golangで書かれている ▶ SPIFFE Workload

    APIを実装 + workloadを検証(attest)し、
 SPIFFE IDとSVIDを発⾏する機能を持つ
 workload: コンテナやプロセスなどのソ フトウェアシステムの実⾏単位
  6. SPIREの構成概略 ▶ SPIRE ServerとAgentで構成 + Agentはworkloadが動作するNode毎に動作 ▶ SPIRE Server +

    Registration API + workloadの情報管理 + Node API + SVIDへの署名 ▶ SPIRE Agent + Workload API + WorkloadへSPIFFE ID/SVIDを供給 https://spiffe.io/spire/overview/
  7. ▶ Nodeの検証->Workloadの検証の2段階 + Workloadは検証済みのNode上でのみ 検証可能 ▶ Workloadの検証にあたり、事前に workload情報をServerに登録しておく 必要がある Node/Workloadの検証(Attestation)のフロー

    1.Node Attestation Node Node 2.Workload Registration 3.Workload Attestation
  8. SPIREの主要機能 ▶ Node Attestation + Nodeのアイデンティティ検証 ▶ Workload Registration +

    Node上で動作するWorkloadのデータ登録 ▶ Workload Attestation + Workloadのアイデンティティ検証 1.Node Attestation 2.Workload Registration 3.Workload Attestation
  9. SPIREの主要機能 ▶ Node Attestation + Nodeのアイデンティティ検証 ▶ Workload Registration +

    Node上で動作するWorkloadのデータ登録 ▶ Workload Attestation + Workloadのアイデンティティ検証 1.Node Attestation 2.Workload Registration 3.Workload Attestation
  10. Node Attestation ▶ Nodeのアイデンティティ検証 + インスタンスの「⾝元」が正しいかを確 かめるプロセス ▶ AWS上でのNode Attestationの例

    https://spiffe.io/spire/overview/
  11. Node Attestation on AWS 1. Agent(インスタンス)がインスタンスのアイ デンティティを取得 + インスタンスアイデンティティ: AWSが署

    名したインスタンスのメタデータ
 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance- identity-documents.html https://spiffe.io/spire/overview/
  12. Node Attestation on AWS 2. 取得したインスタンスアイデンティティを SPIRE Serverに送信 https://spiffe.io/spire/overview/

  13. Node Attestation on AWS 3. インスタンスアイデンティティが正当なも のか署名を検証 https://spiffe.io/spire/overview/

  14. Node Attestation on AWS 4. 検証が成功したら、SPIRE Serverはインス タンスのSVIDを発⾏してNode Attestationは 完了

    https://spiffe.io/spire/overview/
  15. SPIREの主要機能 1.Node Attestation 2.Workload Registration 3.Workload Attestation ▶ Node Attestation

    + Nodeのアイデンティティ検証 ▶ Workload Registration + Node上で動作するWorkloadのデータ登録 ▶ Workload Attestation + Workloadのアイデンティティ検証
  16. Workload Registration ▶ Workloadの識別情報をRegistration Entryとして登録 ▶ SPIRE Serverがworkloadのアイデンティティを検証する際に利⽤ CLIでエントリを作成する例 Registration

    Entry
  17. Registration Entryの中⾝ ▶ Workloadの識別情報をRegistration Entryとして登録 ▶ SPIRE Serverがworkloadのアイデンティティを検証する際に利⽤ Registration Entryʹؚ·ΕΔ߲໨

    エントリ名 概要 例 SPIFFE ID Workload⾃⾝のSPIFFE ID spiffe://example.org/workload Selector Workloadのメタ情報(複数可) unix:user:nginx unix:path:/usr/bin/nginx Parent ID 親として紐付けたいエントリのSPIFFE ID Selectorの値が継承される spiffe://example.org/my-cluster
  18. Registration Entryの中⾝ ▶ Selectorはworkloadのメタ情報 ▶ Agentから送られてきたworkloadのselector情報と登録済み情報を照合し、 SVIDの発⾏可否を判断 Registration Entryʹؚ·ΕΔ߲໨ エントリ名

    概要 例 SPIFFE ID Workload⾃⾝のSPIFFE ID spiffe://example.org/workload Selector Workloadのメタ情報(複数可) unix:user:nginx unix:path:/usr/bin/nginx Parent ID 親として紐付けたいエントリのSPIFFE ID Selectorの値が継承される spiffe://example.org/my-cluster
  19. SPIREの主要機能 1.Node Attestation 2.Workload Registration 3.Workload Attestation ▶ Node Attestation

    + Nodeのアイデンティティ検証 ▶ Workload Registration + Node上で動作するWorkloadのデータ登録 ▶ Workload Attestation + Workloadのアイデンティティ検証
  20. Workload Attestation ▶ Attestation済のNodeで動作する Workloadの検証 ▶ unixプロセスやコンテナなどの様々な workloadにpluginで対応 + Workload

    plugin例 + K8s plugin + Unix plugin + Docker plugin https://spiffe.io/spire/overview/
  21. UnixプロセスのAttestationのフロー 1. Workloadが⾃⾝のSVIDをWorkload APIに 要求 + Workload APIはUnixドメインソケット として公開されておりそこにアクセス する形(

    Unix systemの場合) https://spiffe.io/spire/overview/ Workload Attestationのフロー
  22. 2. Workload Attestorは呼び出し元のプロセ スIDをUnix kernelに問い合わせ https://spiffe.io/spire/overview/ Workload Attestationのフロー

  23. 3. プロセスIDを元にWorkloadの情報を取得 + 取得する情報の例 + プロセスの実⾏ユーザ + 実⾏バイナリのパス
 https://github.com/spiffe/spire/blob/master/doc/ plugin_agent_workloadattestor_unix.md

    https://spiffe.io/spire/overview/ Workload Attestationのフロー
  24. 4. 取得したプロセスの情報をWorkloadの Selector情報として格納 https://spiffe.io/spire/overview/ Workload Attestationのフロー

  25. 5. WorkloadのSelector情報とSPIRE Server のRegistration Entryを照合し、合致する SVIDをWorkloadに渡してAttestation完了 + AgentにはSVIDをキャッシュする機構 が備わっており都度Serverに要求しな くてもいいようになっている

    https://spiffe.io/spire/overview/ Workload Attestationのフロー
  26. K8sのWorkload Attestation 1. cgroupから得られるpod idと呼び出し元 のpod idを照合 2. Pod idをキーにしてkubeletにpodの情報

    を取得 3. podの情報をworkloadのselector情報と して格納
 https://github.com/spiffe/spire/blob/master/doc/ plugin_agent_workloadattestor_k8s.md https://spiffe.io/spire/overview/ Workload Attestationのフロー
  27. SPIREの構成要素

  28. SPIRE Serverの内部構成 ▶ 主要な機能がプラガブルになっており
 利⽤する環境・使い⽅の差異を吸収 + AWS/GCP/Azure/ https://spiffe.io/spire/overview/

  29. SPIRE Serverを構成するプラグイン ▶ Datastore + Selectorのデータなどを永続化 ▶ KeyManager + SVID署名時に利⽤する鍵ペアの管理

    ▶ Upstream CA + SVIDのCAを外部のPKI配下にする場合に
 利⽤ https://spiffe.io/spire/overview/
  30. SPIRE Serverを構成するプラグイン ▶ NodeAttestor + Nodeの⾝元を検証する + 例)GCPインスタンス⽤のプラグイン + インスタンスIDトークンを検証し


    インスタンスのアイデンティティを
 確認
 https://github.com/spiffe/spire/blob/master/doc/ plugin_agent_nodeattestor_gcp_iit.md https://spiffe.io/spire/overview/
  31. SPIRE Serverを構成するプラグイン ▶ NodeResolver + Nodeに紐づくメタデータを取得して
 Selectorとして格納する + 例)AWS⽤のプラグイン +

    インスタンスの各情報を取得 + セキュリティグループ名/ID + タグ情報etc..
 https://github.com/spiffe/spire/blob/master/doc/ plugin_server_noderesolver_aws_iid.md
 https://spiffe.io/spire/overview/
  32. SPIRE Agentの内部構成 SPIRE Serverと同様プラガブルな設計 ▶ NodeAttestor ▶ WorkloadAttestor ▶ KeyManager

    https://spiffe.io/spire/overview/
  33. SPIRE Agentを構成するプラグイン ▶ NodeAttestor + ServerのNodeAttestorと同等 + ただし検証はせず、証明情報を取得 してServerに送るのみ +

    検証はServer側で⾏われる https://spiffe.io/spire/overview/
  34. SPIRE Agentを構成するプラグイン ▶ WorkloadAttestor + ワークロードの検証を⾏い、 workloadにSVIDを発⾏する ▶ KeyManager +

    SVID⽣成時に使⽤する鍵ペアの管理 https://spiffe.io/spire/overview/
  35. SPIREの概要

  36. SVID発⾏までのフローをまとめておさらい ▶ SPIRE Server起動からWorkloadにSVID を発⾏するまでの⼀連の流れをおさら いしてみます + AWSでの流れを例にしています https://spiffe.io/spire/overview/

  37. SVID発⾏までのフロー 1. SPIRE Server起動 https://spiffe.io/spire/overview/

  38. SVID発⾏までのフロー 2. SVIDに署名するためのCA証明書を⽣成 + Upstream CA pluginを利⽤した場合 は外部PKIから取得 + Upstream

    CA pluginを利⽤しない場 合は⾃⼰証明書が使われる https://spiffe.io/spire/overview/
  39. SVID発⾏までのフロー 3. DataStoreを構成 https://spiffe.io/spire/overview/

  40. SVID発⾏までのフロー 4. Registration APIを通じてWorkloadの Entryが登録可能になる https://spiffe.io/spire/overview/

  41. SVID発⾏までのフロー 5. Workloadが動作するインスタンスが起 動。SPIRE Agentもその上で起動する https://spiffe.io/spire/overview/

  42. SVID発⾏までのフロー 6. Agentは⾃⾝の動作するNodeの⾝元を 証明する情報としてインスタンスアイ デンティティをServerに送信 https://spiffe.io/spire/overview/

  43. SVID発⾏までのフロー 7. Serverは受信したインスタンスアイデ ンティティドキュメントの正当性を AWS APIに問い合わせつつ検証 https://spiffe.io/spire/overview/

  44. SVID発⾏までのフロー 8. 検証に成功したら、インスタンスに紐 づく追加情報を取得し、Selectorとし て登録エントリを更新する + セキュリティグループID + インスタンスタグ https://spiffe.io/spire/overview/

  45. SVID発⾏までのフロー 9. Node Attestationに成功したのでServer はAgentにSVIDを発⾏ https://spiffe.io/spire/overview/

  46. SVID発⾏までのフロー 10.Workload Attestation開始。Workload はWorkload APIを呼び出してSVIDを要 求する https://spiffe.io/spire/overview/

  47. SVID発⾏までのフロー 11.Workload AttestorはWorkloadのプロ セスIDを取得 12.プロセスIDをもとにプロセス情報 (ユーザID,バイナリのパスetc..)を Selectorとして取得 13.得られたWorkloadのSelectorと登録済 みEntryを照合 14.合致するSVIDをWorkloadに返却して

    Workload Attestation完了 https://spiffe.io/spire/overview/
  48. Z Labでの取り組み

  49. 我々がSPIFFE/SPIREでまず実現したかったこと OpenStack環境でも他のクラウドプラットフォーム 同様、以下のことを実現したかった
 ▶ インスタンス(VM)のアイデンティティ検証 ▶ インスタンスへのシークレット導⼊(Secure Introduction)の仕組み + 既存のCIを経由したプロセスの改善

    + SVIDを利⽤したSecure Introductionの実装
  50. 従来のSecure Introductionの問題 ▶ インスタンス構築時、ミドルウェアの 動作に必要なシークレット情報をCI経 由で渡していた ▶ シークレット情報がCIマシンを経由す る ▶

    CIマシンにシークレットが残るリスク がある + 第⼆のシークレットストア化…
  51. 従来のSecure Introductionの問題 ▶ CIにインスタンス管理権限やシーク レットへの管理権限が集中してし まっている

  52. 望ましいSecure Introductionのプロセス ▶ シークレット情報をCIマシン経由 にしない ▶ インスタンスが直接Vaultからシー クレットを取得できるようにした い

  53. Secure Introduction with SPIFFE/SPIRE ▶ SPIREの機構を利⽤してOpenStackイ ンスタンスのアイデンティティ検証を ⾏う

  54. SPIFFE/SPIREを使⽤した OpenStackでのSecure Introductionの実装

  55. Secure Introduction構成の概要 ▶ OpenStackとSPIREの連携 + SPIREのNode Attestation機構 でインスタンスのアイデン ティティを検証 ▶

    VaultとSPIREの連携 + JWT-SVIDでVault認証を⾏い シークレット取得
  56. OpenStackとSPIREの連携 OpenStack⽤のSPIRE Pluginを開発 ▶ NodeAttestor plugin + openstack-iid-attestor ▶ NodeResolver

    plugin + openstack-iid-resolver
  57. Openstack-iid-attestor ▶ https://github.com/zlabjp/spire- openstack-plugin + Attestation の際、OpensStack APIを利 ⽤しInstance IDとProject

    IDを照合
  58. Openstack-iid-resolver ▶ https://github.com/zlabjp/spire- openstack-plugin + OpenStack APIからインスタンスメタ データ、セキュリティグループ情報を 取得してSelectorとして保存

  59. VaultとSPIREの連携 ▶ Spire-vault-plugin + Upstream CA Plugin ▶ Svid-verification-key-sync +

    SPIREとVault間で認証情報を同 期する仕組み ▶ Secret-agent + workloadの代⾏でVaultから secretを取得する仕組み
  60. Spire-vault-plugin ▶ https://github.com/zlabjp/spire- vault-plugin ▶ Upstream CA Plugin + VaultのPKI

    Secret Engineを利⽤ + https://www.vaultproject.io/docs/secrets/pki/index.html + SPIRE Serverが⾃⾝のCA証明書の CSRを作成し、Vaultに署名しても らう機構
  61. Svid-verification-key-sync ▶ (ソースコード⾮公開) ▶ VaultのJWT Auth MethodとSPIREのJWT SVIDの 認証⽤公開鍵を同期する機構 +

    x.509 SVIDとVaultのTLS Auth Methodを利⽤ しないのは、x.509 SVIDのCommon Nameが 設定されていない仕様だったためVault側の 要求と噛み合わなかった + (注)現在はx.509 SVIDのCommon Nameに値 を設定できるようになっている
 https://github.com/spiffe/spire/pull/798 SPIRE Server ①JWT SVIDの 公開鍵を
 JWT Auth Methodに
 同期 Workload ②JWT SVIDで
 Vault認証できる
  62. Svid-verification-key-sync ▶ VaultのJWT Auth Methodに新しい拡張が⼊り、 JSON Web Key Set (JWKS)を外部サーバに問い

    合わせできるようになった
 https://github.com/hashicorp/vault-plugin- auth-jwt/pull/43 + 今後は、この仕組みを使うように修正予定 SPIRE Server+JWKS ①JWT Auth Method 認証時、公開鍵リス トを照合 Workload ②JWT SVIDで
 Vault認証できる
  63. Secret-agent ▶ (ソースコード⾮公開) ▶ ⾃⾝はWorkloadとして振る舞う ▶ ⾃⾝のSVIDでVault認証を⾏い、必 要なシークレットを取得

  64. Further Challenges

  65. Node Attestationのプロセスをより厳格に ▶ 開発したOpenStack⽤のNodeAttestorは、現段階では厳密にインスタンスの⾝元 を確認できていない + インスタンスIDやProject IDを確認しているだけ ▶ OpenStackはインスタンスの⾝元を証明する⽅法を提供していないのが根本原因

    + AWSのインスタンスアイデンティティドキュメントやGCPのインスタンスID トークンに相当する機構 + もしあれば教えてください
  66. Node Attestationのプロセスをより厳格に ▶ VendordataのDynamicJSONを使うと良さそ う + インスタンスのメタデータ作成時、外部 サーバに問い合わせて動的にデータを作 成する機能 +

    インスタンス情報への署名データを埋め 込み、検証するサーバを⽤意すればよい 署名Server 2. インスタンスIDへの
 署名を要求 1. metadataサーバに
 情報を要求 VM 3. 署名された
 アイデンティティ
 が⼊ったメタデータ
 を返却
  67. SPIRE Server冗⻑化のためのDataStore探し ▶ DataStoreプラグイン + SQLite.PostgreSQL サポートがある ▶ PostgreSQLを選択したとして、そのDBインス タンスのアイデンティティ検証ができない

    + AWS,GCP..ならマネージドを使えばよいが… ▶ DataStoreプラグインの⾃作を予定 + バックエンド案)Openstack Swift, etcd, Vault.. SPIRE Server Trusted DataStore?
  68. まとめ

  69. まとめ ▶ SPIFFEの参照実装としてSPIREというものがある ▶ インスタンスのアイデンティティの活⽤範囲は広い + Z Labでの取り組みとして、Vaultと組み合わせたSecure Introductionを紹介 +

    SPIFFE ID/SVIDというユニバーサルな仕様の恩恵 ▶ エコシステムは発展途上 + プラグイン開発などを通じて積極的にSPIFFEコミュニティへ貢献していく
  70. Appendix

  71. 参考⽂献 ▶ SPIFFE ‒ Secure Production Identity Framework for Everyone


    https://spiffe.io/spire/overview/ + SPIREの概要が⼀通り書かれている。このスライドのほとんどは本資料から引 ⽤ ▶ spire/SPIRE101.md at master · spiffe/spire
 https://github.com/spiffe/spire/blob/master/doc/SPIRE101.md ▶ spire/doc at master · spiffe/spire
 https://github.com/spiffe/spire/tree/master/doc + SPIREのプラグイン含めた実装に関するドキュメント群
  72. 参考⽂献 ▶ scytale.io
 https://blog.scytale.io/ + SPIFFE/SPIREプロジェクトに⼒を注いでいるscytale.io社のブログ ▶ SPIFFE Community Day

    May 2019: Recap and Videos ‒ scytale.io
 https://blog.scytale.io/spiffe-community-day-may-2019-recap-and- videos-61a672e0c728 + SPIFFEのイベントが定期的に開催されている。プロジェクトの動向を知りた い場合におすすめ。ネット中継あり