コンテンツにスキップ

EMR Block Public Access

検証日: 2026-05-17 / リージョン: ap-northeast-1

カスタム SCP の説明

背景: EMR Block Public Access(BPA)

Amazon EMR の Block Public Access(BPA)は、パブリックなインバウンドルールを持つセキュリティグループに関連付けられた EMR クラスターの起動を EMR サービス自身がブロックする機構である。BPA はアカウント・リージョン単位の設定で、elasticmapreduce:PutBlockPublicAccessConfiguration API で変更する。

EMR.2 は「アカウントの EMR BPA 設定が有効かつ port 22 以外の例外ポートがないか」をチェックするコントロールである。FAILED になる条件は以下の 2 つ:

  1. BlockPublicSecurityGroupRules: false(BPA 無効)
  2. BlockPublicSecurityGroupRules: true だが port 22 以外の例外ポートが PermittedPublicSecurityGroupRuleRanges に含まれる

詳細は EMR.2 を参照。

Security Hub CSPM EMR.2 との関係

EMR BPA はデフォルトで有効(BlockPublicSecurityGroupRules: true、例外 port 22 のみ)であり、EMR.2 は新規アカウントで PASSED となる。ただし、メンバーアカウントの管理者が誤って BPA を無効化したり、例外ポートを追加したりすると EMR.2 は FAILED となる。

このカスタム SCP の役割

Control Tower の標準予防コントロールには EMR BPA 設定変更を制御するものが存在しないため、カスタム SCP で対応する。本記事のカスタム SCP は elasticmapreduce:PutBlockPublicAccessConfiguration API を Deny する。これにより、メンバーアカウント側で EMR BPA 設定が変更(無効化または例外ポート追加)されることを防げる。

SSM.7 のカスタム SCP と異なり、Resource で特定 ARN に絞り込むことができないため API 単位の Deny となる。ただし PutBlockPublicAccessConfiguration は EMR BPA 設定変更専用の API であり、他の EMR 操作(クラスター作成、設定取得等)には影響しない。

適用順序の注意

EMR BPA はデフォルトで有効なため、SSM.7 のような「BPA 有効化 → SCP 適用」の順序制約はない。SCP を先に適用しても問題ない。

SCP の内容

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyEMRBlockPublicAccessChanges",
      "Effect": "Deny",
      "Action": [
        "elasticmapreduce:PutBlockPublicAccessConfiguration"
      ],
      "Resource": "*"
    }
  ]
}

検証環境

検証環境の構成図

本記事のコマンドは、--profile 指定がない場合は Workload アカウントで実行する。Master アカウントでの操作には --profile Master を指定する。事前に export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。

検証の流れ

    flowchart LR
    A[1. 事前準備<br>BPA 有効状態確認<br>EMR.2 PASSED 確認] --> B[2. SCP 適用前<br>BPA 設定変更が成功]
    B --> C[3. BPA 再有効化]
    C --> D[4. SCP 作成]
    D --> E[5. OU にアタッチ]
    E --> F[6. BPA 設定変更が<br>Deny されることを確認<br>(無効化・例外追加の両方)]
    F --> G[7. EMR の他の操作が<br>影響を受けないことを確認]
    G --> H[8. SCP デタッチ]
    H --> I[9. BPA 設定変更が再び成功<br>EMR.2 PASSED 維持確認]
    I --> J[10. クリーンアップ]
  

結果

  • SCP 適用前は、メンバーアカウントの管理者が put-block-public-access-configuration で EMR BPA 設定を変更できることを確認できた
  • BPA がデフォルトで有効であり、EMR.2 が PASSED であることを確認できた(検証の前提条件成立)
  • SCP 適用後、BPA を無効化しようとする操作(BlockPublicSecurityGroupRules: false)が AccessDeniedException で拒否されることを確認できた
  • SCP 適用後、例外ポートを追加しようとする操作(port 22 以外を追加)も同様に拒否されることを確認できた
  • elasticmapreduce:GetBlockPublicAccessConfiguration(GET 系)は SCP に阻まれず実行できることを確認できた
  • SCP デタッチ後は再び BPA 設定を変更できることを確認できた。EMR.2 が PASSED のまま維持されていることも確認した

1. 事前準備(BPA 有効状態の確認)

EMR BPA はデフォルトで有効なため、SSM.7 のような有効化手順は不要。現在の BPA 設定を確認し、EMR.2 が PASSED であることを確認する。

BPA 設定の確認

aws emr get-block-public-access-configuration \
  --query 'BlockPublicAccessConfiguration.{BlockPublicSecurityGroupRules:BlockPublicSecurityGroupRules,PermittedPublicSecurityGroupRuleRanges:PermittedPublicSecurityGroupRuleRanges}' \
  --region ap-northeast-1
{
    "BlockPublicSecurityGroupRules": true,
    "PermittedPublicSecurityGroupRuleRanges": [
        {
            "MinRange": 22,
            "MaxRange": 22
        }
    ]
}

