Amazon Web Services ブログ
Amazon EKS 上の AWS App Mesh での SPIFFE/SPIRE による mTLS の使用
本記事は、Efe Selcuk、Apurup Chevuru、Michael Hausenblas による Using mTLS with SPIFFE/SPIRE in AWS App Mesh on Amazon EKS を翻訳したものです。
AWS では、セキュリティを最優先事項と考え、責任共有モデルの観点から、お客様の責任部分をケアするためのコントロールを提供しています。サービスメッシュの一般的な使用例の 1 つは、通信経路のセキュリティ対策を強化することが挙げられますが、これは AWS App Mesh でも重点的に取り組んでいます。また、mTLS を安全かつ正しく利用するという課題は、実務者の間でも議論の対象となっています。AWS は App Mesh roadmap からの mTLS (mutual TLS、相互 TLS) の要望に応え、この機能のサポートを開始しました。このブログ記事では、mTLS の背景を説明し、Amazon Elastic Kubernetes Service (EKS) クラスターを使用したエンドツーエンドの例を紹介します。
背景
mTLS にあまり詳しくない場合は、このセクションをご覧ください。そうでない場合は、ウォークスルーに進んでください。
SPIFFE (Secure Production Identity Framework for Everyone) プロジェクトは、CNCF (Cloud Native Computing Foundation) のオープンソースプロジェクトであり、コミュニティから広く支持されています。このプロジェクトは、きめ細かく動的なワークロード ID 管理を提供します。SPIFFE のリファレンス実装である SPIRE に基づいて、あらゆる種類の分散システムにおいて、暗号的に強固で証明可能なアイデンティティを割り当てたり、問い合わせたりすることができます。この分野では SPIRE だけがオプションではないことに注意してください。例えば、Using EKS encryption provider support for defence-in-depth で説明しているように、暗号化に Kubernetes Secrets を使用することもできますが、この記事では SPIRE に焦点を当てます。
SPIFFE/SPIRE の用語を少しだけ紹介して、認識を合わせましょう。
- ワークロードとは、特定の構成でデプロイされたソフトウェアのことで、例えば、コンテナとしてパッケージされ配信されるマイクロサービスです。
- ワークロードは、クラスターや企業のネットワーク全体といった信頼ドメインのコンテキストで定義されます。
- SPIFFE ID は、ワークロードのアイデンティティを
spiffe://trust-domain/workload-identifier
の形式で表します。 - SVID (SPIFFE Verifiable Identity Document) は、ワークロードが自分の身元を証明するための文書であり、 信頼ドメイン内の署名機関によって署名されている場合に有効と見なされます。SVID インスタンスの一般的な例は、X.509 証明書です。
- SPIFFE ワークロード API は、AWS EC2 インスタンスメタデータ API が AWS 固有の方法で提供しているのと同様に、サービスを識別するためのプラットフォームに依存しない方法を提供します。
さらに詳しく知りたい方は、Evan Gilman 氏による動画 Introduction to SPIFFE and SPIRE Projects をご覧ください。10 分足らずで、これらすべてがどのように連携するかを説明しています。
App Mesh における mTLS
App Mesh のコンテキストでの一般的な構成は、以下のようになります。
App Mesh はデータプレーンではプロキシとして機能する Envoy を使用し、あらゆる種類のトラフィックをインターセプトします。mTLS を有効にすることで、Envoy プロキシ間の通信は TLS で認証されますが [1]、サービスとその Envoy プロキシ間の通信は平文です [2]。
mTLS 認証は、L4/TCP、HTTP (1.1/2)、gRPC など、AWS App Mesh がサポートするすべてのプロトコルで使用できます。2 つの mTLS を 2 つのモードでサポートしています。
サーバーエンドポイントの TLS 設定の PERMISSIVE
モードでは、エンドポイントへの平文トラフィックの接続を許可します。主に移行のためのもので、この記事の最後ではこちらに戻ります。
STRICT
モードは暗号化されたトラフィックを強制するもので、今後はこちらがデフォルトと考えてください。
App Mesh は、サーバー検証による相互 TLS 認証のために、リスナー TLS 構成での 2 つの証明書ソースをサポートしています。この証明書ソースは、Envoy プロキシのローカルファイルシステム、または SPIRE を介した Envoy の Secret Discovery Service (SDS) API のいずれかから取得することができます。なお、App Mesh は、mTLS 認証に使用される機密データをメモリ上にのみ保存します。
具体的な利用シナリオを考えてみましょう。例えば、消費者の支払いを処理するアプリケーションでは、PCI DSS (Payment Card Industry Data Security Standard) に準拠することが要件の 1 つになっている場合があります。mTLS を使用すれば、そのボックスにチェックマークを付けて、手間のかかる作業を私たちに任せることができます。
mTLS がなぜ有益なのか、どのように機能するのかを App Mesh のコンテキストで高いレベルで理解したところで、具体的な例に移りましょう。
mTLS のウォークスルー
準備として、aws-app-mesh-examples.git リポジトリをクローンします。以下のセットアップは、howto-k8s-mtls-sds-based ウォークスルーに基づいています。環境変数 AWS_ACCOUNT_ID
と AWS_DEFAULT_REGION
が設定されていることを確認してください。後でサンプルアプリのコンテナイメージをビルドして ECR にプッシュする際に必要になります。加えて、Docker が実行されていることも確認してください。
まず、以下のような eks-cluster-config.yaml
設定ファイルを使って、App Mesh が有効な EKS クラスターを作成します。
以下のコマンドを実行して、EKS クラスターを作成します。
次に、以下のコマンドを使用して AWS App Mesh controller for Kubernetes をインストールします。
まず、CRD を配置します。
なお、すでに Helm リポジトリが構成されている場合は、CRD を適用する前に helm repo update
を実行してください。
CRD がインストールされたことを確認します。
次に、AWS App Mesh controller for Kubernetes のコントローラー本体をインストールしましょう。
オプションですが、インストールされているコントローラーのバージョン (v1.3.x
以上である必要があります) を確認することできます。
次に、SPIRE サーバーを StatefulSet として、SPIRE エージェントを DaemonSet としてワーカーノードごとに 1 つずつ、あらかじめ設定された信頼ドメイン howto-k8s-mtls-sds-based.aws
を使用してインストールします。
なお、単一クラスターシナリオ用に調整された Helm チャートも用意していますので、SPIRE のセットアップに利用できます。
次に、SPIRE のセットアップを確認します。すなわち、すべての Pod が稼働していることを確認します。
これで、ヘルパースクリプト register_server_entries.sh を使用して、エージェントとワークロードを登録できます。
なお、登録されているエンティティは、以下のコマンドでいつでも一覧表示することができます。
最後に、ヘルパースクリプト deploy_app.sh を使用して、接続性をテストするサンプルアプリをデプロイします (訳注: ENVOY_IMAGE
環境変数についてエラーが発生した場合はこちらを参照して設定して下さい) 。
すべての Pod が起動して実行中であり、AWS App Mesh controller for Kubernetes が管理するカスタムリソースが以下のようになっていることを確認してください。
これで、mTLS を確認することができます。
これで完了です!App Mesh のコンソールでもステータスを確認することができ、以下のように表示されるはずです。
クリーンアップするには、以下のコマンドを使用できます。
使用上の考慮事項
上記のウォークスルーで見てきたように、EKS のコンテキストで App Mesh の新機能である mTLS を 使用するのは簡単です。これは、AWS が開発したコントローラーのおかげでもありますし、SPIRE がワークロードの ID 管理に関する面倒な作業を引き受けてくれているおかげでもあります。
SPIRE は、デフォルトでは 1 時間の短命な証明書を発行し、有効期限が切れる前に自動的に更新します(自動ローテーション)。証明書は、SPIRE エージェントによって Envoy プロキシにプッシュされます。
EKS 上の App Mesh のコンテキストでの mTLS の使用に関するその他の考慮事項をいくつか記載します。
- 事前に計画を立てて、既存の (暗号化されていない) ワークロードの移行を検討する必要があります。
- 上記のウォークスルーでは、自己署名証明書を使用した簡単なシナリオを示しましたが、AWS Certificate Manager (ACM) などの認証局 (CA) を使用することもできます。
- EKS on Fargate のコンテキストで SPIRE を使用する場合、Fargate では Kubernetes の DaemonSet がまだサポートされていないため、上記のソリューションは使用できないことに注意してください。
- その他の (関連する) 実践的なウォークスルーについて、App Mesh examples リポジトリを確認してください。
この新しい App Mesh のセキュリティ機能を使った感想をお聞かせください。ロードマップを通じて、フィードバックや提案の共有もお願いします。
翻訳はプロフェッショナルサービスの杉田が担当しました。