[アップデート] Amazon ECS が VPCエンドポイント”ポリシー”をサポートしました!

ECSへのプライベートネットワークからのアクセスを、IAMポリシー形式で制限可能に!
2021.01.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ちゃだいん(@chazuke4649)です。

Amazon ECS が VPCエンドポイントポリシーをサポートしました!

これによって、VPC エンドポイントからの ECS リソースへのアクセスを制御できるようになり、コンプライアンスおよび規制上の要件を満たすために役立ちます。

これまで、VPC エンドポイントからの ECS へのアクセスを制限する手段はありませんでしたが、これからは、実行できる Amazon ECS アクション (RunTask、CreateService など)、アクションを実行できるプリンシパル、およびアクションを実行できるリソースを管理する IAM リソースポリシーをアタッチすることができるようになります。

引用元)Amazon ECS による VPC エンドポイントポリシーのサポートが開始されました

どういうこと?

まず前提として、すでに ECS はVPCエンドポイントをサポートしていました。

  • com.amazonaws.region.ecs-agent
  • com.amazonaws.region.ecs-telemetry
  • com.amazonaws.region.ecs

これらを利用すればプライベートサブネットからインターネットを経由せず ECS へアクセスすることが可能でした。

今回はそれに追加で 上記エンドポイント個々のリソースポリシーである、VPCエンドポイントポリシーも利用できるようになりました。(現時点で全てのVPCエンドポイントにVPCエンドポイントポリシーがある訳ではありません)

利用可能なVPCエンドポイントポリシー一覧は以下をご覧ください。(※執筆時点ではおそらくこちらのドキュメントはまだ更新されておらず、Noになっております)

AWS services that you can use with AWS PrivateLink - Amazon Virtual Private Cloud

VPCエンドポイントとVPCエンドポイントポリシーなどの整理には、以下エントリがわかりやすいです。(以下は KMS のVPCエンドポイントポリシーサポート開始時の記事です)

もう1点前提として、起動タイプが Fargate の場合、ECSとの通信だけであれば、先述の3つのECS VPCエンドポイントを使用せずと行うことができました。

Fargate 起動タイプを使用するタスクでは、Amazon ECS 用のインターフェイス VPC エンドポイントは必要ありませんが、以下のように、Amazon ECR、Secrets Manager、または Amazon CloudWatch Logs 用のインターフェイス VPC エンドポイントが必要になる場合があります。

引用元)Amazon ECS インターフェイス VPC エンドポイント (AWS PrivateLink) - Amazon Elastic Container Service

つまり、先述3つのECS VPCエンドポイントを利用する主なケースは、ECSの起動タイプがEC2の場合が主だったかと思われます。この辺の違いは以下エントリがわかりやすいです。

さて前置きが長くなりましたが、

今回 ECS VPCエンドポイントポリシーが利用可能になったことにより、今後VPCエンドポイントを介したECSへのアクセスをおなじみIAMポリシーで制限できます。それは起動タイプEC2のみならず、起動タイプFargateにも有効です。

例えば、プライベートサブネットのEC2からVPCエンドポイントを介してECSへアクセスしている場合、EC2側がECSに対してFullAccessの権限を持っていたとしても、VPCエンドポイントポリシーで許可したアクションのみしか実行できないようにする、などが可能となります。

やってみた

前提

せっかくなので今回は Fargate で試してみます。

  • プライベートサブネットAにて、ECS Fargateを作成済み
  • プライベートサブネットBにて、EC2 を作成済み

ECS VPCエンドポイントを作成する ×3

  • com.amazonaws.region.ecs-agent
  • com.amazonaws.region.ecs-telemetry
  • com.amazonaws.region.ecs

上記再掲となりますが、3つ必要になります。

マネジメントコンソールにて作成します。下図のように ecs で絞ると出てくる3つです。一度に3つ同時に作成することはできないので、1つずつ行う必要があります。

Amazon ECS インターフェイス VPC エンドポイント (AWS PrivateLink) - Amazon Elastic Container Service

作成の詳細は上記ドキュメントの中盤にあります。

  • サブネットは、EC2のいるプライベートサブネットを指定
  • セキュリティグループは、いったん443ポートでSourceを指定しないもの(0.0.0.0/0)を指定

設定画面の最後に、ポリシー設定エリアがあります。最初はここはフルアクセスの状態で作成します。

作成は以上です。これを3つとも作成します。

EC2からアクセスする(1)

EC2にログインし AdministoratorAccess 権限を持つIAMユーザーのアクセスキーをAWS CLIに登録します。

フルアクセスできる状態で、すでに起動しているtest-dev-clsuterに対してアクションを実行します。list-clustersdescribe-clustersを行います。

[ec2-user@ip-10-0-1-53 ~]$ aws ecs list-clusters
{
    "clusterArns": [
        "arn:aws:ecs:ap-northeast-1:123456789012:cluster/test-dev-cluster"
    ]
}
[ec2-user@ip-10-0-1-53 ~]$ aws ecs describe-clusters --clusters test-dev-cluster
{
    "clusters": [
        {
            "status": "ACTIVE",
            "defaultCapacityProviderStrategy": [],
            "statistics": [],
            "capacityProviders": [],
            "tags": [],
            "clusterName": "test-dev-cluster",
            "settings": [
                {
                    "name": "containerInsights",
                    "value": "disabled"
                }
            ],
            "registeredContainerInstancesCount": 0,
            "pendingTasksCount": 0,
            "runningTasksCount": 2,
            "activeServicesCount": 2,
            "clusterArn": "arn:aws:ecs:ap-northeast-1:123456789012:cluster/test-dev-cluster"
        }
    ],
    "failures": []
}

上記の通り、2つのアクションとも成功しました。

ECS VPCエンドポイントポリシーを設定する

それでは、VPCエンドポイントポリシーでアクションを制限します。

下記の通り、ListClustersのみ許可し、他のアクションを制限しました。

{
    "Statement": [
        {
            "Principal": "*",
            "Effect": "Allow",
            "Action": [
                "ecs:ListClusters"
            ],
            "Resource": "*"
        }
    ]
}

これを3つのエンドポイントに適用します。

EC2からアクセスする(2)

それでは、先ほどのEC2に戻り、同じ2つのアクションを実行してみます。

[ec2-user@ip-10-0-1-53 ~]$ aws ecs list-clusters
{
    "clusterArns": [
        "arn:aws:ecs:ap-northeast-1:123456789012:cluster/test-dev-cluster"
    ]
}
[ec2-user@ip-10-0-1-53 ~]$ aws ecs describe-clusters --clusters test-dev-cluster

An error occurred (AccessDeniedException) when calling the DescribeClusters operation: User: arn:aws:sts::123456789012:assumed-role/cm-chadain/3566648898009899087643 is not authorized to perform: ecs:DescribeClusters on resource: arn:aws:ecs:ap-northeast-1:123456789012:cluster/test-dev-cluster

上記の通り、許可されたListClustersは成功しましたが、DescribleClustersは拒否されました。

ちなみにポリシーのアクションを入れ替えて再度試したところ、期待通り次は実行結果が入れ替わりました。テストは以上です。

終わりに

今回のアップデートで、ECSへのアクセスをまた一つ細やかに制御できるようになりました。また、今までは起動タイプEC2の場合しか主にECS VPCエンドポイントを利用するケースはありませんでしたが、「プライベートネットワークからのECSへのアクセスをリソース側のポリシーで制限したい」場合に、起動タイプFargateでも利用する選択肢が生まれたのではないでしょうか。

それではこの辺で。ちゃだいん(@chazuke4649)でした。