EMR.1
コントロールの説明
EMR クラスターのマスターノード(プライマリノード)に実際にパブリック IP アドレスが付与されているかをチェックする。マスターノードの EC2 インスタンスの NetworkInterfaces に PublicIp が存在する場合に FAILED となる。RUNNING または WAITING 状態のクラスターのみが評価対象。
ECS.2 / ECS.16 のようなサービス固有の assignPublicIp パラメータとは異なり、EMR.1 は設定ではなく実際の状態を評価する。マスターノードにパブリック IP が付与されるかどうかは、クラスターを起動するサブネットの「パブリック IPv4 アドレスの自動割り当て」設定(MapPublicIpOnLaunch)に依存する。
- デフォルトサブネット(
MapPublicIpOnLaunch=true)で起動 → パブリック IP が付与される → FAILED - プライベートサブネット(
MapPublicIpOnLaunch=false)で起動 → パブリック IP が付与されない → PASSED
起動後にパブリック IP を手動で解除することはできないため、修正するにはプライベートサブネットで新しいクラスターを起動し直す必要がある(公式ドキュメント)。
対応する Config ルール: EMR_MASTER_NO_PUBLIC_IP(AWS マネージドルール、評価頻度: Periodic)
検証環境
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
結果
- EMR クラスターが存在しない場合、アカウントレベルで PASSED
- デフォルトサブネット(
MapPublicIpOnLaunch=true)で起動したクラスターは、マスターノードにパブリック IP が付与されるため FAILED。クラスター終了後に finding は解消される - EMR.1 は設定ではなく実際の状態(パブリック IP の有無)を評価する。パブリック IP が付与されるかはサブネットの自動割り当て設定に依存する
- Periodic 型のため、手動トリガー(
start-config-rules-evaluation)で即座に評価可能 - 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, 'emr-master-no-public-ip')].{Name:ConfigRuleName,MaxFreq:MaximumExecutionFrequency,Owner:Source.Owner}"[
{
"Name": "securityhub-emr-master-no-public-ip-<HASH>",
"MaxFreq": "Twelve_Hours",
"Owner": "AWS"
}
]現在の Security Hub finding 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EMR.1"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}]
}' \
--query 'Findings[].{ResourceId:Resources[0].Id,Status:Compliance.Status}'[
{
"ResourceId": "AWS::::Account:<WORKLOAD_ACCOUNT_ID>",
"Status": "PASSED"
},
{
"ResourceId": "AWS::::Account:<WORKLOAD_ACCOUNT_ID>",
"Status": "PASSED"
}
]EMR クラスターが存在しないため、アカウントレベルで PASSED。finding が 2 件あるのは、複数リージョンの finding が集約されているため(GeneratorId が異なる)。
2. FAILED の再現
デフォルトサブネット(MapPublicIpOnLaunch=true)で EMR クラスターを起動し、マスターノードにパブリック IP を付与する。
EMR デフォルトロールの作成(未作成の場合)
--use-default-roles を使用するには、EMR のデフォルトロールが必要。未作成の場合は以下で作成する。
aws emr create-default-roles \
--query '[].Role.{RoleName:RoleName,Arn:Arn}'[
{
"RoleName": "EMR_EC2_DefaultRole",
"Arn": "arn:aws:iam::<WORKLOAD_ACCOUNT_ID>:role/EMR_EC2_DefaultRole"
},
{
"RoleName": "EMR_DefaultRole",
"Arn": "arn:aws:iam::<WORKLOAD_ACCOUNT_ID>:role/EMR_DefaultRole"
},
{
"RoleName": "EMR_AutoScaling_DefaultRole",
"Arn": "arn:aws:iam::<WORKLOAD_ACCOUNT_ID>:role/EMR_AutoScaling_DefaultRole"
}
]EMR クラスター起動
aws emr create-cluster \
--name cspm-test-emr \
--release-label emr-7.8.0 \
--applications Name=Spark \
--instance-type m5.xlarge \
--instance-count 1 \
--use-default-roles \
--query '{ClusterId:ClusterId}'{
"ClusterId": "<CLUSTER_ID>"
}クラスターの状態確認
クラスターが WAITING 状態になるまで待つ(5〜10 分)。
aws emr describe-cluster \
--cluster-id <CLUSTER_ID> \
--query 'Cluster.{Id:Id,Name:Name,State:Status.State}'{
"Id": "<CLUSTER_ID>",
"Name": "cspm-test-emr",
"State": "WAITING"
}マスターノードのパブリック IP 確認
aws emr describe-cluster \
--cluster-id <CLUSTER_ID> \
--query 'Cluster.MasterPublicDnsName'"<PUBLIC_DNS_NAME>"3. Config トリガー → FAILED 確認
EMR.1 は Periodic 型のため、手動トリガーで即座に評価できる。
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-emr-master-no-public-ip-<HASH>(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-emr-master-no-public-ip-<HASH> \
--compliance-types NON_COMPLIANT \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,Compliance:ComplianceType}'[
{
"ResourceId": "<CLUSTER_ID>",
"Compliance": "NON_COMPLIANT"
}
]Security Hub finding の確認
Config → Security Hub の反映には追加で数分かかる。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EMR.1"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}]
}' \
--query 'Findings[].{ResourceId:Resources[0].Id,Status:Compliance.Status,UpdatedAt:UpdatedAt}'[
{
"ResourceId": "<CLUSTER_ARN>",
"Status": "FAILED",
"UpdatedAt": "<TIMESTAMP>"
}
]4. クラスター終了
aws emr terminate-clusters --cluster-ids <CLUSTER_ID>(出力なし)終了確認
aws emr describe-cluster \
--cluster-id <CLUSTER_ID> \
--query 'Cluster.{Id:Id,State:Status.State}'{
"Id": "<CLUSTER_ID>",
"State": "TERMINATED"
}5. PASSED 復帰確認
クラスター終了後、手動トリガーで評価を実行する。
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-emr-master-no-public-ip-<HASH>(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-emr-master-no-public-ip-<HASH> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,Compliance:ComplianceType}'(出力なし — 対象リソースが存在しないため)Security Hub finding の確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EMR.1"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}]
}' \
--query 'Findings[].{ResourceId:Resources[0].Id,Status:Compliance.Status}'(出力なし — finding が解消されている)6. クリーンアップ
EMR デフォルトロールの削除(検証用に作成した場合)
aws iam remove-role-from-instance-profile --instance-profile-name EMR_EC2_DefaultRole --role-name EMR_EC2_DefaultRole
aws iam delete-instance-profile --instance-profile-name EMR_EC2_DefaultRole
aws iam detach-role-policy --role-name EMR_EC2_DefaultRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceforEC2Role
aws iam delete-role --role-name EMR_EC2_DefaultRole
aws iam detach-role-policy --role-name EMR_DefaultRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceRole
aws iam delete-role --role-name EMR_DefaultRole
aws iam detach-role-policy --role-name EMR_AutoScaling_DefaultRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceforAutoScalingRole
aws iam delete-role --role-name EMR_AutoScaling_DefaultRole(出力なし)