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

Challenging Multiple SPIRE Server

Challenging Multiple SPIRE Server

SPIFEF Meetup Tokyo #2 での発表資料です。

Tomoya Usami

October 02, 2019
Tweet

More Decks by Tomoya Usami

Other Decks in Technology

Transcript

  1. Tomoya Usami / @hiyosi ▶ Intro SPIFFE + https://speakerdeck.com/hiyosi/intro-spiffe ▶

    Challenging Secure Introduction With SPIFFE + https://speakerdeck.com/hiyosi/challenging- secure-introduction-with-spiffe
  2. Node Attestation成功後、AgentはServerとの接続を維持して情報を更新する SPIREのコンポーネントと役割 SPIRE Server SPIRE Agent Workload Node SVIDの更新、

    Nodeに紐づくWorkload情報の更新
 (SVIDs, Selectors) SVID Workload Attestation Node Node Attestation (1) (2) (3) (4) (5) (6)
  3. Agentは起動しているが既存WorkloadがSVIDをローテーションできない Node Attestation成功後に接続断 SPIRE Server SPIRE Agent Workload SVID Workload

    Attestation Node 古いSVIDやSelector情報しか 持っていない Node SVIDの更新、 Nodeに紐づくWorkload情報の更新
 (SVIDs, Selectors ) mTLS
  4. Agentは起動しているが新規WorkloadをAttestationできない Node Attestation成功後に接続断 SPIRE Server SPIRE Agent Workload Workload Attestation

    Node 知らないWorkload Node SVIDの更新、 Nodeに紐づくWorkload情報の更新
 (SVIDs, Selectors ) mTLS Workloadの登録
  5. Agent - Server 間の通信 ▶ Node Attestation時の通信 + Agent -

    Server 間は単なるTLS通信 + Agentはサーバ証明書を検証する ▶ Node Attestation後のSVID更新、Workload情報の同期のための通信 + Agent - Server はmTLS通信 + AgentとServerはお互いの証明書を検証する + ServerはAgentを識別(ノードを識別)できるので、ノードに紐づいたワーク ロード情報を返す
  6. SPIRE ServerによるSVIDの発⾏ Server Upstream CA Disk/Memory Datastore Agent SVID Key

    Pair Attestation情報 , Bundles, etc 既存PKIに合流する場合 CA API Server SVID TLS/mTLS CA Cert
  7. Serverの証明書を検証する(Node Attest前) SPIRE Server SPIRE Agent Server SVID agent.conf 


    agent {
 … trust_bundle_path=server_upstream.pem
 … } Sever SVIDはAgentの設定ファイルで指定した証明書で検証する
  8. Serverの証明書を検証する (Node Attest前) agent.conf 
 agent {
 … trust_bundle_path=server_upstream.pem
 …

    } Server
 CA Upstream CA Server Cert Server
 CA Upstream CAが存在する場合はUpstream CAの証明書(バンドル) を配布することでAgentはそれを使ってServer SVIDを検証できる issuer=Upstream CA issuer=Server CA Server Cert
  9. Serverの証明書を検証する (Node Attest後) SPIRE Server SPIRE Agent agent_svid.der
 - Agent

    Cert
 - Server CA Cert(ICA) bundle.der - Upstream Bundle Node Attestationの結果として AgentのSVIDを発⾏、 他のSVID検証⽤のBundleが⼿に⼊る Upstream CA ServerCA Data Bundles server_svid
 - Server Cert
 - Server CA Cert ※ ICA=Intermediate Certificate Authority
  10. Agentの証明書を検証する (Node Attest後) SPIRE Server SPIRE Agent agent_svid.der
 - Agent

    Cert
 - Server CA Cert(ICA) bundle.der - Upstream Bundle Upstream CA ServerCA Data 中間CA証明書と連結されたAgentSVIDの証明書チェーンを Upstream CAの証明書で検証する Bundles server_svid
 - Server Cert
 - Server CA Cert ※ ICA=Intermediate Certificate Authority
  11. PKI ツリー Server
 CA(ICA) Upstream CA Server Cert Server
 CA(ICA)

    Server Cert Agent Cert Agent Cert サーバが提⽰する内容 クライアントが提⽰する内容
  12. Serverの証明書を検証する (Node Attest前) agent.conf 
 agent {
 … trust_bundle_path=server_upstream.pem
 …

    } Server
 CA Server
 Cert Server Cert Server
 CA DatastoreにそれぞれのRoot CA証明書が保管されて いる(master)ので、そのデータをAgentに配布。
 ⽴ち上げてからじゃないと配布できない課題がある。 (※後ほど補⾜) Upstream CAが存在しない場合は
 Server CAがRoot CAになる Data
  13. Serverの証明書を検証する (Node Attest後) SPIRE Server SPIRE Agent agent_svid.der
 - Agent

    Cert bundle.der - Server CA Certs Node Attestationの結果として AgentのSVIDを発⾏、および 他のSVID検証⽤のBundleが⼿に⼊る ServerCA Data Bundles server_svid
 - Server Cert ※ ICA=Intermediate Certificate Authority
  14. Agentの証明書を検証する (Node Attest後) SPIRE Server SPIRE Agent agent_svid.der
 - Agent

    Cert bundle.der - Server CA Certs ServerCA Data AgentSVIDをBundleとして保管されている Root CA証明書群で検証する Bundles server_svid
 - Server Cert ※ ICA=Intermediate Certificate Authority
  15. PKI ツリー Server
 CA(Root) Server Cert Server
 CA(Root) Server Cert

    Agent Cert Agent Cert サーバが提⽰する内容 クライアントが提⽰する内容
  16. 注意点 (No UpstreamCA) ▶ Server CAがRoot CAとなるが、そのための鍵ペアはServerのローカルで管理され ている + Key

    Manager は Disk plugin を使い、data_dirの永続化が必要 + SPIRE Serverのノードが再⽣成されるとRoot CA証明書が変わってしまい、 Agentが接続できなくなる ▶ Server SVID検証のBootstrap問題を解消しつつ、SPIRE ServerはTrust Domain内 でRoot CAとして振るまうような設定(upstream_bundle=false)もできるが、問 題が確認されたので将来的には無くなりそうな流れ + spiffe/spire/issues/1095
  17. upstream_bundle=falseの設定とは ▶ Upstream CAは使うがあくまでBootstrap時のみ ▶ ⾃⾝は中間CAの⽴ち位置であるが、Upstream Bundleに上位のBundleを含めな いことで、Trust Domain内では上位のCAとは切り離して運⽤する ▶

    これはAgentのBootstrap問題を回避するためにダミーのUpstream CA証明書を 使ったワークアラウンドの際に⽣み出されたものだと思われる(ダミーCAのツ リーに組み込まれたくない) ▶ 将来的にBootstrap問題を解消して廃⽌の流れなのでテスト以外では使わない
  18. Server証明書の検証 (upstream_bundle=false) agent.conf 
 agent {
 … trust_bundle_path=server_upstream.pem
 … }

    Server
 CA Upstream CA Server Cert Server
 CA Bootstrap時はUpstreamCAのBundleを使ってServer SVIDの検証 issuer=Upstream CA issuer=Server CA Server Cert
  19. Server証明書の検証 (upstream_bundle=false) SPIRE Server SPIRE Agent agent_svid.der
 - Agent Cert

    bundle.der - Server CA Certs Agentに渡すBundleにはupstreamのbundleを含めない Upstream CA ServerCA Data Bundles server_svid
 - Server Cert
 - Server CA Cert
  20. 関連するコンポーネントの整理 ▶ Datastore + NodeのAttestation情報やWorkloadの情報(Selectorなど), Trust Bundleを保存 ▶ Key Manager

    + SPIRE ServerがSVID(証明書orJWT)を発⾏するための鍵ペアを管理 ▶ Upstream CA + SPIREが発⾏する証明書を既存のツリーに組み込むのかどうか
  21. バックエンドの選択 ▶ Datastore + 複数のサーバ間で共有が必要 + MySQL, PostgreSQL + Kubernetes

    pluginも(summerwind/spire-plugin-datastore-k8s) ▶ Key Manager + Upstream CA使わない場合はdiskプラグインを使って永続ボリュームに書き出す ▶ Upstream CA + Amazon KMSやStaticな鍵ペア、HashiCorp Vaultなど選択できる
  22. 前回の訂正 ▶ Datastore + 複数のサーバ間で共有が必要 + MySQL, PostgreSQL + Kubernetes

    pluginも(summerwind/spire-plugin-datastore-k8s) ▶ Key Manager + Upstream CA使わない場合はdiskプラグインを使って永続ボリュームに書き出す ▶ Upstream CA + Amazon KMSやStaticな鍵ペア、HashiCorp Vaultなど選択できる 前回のMeetupの質疑応答で冗⻑化のためには
 KeyManager部分も共有が必要かもと⾔いましたが、
 共有しなくても良さそうでした
  23. L4 LoadBalancerによる冗⻑化・(分散) SPIRE Server SPIRE Server SPIRE Agent SPIRE Server

    L4 Load Balancer Agent-ServerはgRPC通信なので L4 LBでは最初の接続しか分散できない
  24. DNSによる冗⻑化・分散 SPIRE Server SPIRE Server SPIRE Agent SPIRE Server DNS

    Service spire-server 192.168.0.1 spire-server 192.168.0.2 spire-server 192.168.0.3 障害ノードに振られると再接続を繰り返 してしまう点に注意。 ※将来的に解消される⾒込み
 (spiffe/spire/pull/1061)
  25. L7 LoadBalancerによる冗⻑化・分散? SPIRE Server SPIRE Server SPIRE Agent SPIRE Server

    L7 LoadBalancer 途中にL7LB挟んで正しくmTLSできる?
 
 mTLSできてもServerが認証した相⼿は
 LBになってしまわないか AgentとServerはmTLSで通信
  26. 複数台構成でのJWT-SVIDの課題 ▶ JWT-SVID はServerのKey Managerが管理する鍵によって署名される + JWTの証明書は鍵はServer毎に管理されている秘密鍵で署名される + JWTの署名はTLS証明書のようにチェーンで検証できない ▶

    Upstream CAを使っている場合、DatastoreにBundleとして保管されているのは Upstream CAの証明書Bundleのみなので、署名に使った各Server間の鍵とペア の公開鍵の配布が難しい ▶ Upstream CA使っていない場合はBundleとして各Server(RootCA)の証明書が⼿に ⼊るので、そこから公開鍵が⼿に⼊れられる。
  27. JWT-SVIDを利⽤する SPIRE Server SPIRE Agent Upstream CA ServerCA Workload Server

    CAの鍵で署名 されている SPIRE Server SPIRE Agent ServerCA Workload 送信元のJWTの検証鍵
 を⼿に⼊れられない Workload, Agentが
 持っているのは
 UpstreamCAのBundle だけ
  28. JWT-SVIDを利⽤する $ spire-server experimental bundle show { "keys": [{ "use":

    “x509-svid", "kty": "EC", "crv": "P-256", "x": "fK-wKTnKL7KFLM27lqq5DC-bxrVaH6rDV-IcCSEOeL4", "y": "wq-g3TQWxYlV51TCPH030yXsRxvujD4hUUaIQrXk4KI", "x5c": [ “MIIBKjCB0aAD……r7OVLUrL+b9ylAdZglS5kKnYigmwDh+/U=" ] }, { "use": “jwt-svid", "kty": "EC", "kid": "KID", "crv": "P-256", "x": "fK-wKTnKL7KFLM27lqq5DC-bxrVaH6rDV-IcCSEOeL4", "y": "wq-g3TQWxYlV51TCPH030yXsRxvujD4hUUaIQrXk4KI" } ] } X509 SVIDΛݕূ͢ΔͨΊͷ৘ใ JWT SVIDΛݕূ͢ΔͨΊͷ৘ใ
  29. まとめ ▶ Upstream CAがあるとSPIRE Serverは永続ボリューム持たなくてもいいので構成 がシンプルになる ▶ upstream_bundle=false の設定は本番では使わない ▶

    Upstream CA無しのパターンは次期バージョンからのほうが良さそう ▶ SPIRE ServerのバランシングはL4 LBかクライアント側でバランシング ▶ 複数台構成でのJWT-SVID利⽤は課題あり + フェデレーションが絡んでくるとさらに難しくなってくる
  30. 今後やりたいこと ▶ もちろん SPIFFE Meetup Tokyo も継続して開催していきたい ▶ 次はZero Trust関連もしくはIstioの発表を集められたらと思っています

    + ゼロトラストネットワーク ―境界防御の限界を超えるためのセキュアなシステム設計 + 2019/10/28 に⽇本語訳の書籍が発売予定 ▶ 次回も是⾮ご参加いただけたら嬉しいです