EMR Block Public Access
カスタム 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 つ:
BlockPublicSecurityGroupRules: false(BPA 無効)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-1securityhub-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-1falseSCP 適用前は変更が成功する。
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": "*"
}
]
}
EOFSCP 作成
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>&1An 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>&1An 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-1falseSCP デタッチ後は再び設定変更ができる。
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(出力なし)