Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

SPIREの概要

Slide 5

Slide 5 text

SPIREとは ▶ SPIFFEの参照実装 + https://github.com/spiffe/spire + golangで書かれている ▶ SPIFFE Workload APIを実装 + workloadを検証(attest)し、
 SPIFFE IDとSVIDを発⾏する機能を持つ
 workload: コンテナやプロセスなどのソ フトウェアシステムの実⾏単位

Slide 6

Slide 6 text

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/

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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/

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

SPIREの構成要素

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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/

Slide 31

Slide 31 text

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/

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

SPIREの概要

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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/

Slide 48

Slide 48 text

Z Labでの取り組み

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

Further Challenges

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

Node Attestationのプロセスをより厳格に ▶ VendordataのDynamicJSONを使うと良さそ う + インスタンスのメタデータ作成時、外部 サーバに問い合わせて動的にデータを作 成する機能 + インスタンス情報への署名データを埋め 込み、検証するサーバを⽤意すればよい 署名Server 2. インスタンスIDへの
 署名を要求 1. metadataサーバに
 情報を要求 VM 3. 署名された
 アイデンティティ
 が⼊ったメタデータ
 を返却

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

まとめ

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

Appendix

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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