ECS.2
コントロールの説明
ECS サービスにパブリック IP アドレスが自動的に割り当てられていないかをチェックする。AssignPublicIP が ENABLED に設定されている場合に FAILED となる。
assignPublicIp パラメータは awsvpc ネットワークモードの networkConfiguration に含まれるが、実際にパブリック IP を付与できるのは Fargate 起動タイプのみである。EC2 起動タイプで awsvpc モードを使用した場合、タスク ENI にパブリック IP は付与されない(公式ドキュメント)。また、bridge / host ネットワークモードでは networkConfiguration 自体が不要なため、本コントロールの評価対象外となる。
したがって、本コントロールが FAILED になるのは Fargate 起動タイプのサービスで assignPublicIp=ENABLED を明示的に指定した場合に限られる。Fargate ではデフォルトで assignPublicIp=DISABLED であるため、明示的に指定しない限り PASSED となる。
assignPublicIp=ENABLED を指定してサービスを作成しようとすると、Assign public IP is not supported for this launch type. エラーとなり、サービス自体が作成できないことを確認済み。aws ecs create-service \
--cluster cspm-test-cluster \
--service-name cspm-test-svc-ec2 \
--task-definition cspm-test-task \
--desired-count 0 \
--launch-type EC2 \
--network-configuration "awsvpcConfiguration={subnets=[<SUBNET_ID>],assignPublicIp=ENABLED}" \
--query 'service.{serviceName:serviceName,status:status,assignPublicIp:networkConfiguration.awsvpcConfiguration.assignPublicIp}'An error occurred (InvalidParameterException) when calling the CreateService operation: Assign public IP is not supported for this launch type.本検証では Fargate を使用する。これは assignPublicIp=ENABLED を設定できる唯一の起動タイプであり、FAILED を再現するために必要なためである。
対応する Config ルール: ecs-service-assign-public-ip-disabled(Security Hub カスタムルール、評価頻度: Configuration changes)
検証環境
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
結果
- ECS サービスが存在しない場合、finding は生成されない
assignPublicIp=ENABLEDで Fargate サービスを作成すると FAILED。リソース削除後に finding は解消される- EC2 起動タイプでは
assignPublicIp=ENABLEDを指定するとエラーとなり、サービス自体が作成できない。したがって本コントロールが FAILED になるのは Fargate 起動タイプに限られる - Fargate ではデフォルトで
assignPublicIp=DISABLEDのため、明示的に指定しない限り PASSED - VPC BPA(宣言型ポリシー)を適用した場合の finding への影響は VPC Block Public Access を参照
検証の流れ
flowchart LR
A[1. 事前確認] --> B[2. FAILED の再現]
B --> C[3. Config トリガー<br>→ FAILED 確認]
C --> D[4. リソース削除]
D --> E[5. PASSED 復帰確認]
E --> F[6. クリーンアップ]
1. 事前確認
プロファイル確認
aws sts get-caller-identity --query '{Account:Account,Arn:Arn}'{
"Account": "<WORKLOAD_ACCOUNT_ID>",
"Arn": "arn:aws:sts::<WORKLOAD_ACCOUNT_ID>:assumed-role/<ROLE_NAME>/<SESSION_NAME>"
}Config ルール名の確認
aws configservice describe-config-rules \
--query "ConfigRules[?contains(ConfigRuleName, 'ecs-service-assign-public-ip')].{Name:ConfigRuleName,Trigger:Source.SourceDetails[0].MessageType}"[
{
"Name": "securityhub-ecs-service-assign-public-ip-disabled-<HASH>",
"Trigger": "ConfigurationItemChangeNotification"
}
]現在の Security Hub finding 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "ECS.2"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}]
}' \
--query 'Findings[].{ResourceId:Resources[0].Id,Status:Compliance.Status}'(出力なし — 対象リソースが存在しないため finding なし)2. FAILED の再現
ECS サービスを assignPublicIp=ENABLED で作成する。
ECS クラスター作成
aws ecs create-cluster \
--cluster-name cspm-test-cluster \
--query 'cluster.{clusterName:clusterName,status:status}'{
"clusterName": "cspm-test-cluster",
"status": "ACTIVE"
}タスク定義の登録
aws ecs register-task-definition \
--family cspm-test-task \
--network-mode awsvpc \
--requires-compatibilities FARGATE \
--cpu "256" \
--memory "512" \
--container-definitions '[{"name":"test","image":"public.ecr.aws/amazonlinux/amazonlinux:latest","essential":true}]' \
--query 'taskDefinition.{family:family,revision:revision,status:status}'{
"family": "cspm-test-task",
"revision": 1,
"status": "ACTIVE"
}サブネット ID の確認
aws ec2 describe-subnets \
--filters "Name=default-for-az,Values=true" \
--query 'Subnets[0].SubnetId' \
--output text<SUBNET_ID>ECS サービス作成(assignPublicIp=ENABLED)
aws ecs create-service \
--cluster cspm-test-cluster \
--service-name cspm-test-svc \
--task-definition cspm-test-task \
--desired-count 0 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[<SUBNET_ID>],assignPublicIp=ENABLED}" \
--query 'service.{serviceName:serviceName,status:status,assignPublicIp:networkConfiguration.awsvpcConfiguration.assignPublicIp}'{
"serviceName": "cspm-test-svc",
"status": "ACTIVE",
"assignPublicIp": "ENABLED"
}3. Config トリガー → FAILED 確認
ECS.2 は Configuration changes 型のため、サービス作成により自動的にトリガーされる。Config がリソースの Configuration Item を記録するまでに数分かかる場合がある。反映されない場合は手動トリガーを実行する。
Config ルールの手動トリガー(必要に応じて)
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ecs-service-assign-public-ip-disabled-<HASH>(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ecs-service-assign-public-ip-disabled-<HASH> \
--compliance-types NON_COMPLIANT \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,Compliance:ComplianceType}'[
{
"ResourceId": "<ECS_SERVICE_ARN>",
"Compliance": "NON_COMPLIANT"
}
]Security Hub finding の確認
Config → Security Hub の反映には追加で数分かかる。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "ECS.2"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}]
}' \
--query 'Findings[].{ResourceId:Resources[0].Id,Status:Compliance.Status,UpdatedAt:UpdatedAt}'[
{
"ResourceId": "<ECS_SERVICE_ARN>",
"Status": "FAILED",
"UpdatedAt": "<TIMESTAMP>"
}
]4. リソース削除
aws ecs delete-service \
--cluster cspm-test-cluster \
--service cspm-test-svc \
--force \
--query 'service.{serviceName:serviceName,status:status}'{
"serviceName": "cspm-test-svc",
"status": "DRAINING"
}5. PASSED 復帰確認
サービス削除後、Config が設定変更を検知し、リソースが存在しなくなるため finding が解消される。数分待ってから確認する。
Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ecs-service-assign-public-ip-disabled-<HASH> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,Compliance:ComplianceType}'(出力なし — 対象リソースが存在しないため)Security Hub finding の確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "ECS.2"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}]
}' \
--query 'Findings[].{ResourceId:Resources[0].Id,Status:Compliance.Status}'(出力なし — finding が解消されている)6. クリーンアップ
タスク定義の登録解除
aws ecs deregister-task-definition \
--task-definition cspm-test-task:1 \
--query 'taskDefinition.{family:family,revision:revision,status:status}'{
"family": "cspm-test-task",
"revision": 1,
"status": "INACTIVE"
}タスク定義の削除
aws ecs delete-task-definitions \
--task-definitions cspm-test-task:1 \
--query 'taskDefinitions[0].{family:family,status:status}'{
"family": "cspm-test-task",
"status": "DELETE_IN_PROGRESS"
}ECS クラスター削除
aws ecs delete-cluster \
--cluster cspm-test-cluster \
--query 'cluster.{clusterName:clusterName,status:status}'{
"clusterName": "cspm-test-cluster",
"status": "INACTIVE"
}