[アップデート]ECS on Fargateがカスタマー管理キーによるエフェメラルストレージ暗号化に対応しました!

高いセキュリティ要件が求められるワークロードを実行しているあなたへ。

こんにちは。AWS事業本部トクヤマシュンです。

Amazon ECS on Fargate でカスタマー管理キー(Customer Managed Key)を用いてエフェメラルストレージに保存されるデータを暗号化できるようになりました。すべての商用リージョンですでに利用可能です。

本ブログではこちらのアップデート内容の紹介と、実際の設定方法についてご紹介します。

アップデート内容

Fargateのエフェメラルストレージはデフォルトで暗号化されますが、これまでこの暗号化に利用可能なキーはAWS管理キーのみでした。今回のアップデートで、カスタマー管理キーも暗号化に利用できるようになりました。

機密データを扱うアプリケーションを実行する場合など、セキュリティ要件として、自社が所有する鍵を使った暗号化が求められることもあるかと思います。そのようなワークロードを運用している方には嬉しいサービスです。

例えばS3バケットの暗号化方式としてSSE-S3ではなくSSE-KMSを利用している方は、本サービスの利用を検討いただいてもよいのではないかな、と思います。

本機能の設定はECSクラスター単位で行います。
カスタマー管理キーによる暗号化の指定はクラスターの新規作成時だけではなく、既存のクラスターを更新することでも設定可能です。

利用の前提

本機能の利用において、下記のような前提がありますのでご注意ください。

  • Windowsタスクを実行するクラスターでは利用不可
  • プラットフォームバージョンが1.4.0よりも前の場合は利用不可

実際に動かしてみる

それでは、本アップデートについてマネジメントコンソールから設定してみます。

初期状態

初めに、下記のようなECSクラスターが存在するとします。

暗号化の設定項目にFargateエフェメラルストレージが増えていますね。 カスタマー管理キーの設定をしてないので、「-」と表示されています。

クラスター内では1つのサービスが存在し、タスクが1つ立ち上がっています。
このタスクを確認すると、Fargateエフェメラルストレージの暗号化がAWS管理キーによるデフォルト暗号化であることが分かります。

これをカスタマー管理キーによる暗号化に変更します。

カスタマー管理キーの作成

まず、暗号化で利用するカスタマー管理キーを作成します。
設定の詳細はこちらのユーザーガイドをご覧ください。

ここではマネージメントコンソールから実際の作成を行っていきます。 AWS Key Management Service のトップ画面から「キーの作成」ボタンをクリックします。

ステップ1ではキーの設定を行います。
今回はデフォルト設定のまま「次へ」ボタンをクリックします。

ステップ2ではラベルの追加を行います。 エイリアスに「fargate-ephemeral-storage-key」を設定し、「次へ」ボタンをクリックします。

ステップ3ではキーの管理アクセス許可を定義しますが、とくに追加設定は行わずデフォルト設定のまま「次へ」ボタンをクリックします。

ステップ4ではキーの使用アクセス許可を定義しますが、こちらも追加設定は行わずデフォルト設定のまま「次へ」ボタンをクリックします。

ステップ5は確認画面ですが、ここではキーポリシーを直接編集します。 ユーザーガイドにあるように、キーポリシーで下記のような許可が必要です。

  • FargateサービスへのGenerateDataKeyWithoutPlainTextの実行許可
  • FargateサービスへのCreateGrantの実行許可
  • 暗号化を設定するユーザーへのDescribeKey実行許可
    • KMSのコンソールから設定する場合、デフォルト設定( "Sid": "Enable IAM User Permissions"の設定)でカバーされる

下記にキーポリシーの例を示します。<暗号化対象クラスター名>と<AWSアカウントID>はご自身のものに置き換えてください。

{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Allow generate data key access for Fargate tasks.",
            "Effect": "Allow",
            "Principal": {
                "Service": "fargate.amazonaws.com"
            },
            "Action": "kms:GenerateDataKeyWithoutPlaintext",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws:ecs:clusterName": "<暗号化対象クラスター名>",
                    "kms:EncryptionContext:aws:ecs:clusterAccount": "<AWSアカウントID>"
                }
            }
        },
        {
            "Sid": "Allow grant creation permission for Fargate tasks.",
            "Effect": "Allow",
            "Principal": {
                "Service": "fargate.amazonaws.com"
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws:ecs:clusterName": "<暗号化対象クラスター名>",
                    "kms:EncryptionContext:aws:ecs:clusterAccount": "<AWSアカウントID>"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": "Decrypt"
                }
            }
        },
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWSアカウントID>:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}

キーポリシーが設定できれば、「完了」ボタンをクリックして、キーを作成します。

ここまでできれば、カスタマー管理キーの作成は完了です。

クラスターへのカスタマー管理キーによる暗号化設定

では、クラスターにカスタマー管理キー暗号化を設定します。

対象のECSクラスターの画面から「クラスターを更新」ボタンをクリックします。

暗号化 -> Fargate エフェメラルストレージに先ほど作成したカスタマー管理キーを指定します。

設定できれば更新ボタンをクリックします。

うまく設定できると、次のように暗号化の詳細としてカスタマー管理キーが表示されます。

これでクラスターへの設定は完了です。

タスクのエフェメラルストレージを暗号化してみる

この状態で、すでに起動していたタスクの暗号化設定を確認してみます。はたして既存タスクは暗号化されているのでしょうか?

確認すると、デフォルト AWS Fargate 暗号化のままでした。

ここから、クラスターの設定を更新しても、すでに起動中のタスクのエフェメラルストレージはカスタマー管理キーによって暗号化されるわけではないことがわかります。当然といえば当然ですが。

ではサービスで起動しているタスクを、カスタマー管理キーによるエフェメラルストレージ暗号化されたものに置き換えてみます。

サービスの更新から、「新しいデプロイの強制」にチェックを入れて、更新ボタンをクリックします。

これにより、新しいタスクが起動して、既存のタスクが停止されて置き換わります。 新しいタスクを確認すると、暗号化がKMSキーによって行われていることが確認できました。

以上で、ECS on Fargateのエフェメラルストレージをカスタマー管理キーを用いて暗号化することができました。

参考:クラスターを更新する場合の注意点

今回確認したところ、クラスター更新後にカスタマー管理暗号化を反映するためには、「新しいデプロイの強制」が必要でした。
それをせずに追加でタスク起動した場合、AWS管理キーによる暗号化が行われたタスクが立ち上がってきますのでご注意ください。

ためしにクラスター更新直後、既存タスクがAWS管理キーによる暗号化が行われている状態をもう一度作って、サービスのタスクを1つ増やしてみます。 サービスの更新から、必要なタスク数を2に増やして、更新ボタンをクリックします。

この時、タスクが新しく立ち上がってきますが、こちらの暗号化は「デフォルト AWS Fargate 暗号化」のままでした。

新しく立ち上がったタスクがカスタマー管理キーで暗号化されていると、同一のサービスの中でデフォルト暗号化のタスクとカスタマー管理キー暗号化のものが混在してしまうので、そうした不整合を起こさないようになっているのかもしれないですね。

まとめ

ECS on AWS Fargate でカスタマー管理キー(Customer Managed Key)を用いてエフェメラルストレージに保存されるデータを暗号化するアップデートを紹介しました。
高いセキュリティ要件が求められるワークロードを実行している場合、導入検討してみてください。

本エントリがどなたかのお役に立てば幸いです。