BlockPublicSecurityGroupRules: true かつ例外が port 22 のみであれば EMR.2 は PASSED のはず。

もし BlockPublicSecurityGroupRules: false の場合: BPA が無効化されており EMR.2 は FAILED の状態。本検証は「BPA 有効状態から開始」を前提とするため、事前に put-block-public-access-configuration で BPA を有効化してから進める必要がある。

Config ルール名のサフィックスを確認

aws configservice describe-config-rules \
  --query 'ConfigRules[?contains(ConfigRuleName,`emr-block-public-access`)].ConfigRuleName' \
  --output text \
  --region ap-northeast-1
securityhub-emr-block-public-access-<サフィックス>

Security Hub EMR.2 finding 確認(PASSED であること)

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-emr-block-public-access-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。ResourceId はアカウント ID(数字のみ)のため、JMESPath フィルタではシングルクォートで囲む。ResultRecordedTime が BPA 有効化操作の時刻より後であることを確認し、再評価されたことを示す。

sleep 90
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-emr-block-public-access-<サフィックス> \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='<アカウント ID>'].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1
[
    {
        "ResourceId": "<アカウント ID>",
        "ComplianceType": "COMPLIANT",
        "ResultRecordedTime": "<評価時刻>"
    }
]
aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EMR.2"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "AWS::::Account:<アカウント ID>"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>",
        "UpdatedAt": "<更新時刻>"
    }
]

EMR.2 が PASSED であることを確認できた。古い finding が残っている場合は複数件返ることがあるが、最新の UpdatedAt のものが現在の状態を示す。これで検証の前提条件が成立した。

2. SCP 適用前のベースライン確認

メンバーアカウントの管理者として、BPA 設定が変更可能であることを確認する。一度 BPA を無効化して、再度有効化し直す。

BPA を無効化

aws emr put-block-public-access-configuration \
  --block-public-access-configuration '{"BlockPublicSecurityGroupRules": false}' \
  --region ap-northeast-1
(出力なし)

設定値を確認

aws emr get-block-public-access-configuration \
  --query 'BlockPublicAccessConfiguration.BlockPublicSecurityGroupRules' \
  --region ap-northeast-1
false

SCP 適用前は変更が成功する。

3. BPA 再有効化

aws emr put-block-public-access-configuration \
  --block-public-access-configuration '{"BlockPublicSecurityGroupRules": true, "PermittedPublicSecurityGroupRuleRanges": [{"MinRange": 22, "MaxRange": 22}]}' \
  --region ap-northeast-1
(出力なし)
aws emr get-block-public-access-configuration \
  --query 'BlockPublicAccessConfiguration.{BlockPublicSecurityGroupRules:BlockPublicSecurityGroupRules,PermittedPublicSecurityGroupRuleRanges:PermittedPublicSecurityGroupRuleRanges}' \
  --region ap-northeast-1
{
    "BlockPublicSecurityGroupRules": true,
    "PermittedPublicSecurityGroupRuleRanges": [
        {
            "MinRange": 22,
            "MaxRange": 22
        }
    ]
}

4. カスタム SCP 作成

ポリシー JSON ファイル作成

cat > /tmp/scp-emr-block-public-access.json <<'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyEMRBlockPublicAccessChanges",
      "Effect": "Deny",
      "Action": [
        "elasticmapreduce:PutBlockPublicAccessConfiguration"
      ],
      "Resource": "*"
    }
  ]
}
EOF

SCP 作成

aws organizations create-policy \
  --name DenyEMRBlockPublicAccessChanges \
  --description "Deny changes to EMR Block Public Access configuration" \
  --type SERVICE_CONTROL_POLICY \
  --content file:///tmp/scp-emr-block-public-access.json \
  --query 'Policy.PolicySummary.{Id:Id,Name:Name,Type:Type}' \
  --profile Master
{
    "Id": "<ポリシー ID>",
    "Name": "DenyEMRBlockPublicAccessChanges",
    "Type": "SERVICE_CONTROL_POLICY"
}

5. OU にアタッチ

aws organizations attach-policy \
  --policy-id <ポリシー ID> \
  --target-id <OU ID> \
  --profile Master
(出力なし)

アタッチを確認

aws organizations list-policies-for-target \
  --target-id <OU ID> \
  --filter SERVICE_CONTROL_POLICY \
  --query 'Policies[?Name==`DenyEMRBlockPublicAccessChanges`]' \
  --profile Master
[
    {
        "Id": "<ポリシー ID>",
        "Arn": "arn:aws:organizations::<Master アカウント ID>:policy/o-<組織 ID>/service_control_policy/<ポリシー ID>",
        "Name": "DenyEMRBlockPublicAccessChanges",
        "Description": "Deny changes to EMR Block Public Access configuration",
        "Type": "SERVICE_CONTROL_POLICY",
        "AwsManaged": false
    }
]

