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

SPIFFE in Action

SPIFFE in Action

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

Naoki Ainoya

May 14, 2019
Tweet

More Decks by Naoki Ainoya

Other Decks in Technology

Transcript

  1. SPIFFE Meetup #1 2019/05/14

    @naokiainoya
    SPIFFE in Action

    View full-size slide

  2. Naoki Ainoya / @naokiainoya
    ▶ 基盤研究開発エンジニア@ZLab
    ▶ “Kubernetes as a Service”に必要なインフラの開発に従事
    + SPIFFE/SPIREへの取り組みはその仕事のひとつ

    View full-size slide

  3. 本⽇お話したいこと
    ▶ SPIREͷ֓ཁ
    ▶ SPIREͷߏ੒ཁૉ
    ▶ SPIREͰSVIDΛൃߦ͢Δ·Ͱͷϑϩʔ
    ▶ ZLabͰͷऔΓ૊Έ
    + SPIFFE/SPIREΛ࢖༻ͨ͠OpenStackͰͷSecure Introduction
    ͷ࣮૷
    ▶ Further Challenges

    View full-size slide

  4. SPIREの概要

    View full-size slide

  5. SPIREとは
    ▶ SPIFFEの参照実装
    + https://github.com/spiffe/spire
    + golangで書かれている
    ▶ SPIFFE Workload APIを実装
    + workloadを検証(attest)し、

    SPIFFE IDとSVIDを発⾏する機能を持つ

    workload: コンテナやプロセスなどのソ
    フトウェアシステムの実⾏単位

    View full-size slide

  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/

    View full-size slide

  7. ▶ Nodeの検証->Workloadの検証の2段階
    + Workloadは検証済みのNode上でのみ
    検証可能
    ▶ Workloadの検証にあたり、事前に
    workload情報をServerに登録しておく
    必要がある
    Node/Workloadの検証(Attestation)のフロー
    1.Node Attestation
    Node Node
    2.Workload
    Registration
    3.Workload Attestation

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. Node Attestation
    ▶ Nodeのアイデンティティ検証
    + インスタンスの「⾝元」が正しいかを確
    かめるプロセス
    ▶ AWS上でのNode Attestationの例
    https://spiffe.io/spire/overview/

    View full-size slide

  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/

    View full-size slide

  12. Node Attestation on AWS
    2. 取得したインスタンスアイデンティティを
    SPIRE Serverに送信
    https://spiffe.io/spire/overview/

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  20. Workload Attestation
    ▶ Attestation済のNodeで動作する
    Workloadの検証
    ▶ unixプロセスやコンテナなどの様々な
    workloadにpluginで対応
    + Workload plugin例
    + K8s plugin
    + Unix plugin
    + Docker plugin
    https://spiffe.io/spire/overview/

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. 3. プロセスIDを元にWorkloadの情報を取得
    + 取得する情報の例
    + プロセスの実⾏ユーザ
    + 実⾏バイナリのパス

    https://github.com/spiffe/spire/blob/master/doc/
    plugin_agent_workloadattestor_unix.md
    https://spiffe.io/spire/overview/
    Workload Attestationのフロー

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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のフロー

    View full-size slide

  27. SPIREの構成要素

    View full-size slide

  28. SPIRE Serverの内部構成
    ▶ 主要な機能がプラガブルになっており

    利⽤する環境・使い⽅の差異を吸収
    + AWS/GCP/Azure/
    https://spiffe.io/spire/overview/

    View full-size slide

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

    利⽤
    https://spiffe.io/spire/overview/

    View full-size slide

  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/

    View full-size slide

  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/

    View full-size slide

  32. SPIRE Agentの内部構成
    SPIRE Serverと同様プラガブルな設計
    ▶ NodeAttestor
    ▶ WorkloadAttestor
    ▶ KeyManager
    https://spiffe.io/spire/overview/

    View full-size slide

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

    View full-size slide

  34. SPIRE Agentを構成するプラグイン
    ▶ WorkloadAttestor
    + ワークロードの検証を⾏い、
    workloadにSVIDを発⾏する
    ▶ KeyManager
    + SVID⽣成時に使⽤する鍵ペアの管理
    https://spiffe.io/spire/overview/

    View full-size slide

  35. SPIREの概要

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  38. SVID発⾏までのフロー
    2. SVIDに署名するためのCA証明書を⽣成
    + Upstream CA pluginを利⽤した場合
    は外部PKIから取得
    + Upstream CA pluginを利⽤しない場
    合は⾃⼰証明書が使われる
    https://spiffe.io/spire/overview/

    View full-size slide

  39. SVID発⾏までのフロー
    3. DataStoreを構成
    https://spiffe.io/spire/overview/

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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/

    View full-size slide

  48. Z Labでの取り組み

    View full-size slide

  49. 我々がSPIFFE/SPIREでまず実現したかったこと
    OpenStack環境でも他のクラウドプラットフォーム
    同様、以下のことを実現したかった

    ▶ インスタンス(VM)のアイデンティティ検証
    ▶ インスタンスへのシークレット導⼊(Secure
    Introduction)の仕組み
    + 既存のCIを経由したプロセスの改善
    + SVIDを利⽤したSecure Introductionの実装

    View full-size slide

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

    ▶ CIマシンにシークレットが残るリスク
    がある
    + 第⼆のシークレットストア化…

    View full-size slide

  51. 従来のSecure Introductionの問題
    ▶ CIにインスタンス管理権限やシーク
    レットへの管理権限が集中してし
    まっている

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  55. Secure Introduction構成の概要
    ▶ OpenStackとSPIREの連携
    + SPIREのNode Attestation機構
    でインスタンスのアイデン
    ティティを検証
    ▶ VaultとSPIREの連携
    + JWT-SVIDでVault認証を⾏い
    シークレット取得

    View full-size slide

  56. OpenStackとSPIREの連携
    OpenStack⽤のSPIRE Pluginを開発
    ▶ NodeAttestor plugin
    + openstack-iid-attestor
    ▶ NodeResolver plugin
    + openstack-iid-resolver

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  59. VaultとSPIREの連携
    ▶ Spire-vault-plugin
    + Upstream CA Plugin
    ▶ Svid-verification-key-sync
    + SPIREとVault間で認証情報を同
    期する仕組み
    ▶ Secret-agent
    + workloadの代⾏でVaultから
    secretを取得する仕組み

    View full-size slide

  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に署名しても
    らう機構

    View full-size slide

  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認証できる

    View full-size slide

  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認証できる

    View full-size slide

  63. Secret-agent
    ▶ (ソースコード⾮公開)
    ▶ ⾃⾝はWorkloadとして振る舞う
    ▶ ⾃⾝のSVIDでVault認証を⾏い、必
    要なシークレットを取得

    View full-size slide

  64. Further Challenges

    View full-size slide

  65. Node Attestationのプロセスをより厳格に
    ▶ 開発したOpenStack⽤のNodeAttestorは、現段階では厳密にインスタンスの⾝元
    を確認できていない
    + インスタンスIDやProject IDを確認しているだけ
    ▶ OpenStackはインスタンスの⾝元を証明する⽅法を提供していないのが根本原因
    + AWSのインスタンスアイデンティティドキュメントやGCPのインスタンスID
    トークンに相当する機構
    + もしあれば教えてください

    View full-size slide

  66. Node Attestationのプロセスをより厳格に
    ▶ VendordataのDynamicJSONを使うと良さそ

    + インスタンスのメタデータ作成時、外部
    サーバに問い合わせて動的にデータを作
    成する機能
    + インスタンス情報への署名データを埋め
    込み、検証するサーバを⽤意すればよい
    署名Server
    2. インスタンスIDへの

    署名を要求
    1. metadataサーバに

    情報を要求
    VM
    3. 署名された

    アイデンティティ

    が⼊ったメタデータ

    を返却

    View full-size slide

  67. SPIRE Server冗⻑化のためのDataStore探し
    ▶ DataStoreプラグイン
    + SQLite.PostgreSQL サポートがある
    ▶ PostgreSQLを選択したとして、そのDBインス
    タンスのアイデンティティ検証ができない
    + AWS,GCP..ならマネージドを使えばよいが…
    ▶ DataStoreプラグインの⾃作を予定
    + バックエンド案)Openstack Swift, etcd,
    Vault..
    SPIRE Server
    Trusted DataStore?

    View full-size slide

  68. まとめ
    ▶ SPIFFEの参照実装としてSPIREというものがある
    ▶ インスタンスのアイデンティティの活⽤範囲は広い
    + Z Labでの取り組みとして、Vaultと組み合わせたSecure Introductionを紹介
    + SPIFFE ID/SVIDというユニバーサルな仕様の恩恵
    ▶ エコシステムは発展途上
    + プラグイン開発などを通じて積極的にSPIFFEコミュニティへ貢献していく

    View full-size slide

  69. 参考⽂献
    ▶ 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のプラグイン含めた実装に関するドキュメント群

    View full-size slide

  70. 参考⽂献
    ▶ 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のイベントが定期的に開催されている。プロジェクトの動向を知りた
    い場合におすすめ。ネット中継あり

    View full-size slide