SPIFFE and SPIRE Community Virtual Meetup - Feb 2021 のセッションまとめ

## はじめに

今回は、SPIFFE の YouTube チャンネルで公開されている録画を元に、2021年2月に開催された [SPIFFE and SPIRE Community Virtual Meetup - Feb 2021](https://spiffe-spire-meetup-feb-2020.splashthat.com/) の各セッションの概要と感想をまとめていきます。

## Introduction

<iframe width="560" height="315" src="https://www.youtube.com/embed/ty1DbKqxx3w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><br>

オープニングのセッションです。コミュニティの成長に関する数字の紹介や、新しいメンテナーとコミュニティメンバーの自己紹介になっているセッションなので、興味がある方は参照するのが良いでしょう。

## Sneak Peek Severless support

<iframe width="560" height="315" src="https://www.youtube.com/embed/6Jwe4IIGWvs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><br>

SPIRE でのサーバーレス環境のサポートを紹介するセッションです。内容としては [spiffe/spire#1843](https://github.com/spiffe/spire/issues/1843) での議論を経て、最終的に SPIRE で採用されたアーキテクチャの紹介となっています。

現在 SPIRE ではサーバーレス環境のワークロードに SVID を配布する仕組みが実装されていません。これは、利用者がインフラを管理する必要がないサーバーレスコンピューティングというアーキテクチャに対して、SPIRE Agent をホストで稼働させて UNIX ドメインソケットで起動した Workload API を介してワークロードに SVID を配布するという SPIRE の仕様を適合できないことが原因となっていました。

この課題を解決するために SPIRE Server から、AWS Secrets Manager や Google Cloud Secret Manager などの任意の外部シークレットストアに SVID を保存する仕組みが設計されたとのことです。具体的には Registration Entry にサーバーレス環境のワークロードを示すフィールドの追加と、SPIRE Agent から外部ストアに SVID をアップロードする SVIDStore プラグインの開発が予定されているそうです。

処理の流れとしては、通常通り SPIRE Agent でデータがキャッシュされたら、SVIDStore プラグインがキャッシュを参照して、新たに追加されたフィールドを元にサーバーレス用途の SVID を判定して外部ストアにアップロードするといったものでした。なお、SVIDStore プラグインが使用するストア種別やシークレット名など SVID を保存するために必要な属性は Selector で指定するとのことでした。

この仕組みが実装されれば、外部ストアを参照する形で AWS Lambda や Google Cloud Functions などのサーバーレス環境のワークロードで SVID が利用できるようになります。更に、この仕組みは SPIRE Agent を稼働させることが難しい機密性が高い環境のワークロードへの SVID 配布（ [spiffe/spire#1989](https://github.com/spiffe/spire/issues/1989) ）にも応用が効くかもしれないとのことでした。

サーバーレス環境のサポートに向けたタスクは https://github.com/spiffe/spire/projects/9 で管理されているとのことなので、興味がある方は参照するのが良いでしょう。

## AWS AppMesh and SPIRE Integration

<iframe width="560" height="315" src="https://www.youtube.com/embed/m38vZrMNLzw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><br>

AWS App Mesh と SPIRE の統合について紹介する共同発表のセッションです。

### AWS App Mesh, Mutual TLS and SPIRE

前半のセッションでは、はじめに [AWS App Mesh](https://aws.amazon.com/jp/app-mesh/) の説明がありました。App Mesh は AWS で構成されたコンテナサービス上（ECS、Fargate、EKS、Kubernetes on EC2、EC2）に Service Mesh を構築するためのサービスで、顧客管理下のサービスに同居させる Data Plane としては Envoy を採用して、Control Plane は独自のものを開発しているとのことでした。

Service Mesh を構築するための設定は、マネジメントコンソールや CLI を介して AWS の App Mesh リソースで制御する仕様で、設定された内容は xDS API を介して Envoy に動的に反映される仕組みのようでした。関連して mTLS の話もありましたが、基本的な話だったためここでは割愛します。

次に、AWS のコンテナサービスへの SPIRE 統合についての話がありました。ECS、Fargate、EKS、Kubernetes on EC2、それぞれのプロダクトに SPIRE を統合できるのか否かという流れで話が進んでいきました。

現在 SPIRE では [NodeAttestor "aws_iid"](https://github.com/spiffe/spire/blob/v0.12.2/doc/plugin_server_nodeattestor_aws_iid.md) プラグインがサポートされているため、顧客が EC2 インスタンスを管理できて、インスタンスから UNIX ドメインソケットで起動した Workload API をコンテナにマウントできる AWS サービスであれば SPIRE を統合することができます。このことから SPIRE を統合できるサービスは、EKS と Kubernetes on EC2 のみということになります。ECS ではインフラとして EC2（と Fargate）がサポートされていますが機能に制限があるため実現が難しく、Fargate は顧客がインスタンスを制御できるサービスではないので実現不可能とのことでした。

この話に関連して、ECS と Fargate で SPIRE を利用するためにどうすべきかという考察の話があり、SPIRE にサーバレス環境のサポートが実装されれば、ECS と Fargate への SPIRE 統合が実現できると確信しているとのことでした。

AWS としては ECS や Fargate の利用者にも SPIRE 統合を提供したいようでしたので、App Mesh で構築された Service Mesh のサービス間認証を SPIFFE で統一したいモチベーションがあるのではないかと思いました。

### AppMesh-EKS-SPIRE Integration

後半のセッションでは、はじめに App Mesh Controller の説明がありました。EKS で App Mesh を利用する際には、Kubernetes クラスタに [App Mesh Controller](https://github.com/aws/aws-app-mesh-controller-for-k8s) をインストールして、Mesh、VirtualNode、VirtualService、VirtualRouter、VirtualGateway、GatewayRoute などの Custom Resource（CRD は[こちら](https://github.com/aws/eks-charts/blob/v0.0.50/stable/appmesh-controller/crds/crds.yaml)）を作成して Service Mesh を構築する仕組みになっているようです。

App Mesh Controller の具体的な機能の説明もありました。Admission Webhooks として振る舞い Pod に Envoy を追加する機能や、Custom Resource 情報を AWS Mesh API を介して AWS の App Mesh リソースとして保存する機能などが実装されているようです。整理すると Custom Resource = ( App Mesh Controller ) => App Mesh リソース = ( App Mesh Control Plane ) => Envoy という流れで Data Plane に設定が適用されるイメージです。

次に、App Mesh Controller への SPIRE 統合の話がありました。EKS 利用者が SPIRE Agent を DaemonSet で Kubernetes クラスタにデプロイして App Mesh Controller で SDS 設定を有効にすると、SPIRE Agent が持つ SDS Server のエンドポイントが Envoy にマウントされて、Envoy で SVID が利用できるようになるようです。

最後に、今後の展望の話がありました。1つ目が App Mesh Controller での SPIRE 統合のネイティブサポート（Registration Entry を自動登録する仕組みや SPIRE Agent のプリインストールなど？）で、2つ目が Fargate のようなサーバレス環境での SPIRE サポートとのことでした。

参考資料として以下も紹介されていたので、興味がある方は参照するのが良いでしょう。

- https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-mtls-sds-based
- https://aws.amazon.com/jp/blogs/news/using-mtls-with-spiffe-spire-in-app-mesh-on-eks/

## さいごに

今回は、SPIFFE and SPIRE Community Virtual Meetup - Feb 2021 の各セッションの内容と感想をまとめました。SPIFFE/SPIRE の知見を深めていくためにも、コミュニティイベントで話された内容は今後も継続してキャッチアップしていこうと思います。