SCP の適用には数秒〜数十秒のラグがある。ステップ 6 の操作はアタッチ確認後、さらに数十秒待ってから実施すること。

6. BPA 設定変更が Deny されることを確認

PutBlockPublicAccessConfiguration は BPA を無効化する操作と例外ポートを変更する操作の両方に使われる。SCP はこの API を Deny するため、どちらの操作も拒否されることを確認する。

BPA を無効化しようとする → Deny

aws emr put-block-public-access-configuration \
  --block-public-access-configuration '{"BlockPublicSecurityGroupRules": false}' \
  --region ap-northeast-1 2>&1
An error occurred (AccessDeniedException) when calling the PutBlockPublicAccessConfiguration operation: User: arn:aws:sts::<Workload アカウント ID>:assumed-role/<ロール名>/<セッション名> is not authorized to perform: elasticmapreduce:PutBlockPublicAccessConfiguration on resource: * with an explicit deny in a service control policy: arn:aws:organizations::<Master アカウント ID>:policy/o-<組織 ID>/service_control_policy/<ポリシー ID>

例外ポートを追加しようとする → Deny

port 22 以外(例: 8080)を例外に追加しようとしても拒否されることを確認する。

aws emr put-block-public-access-configuration \
  --block-public-access-configuration '{"BlockPublicSecurityGroupRules": true, "PermittedPublicSecurityGroupRuleRanges": [{"MinRange": 22, "MaxRange": 22}, {"MinRange": 8080, "MaxRange": 8080}]}' \
  --region ap-northeast-1 2>&1
An error occurred (AccessDeniedException) when calling the PutBlockPublicAccessConfiguration operation: ...(同上)

設定値が変わっていないことを確認

aws emr get-block-public-access-configuration \
  --query 'BlockPublicAccessConfiguration.{BlockPublicSecurityGroupRules:BlockPublicSecurityGroupRules,PermittedPublicSecurityGroupRuleRanges:PermittedPublicSecurityGroupRuleRanges}' \
  --region ap-northeast-1
{
    "BlockPublicSecurityGroupRules": true,
    "PermittedPublicSecurityGroupRuleRanges": [
        {
            "MinRange": 22,
            "MaxRange": 22
        }
    ]
}

設定値は変わっていない。

7. EMR の他の操作が影響を受けないことを確認

SCP は PutBlockPublicAccessConfiguration のみを Deny するため、GetBlockPublicAccessConfiguration(GET 系)は影響を受けないことを確認する。

aws emr get-block-public-access-configuration \
  --query 'BlockPublicAccessConfiguration.{BlockPublicSecurityGroupRules:BlockPublicSecurityGroupRules,PermittedPublicSecurityGroupRuleRanges:PermittedPublicSecurityGroupRuleRanges}' \
  --region ap-northeast-1
{
    "BlockPublicSecurityGroupRules": true,
    "PermittedPublicSecurityGroupRuleRanges": [
        {
            "MinRange": 22,
            "MaxRange": 22
        }
    ]
}

GET 系の操作は SCP に阻まれず実行できる。

8. SCP デタッチ

aws organizations detach-policy \
  --policy-id <ポリシー ID> \
  --target-id <OU ID> \
  --profile Master
(出力なし)

9. BPA 設定変更が再び成功することを確認

SCP のデタッチには数分のラグがある場合があるため、Deny が続く場合は数分待ってから再試行する。

aws emr put-block-public-access-configuration \
  --block-public-access-configuration '{"BlockPublicSecurityGroupRules": false}' \
  --region ap-northeast-1
(出力なし)
aws emr get-block-public-access-configuration \
  --query 'BlockPublicAccessConfiguration.BlockPublicSecurityGroupRules' \
  --region ap-northeast-1
false

SCP デタッチ後は再び設定変更ができる。

BPA を有効状態に戻す

aws emr put-block-public-access-configuration \
  --block-public-access-configuration '{"BlockPublicSecurityGroupRules": true, "PermittedPublicSecurityGroupRuleRanges": [{"MinRange": 22, "MaxRange": 22}]}' \
  --region ap-northeast-1
(出力なし)

Security Hub EMR.2 finding 確認(PASSED 維持)

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-emr-block-public-access-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。ResultRecordedTime が BPA 再有効化操作の時刻より後であることを確認し、再評価されたことを示す。

sleep 90
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-emr-block-public-access-<サフィックス> \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='<アカウント ID>'].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1
[
    {
        "ResourceId": "<アカウント ID>",
        "ComplianceType": "COMPLIANT",
        "ResultRecordedTime": "<評価時刻>"
    }
]
aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EMR.2"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "AWS::::Account:<アカウント ID>"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>",
        "UpdatedAt": "<更新時刻>"
    }
]

EMR.2 が PASSED のまま維持されていることを確認できた。

10. クリーンアップ

SCP 削除

aws organizations delete-policy \
  --policy-id <ポリシー ID> \
  --profile Master
(出力なし)

Amazonアソシエイトリンク