コンテンツにスキップ

EMR.1

検証日: 2026-04-26 / リージョン: ap-northeast-1

コントロールの説明

EMR クラスターのマスターノード(プライマリノード)に実際にパブリック IP アドレスが付与されているかをチェックする。マスターノードの EC2 インスタンスの NetworkInterfacesPublicIp が存在する場合に 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
(出力なし)

Amazonアソシエイトリンク