【AWS ECS】ECS+Fargateのセキュリティまとめ

container

こんにちは、エンジニアの田代です。
今回はECS+Fargateに関する記事の第3弾です。
これまでの記事ではCloudFormationのテンプレートも公開しているので、併せて参考にして頂けると嬉しいです。
blog.tech-monex.com blog.tech-monex.com

Contents

はじめに

初めてECS+Fargateの構成を導入する時や、特にEC2環境から移行する際にはセキュリティに関する懸念や不安が多いかと思います。
今回はそう言ったECS+Fargate環境のセキュリティに関して、推奨事項や要点の提示と言う形で纏めてみます。

Fargateのセキュリティ

[推奨事項]ECS Execの通信をKMS Keyで暗号化する

ECS Execの通信はデフォルトでTLS暗号化されますが、より強固なセキュリティが求められる場合は独自のKMS Keyで暗号化する事が出来ます。

ExecuteCommandConfiguration:
  KmsKeyId: !Ref CustomKmsKeyId

[推奨事項]ECS ExecのログをCloudWatchとS3に保管する

ログの設定を行う事で、ECS Execで実行したコマンドのログをCloudWatchとS3に保管出来ます。

LogConfiguration:
  CloudWatchEncryptionEnabled: true
  CloudWatchLogGroupName: '/ecs'
  S3BucketName: !Ref S3Bucket
  S3EncryptionEnabled: true
  S3KeyPrefix: 'ecs_exec_log'

[推奨事項]CloudTrailでECS Execのイベントを監視する

ECS Execを使用するとCloudTrailにExecuteCommandのイベント名でイベントが記録されるので、これを監視する事で予期しないアクセス等を検知する事が出来ます。

コンテナのローカルストレージはデフォルトで暗号化される

Fargateでコンテナを起動する場合はデフォルトでエフェメラルストレージが暗号化されます。
尚、独自のKMS Keyを用いた暗号化には今の所対応していません。(2021/11現在)

Fargateはコンテナを非特権モードで起動する

Fargateを利用する場合はprivilegedモードでコンテナを起動する事が出来ず、特権コンテナに起因するセキュリティリスクについて心配する必要がありません。
加えてセキュリティアップデートを含むホストOSの管理はAWSによって行われる為、ユーザーはホストOSのセキュリティについては基本的に考慮しなくて良い、と言う事になります。

ECRのセキュリティ

[推奨事項]リポジトリの可視性をprivateにする

外部にイメージを公開する理由が無ければ、リポジトリの可視性をプライベートに設定します。

[推奨事項]タグのイミュータビリティを有効にする

意図しないバージョンのコンテナイメージのデプロイ等を避ける為、イミュータビリティを有効にします。

Properties:
  ImageTagMutability: 'IMMUTABLE'

[推奨事項]定期的にイメージのスキャンを行う

プッシュ時のスキャンの有効化に加え、Pythonスクリプト等を用意して定期的にコンテナイメージのスキャンを行い、severityがCRITICALの脆弱性が見付かった場合にアラートが上がる仕組みを構築すると、より強固な対策が行えます。

import boto3

client = boto3.client('ecr')
response = client.start_image_scan(
    registryId=aws_account_id,
    repositoryName=repository_name,
    imageId={
        'imageTag': image_tag,
    },
)

[推奨事項]保管されるイメージをKMS Keyで暗号化する

ECRに保管されるイメージはデフォルトでS3が管理するキーにより暗号化されますが、より強固なセキュリティが求められる場合は独自のKMS Keyで暗号化する事が出来ます。

Properties:
  EncryptionConfiguration:
    EncryptionType: 'KMS'
    KmsKey: !Ref CustomKmsKeyId

タスク定義のセキュリティ

[推奨事項]秘匿情報はSSMパラメータストアから取得して環境変数に格納する

暗号キー等の秘匿情報をDockerfileにハードコードせずに、タスク定義でSSMパラメータストアから取得するよう設定し、環境変数に格納する事で安全に扱う事が出来ます。

[推奨事項]readonlyRootFilesystemを有効化する

タスク定義でreadonlyRootFilesystemを有効化する事によってコンテナのファイルシステムが読み取り専用となり、マルウェア等に対して強固になります。
但し、この設定を有効にするとECS Execが使用出来なくなる為、要件に応じて使い分ける必要があります。

まとめ

コンテナ技術自体のセキュリティに関する記事はインターネット上に沢山公開されていると思うので、今回の記事ではECS+Fargateの世界にフォーカスして纏めてみました。
個人的にはこれらのポイントを押さえておけば、EC2環境と比較してよりセキュアな環境を構築出来るのではと言う印象を持っています。
今後も必要があればこちらの記事に追記して行きたいと思います。

田代 侑大システム開発部 マネックス・ラボ