コンテンツにスキップ

S3.19

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

--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。

コントロールの説明

S3 アクセスポイントの Block Public Access(BPA)設定が有効かをチェックする。4 設定のいずれかが無効であれば FAILED となる。

S3.2 / S3.3(結果ベースの総合判断)とは異なり、S3.8 と同じ設定ベースの評価方式である。アクセスポイントの BPA 設定のみをチェックし、上位レベル(アカウント・バケット)の BPA は考慮しない。

アクセスポイントの BPA には以下の特性がある。

  • デフォルトで 4 設定すべて有効
  • 作成後に変更不可(変更 API が存在しない)
  • BPA 無効で作成するには --public-access-block-configuration を明示的に指定する必要がある
  • PASSED に戻すにはアクセスポイントを削除して BPA 有効で再作成するしかない

アクセスポイント経由のアクセス制御

アクセスポイント経由でオブジェクトにアクセスするには、アクセスポイントポリシーとバケットポリシーの両方で許可が必要である(公式ドキュメント)。

#AP ポリシーバケットポリシー(委任)組織外アクセス
1なしありAccessDenied
2ありありアクセス可能
3ありなしAccessDenied

バケットポリシーでアクセスポイントへのアクセス制御を委任する方法(推奨):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "*",
            "Resource": ["arn:aws:s3:::<バケット名>", "arn:aws:s3:::<バケット名>/*"],
            "Condition": {
                "StringEquals": { "s3:DataAccessPointAccount": "<アカウント ID>" }
            }
        }
    ]
}

上位レベル BPA との関係

公式ドキュメントによると、アクセスポイント経由のリクエストに対して S3 はアクセスポイント、バケット、アカウントの 3 階層の BPA 設定を評価し、いずれかがブロックを示していればリクエストを拒否する。

アカウントレベル BPAAP BPA組織外組織内
無効無効アクセス可能アクセス可能
有効無効AccessDeniedアクセス可能

アカウントレベル BPA が有効なら、アクセスポイントの BPA が無効でも組織外からのパブリックアクセスはブロックされる。ただし S3.19 の Config ルールはアクセスポイント自体の BPA 設定のみをチェックするため、上位レベルが有効でも NON_COMPLIANT になる。

対応する Config ルール: S3_ACCESS_POINT_PUBLIC_ACCESS_BLOCKS(変更トリガー)

結果

  • デフォルトで作成したアクセスポイントは BPA 4 設定すべて有効で PASSED
  • BPA 全無効で作成したアクセスポイントは NON_COMPLIANT
  • BPA 一部無効(ポリシー経路のみ無効)で作成したアクセスポイントも NON_COMPLIANT(4 設定すべて有効でないと COMPLIANT にならない)
  • アカウントレベル BPA が有効でも、アクセスポイントの BPA 設定が無効なら NON_COMPLIANT のまま
  • アクセスポイント経由のパブリックアクセスには AP ポリシーとバケットポリシー(委任)の両方が必要
  • アカウントレベル BPA が有効なら、AP BPA が無効でも組織外からのアクセスはブロックされる(組織内からはアクセス可能)
  • 作成後に BPA 設定を変更する API は存在しない。PASSED に戻すにはアクセスポイントを削除して再作成するしかない
  • S3 ポリシー(S3 BPA) を有効化しても NON_COMPLIANT のまま(AP BPA は変更されないため)

前提条件

項目状態
アカウントレベル BPA未設定
バケットレベル BPA4 設定すべて有効(デフォルト)

検証の流れ

    flowchart LR
    A[1. デフォルト状態の確認] --> B[2. テストバケット +<br>アクセスポイント作成]
    B --> C[3. COMPLIANT /<br>NON_COMPLIANT 確認]
    C --> D[4. パブリックアクセスの<br>検証]
    D --> E[5. アカウントレベル<br>BPA の影響確認]
    E --> F[6. クリーンアップ]
  

1. デフォルト状態の確認

アカウントレベル BPA が未設定であることを確認

aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the GetPublicAccessBlock operation: The public access block configuration was not found

Security Hub finding の現在の状態を確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "S3.19"}]
  }' \
  --query 'Findings[*].{ResourceId:Resources[0].Id,Status:Compliance.Status,ResourceType:Resources[0].Type}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "AWS::::Account:<アカウント ID>",
        "Status": "PASSED",
        "ResourceType": "AwsAccount"
    }
]

アクセスポイントが存在しないため、アカウントレベルの PASSED のみ。

2. テストバケット + アクセスポイント作成

テスト用バケットの作成

aws s3api create-bucket \
  --bucket <テストバケット名> \
  --create-bucket-configuration LocationConstraint=ap-northeast-1 \
  --region ap-northeast-1
{
    "Location": "http://<テストバケット名>.s3.amazonaws.com/",
    "BucketArn": "arn:aws:s3:::<テストバケット名>"
}

バケットレベル BPA を全無効化

アクセスポイント経由のパブリックアクセスの検証(ステップ 4)で必要。

aws s3api put-public-access-block \
  --bucket <テストバケット名> \
  --public-access-block-configuration \
    BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false \
  --region ap-northeast-1
(出力なし)

バケットレベル BPA の確認

aws s3api get-public-access-block \
  --bucket <テストバケット名> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}

テスト用オブジェクトのアップロード

echo "test" | aws s3 cp - s3://<テストバケット名>/test.txt \
  --region ap-northeast-1
(出力なし)

アクセスポイント作成(デフォルト BPA 有効)

aws s3control create-access-point \
  --name <デフォルト AP 名> \
  --account-id <アカウント ID> \
  --bucket <テストバケット名> \
  --region ap-northeast-1
{
    "AccessPointArn": "arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<デフォルト AP 名>",
    "Alias": "<エイリアス>"
}

デフォルト AP の BPA 設定を確認

aws s3control get-access-point \
  --name <デフォルト AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1 \
  --query '{Name:Name,PublicAccessBlockConfiguration:PublicAccessBlockConfiguration}'
{
    "Name": "<デフォルト AP 名>",
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

アクセスポイント作成(BPA 全無効)

aws s3control create-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --bucket <テストバケット名> \
  --public-access-block-configuration BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false \
  --region ap-northeast-1
{
    "AccessPointArn": "arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名>",
    "Alias": "<エイリアス>"
}

BPA 無効 AP の設定を確認

aws s3control get-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1 \
  --query '{Name:Name,PublicAccessBlockConfiguration:PublicAccessBlockConfiguration}'
{
    "Name": "<BPA 無効 AP 名>",
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}

アクセスポイント作成(BPA 一部無効: ポリシー経路のみ無効)

aws s3control create-access-point \
  --name <BPA 一部無効 AP 名> \
  --account-id <アカウント ID> \
  --bucket <テストバケット名> \
  --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=false,RestrictPublicBuckets=false \
  --region ap-northeast-1
{
    "AccessPointArn": "arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 一部無効 AP 名>",
    "Alias": "<エイリアス>"
}

BPA 一部無効 AP の設定を確認

aws s3control get-access-point \
  --name <BPA 一部無効 AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1 \
  --query '{Name:Name,PublicAccessBlockConfiguration:PublicAccessBlockConfiguration}'
{
    "Name": "<BPA 一部無効 AP 名>",
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}

3. COMPLIANT / NON_COMPLIANT 確認

Config ルールの手動トリガー

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

Config 評価結果の確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --query 'EvaluationResults[*].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<デフォルト AP 名>",
        "ComplianceType": "COMPLIANT"
    },
    {
        "ResourceId": "<BPA 無効 AP 名>",
        "ComplianceType": "NON_COMPLIANT"
    },
    {
        "ResourceId": "<BPA 一部無効 AP 名>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

4 設定すべてが true でないと COMPLIANT にならない。

BPA 設定の変更不可を確認 → 削除して再作成

アクセスポイントの BPA を変更する API は存在しない。PASSED に戻すにはアクセスポイントを削除して再作成する。

aws s3control delete-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)
aws s3control create-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --bucket <テストバケット名> \
  --region ap-northeast-1
{
    "AccessPointArn": "arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名>",
    "Alias": "<エイリアス>"
}

再作成後の BPA 設定を確認

aws s3control get-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1 \
  --query '{Name:Name,PublicAccessBlockConfiguration:PublicAccessBlockConfiguration}'
{
    "Name": "<BPA 無効 AP 名>",
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

Config ルールの手動トリガー → COMPLIANT 確認

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<BPA 無効 AP 名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<BPA 無効 AP 名>",
        "ComplianceType": "COMPLIANT"
    }
]

4. パブリックアクセスの検証

アクセスポイント経由のパブリックアクセスには、AP ポリシーとバケットポリシー(委任)の両方が必要であることを確認する。

BPA 無効 AP を再作成

ステップ 3 で BPA 有効で再作成した AP を削除し、BPA 無効で再作成する。

aws s3control delete-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)
aws s3control create-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --bucket <テストバケット名> \
  --public-access-block-configuration BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false \
  --region ap-northeast-1
{
    "AccessPointArn": "arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名>",
    "Alias": "<エイリアス>"
}

テスト 1: AP ポリシーなし + バケットポリシー委任あり → AccessDenied

aws s3api put-bucket-policy \
  --bucket <テストバケット名> \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "*",
        "Resource": ["arn:aws:s3:::<テストバケット名>", "arn:aws:s3:::<テストバケット名>/*"],
        "Condition": {
          "StringEquals": {
            "s3:DataAccessPointAccount": "<アカウント ID>"
          }
        }
      }
    ]
  }' \
  --region ap-northeast-1
(出力なし)
aws s3api get-object \
  --bucket arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名> \
  --key test.txt /tmp/test.txt \
  --region ap-northeast-1 \
  --profile <組織外プロファイル>
An error occurred (AccessDenied) when calling the GetObject operation: Access Denied

テスト 2: AP ポリシーあり + バケットポリシー委任あり → アクセス可能

aws s3control put-access-point-policy \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名>/object/*"
      }
    ]
  }' \
  --region ap-northeast-1
(出力なし)
aws s3api get-object \
  --bucket arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名> \
  --key test.txt /tmp/test.txt \
  --region ap-northeast-1 \
  --profile <組織外プロファイル>
{
    "AcceptRanges": "bytes",
    "ContentLength": 5,
    "ContentType": "binary/octet-stream",
    ...
}

テスト 3: AP ポリシーあり + バケットポリシーなし → AccessDenied

aws s3api delete-bucket-policy \
  --bucket <テストバケット名> \
  --region ap-northeast-1
(出力なし)
aws s3api get-object \
  --bucket arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名> \
  --key test.txt /tmp/test.txt \
  --region ap-northeast-1 \
  --profile <組織外プロファイル>
An error occurred (AccessDenied) when calling the GetObject operation: Access Denied

アクセスポイント経由のアクセスには AP ポリシーとバケットポリシーの両方で許可が必要。

5. アカウントレベル BPA の影響確認

AP ポリシーあり + バケットポリシー委任あり(アクセス可能な状態)で、アカウントレベル BPA を有効化するとアクセスがブロックされることを確認する。

アクセス可能な状態を再構築

aws s3api put-bucket-policy \
  --bucket <テストバケット名> \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "*",
        "Resource": ["arn:aws:s3:::<テストバケット名>", "arn:aws:s3:::<テストバケット名>/*"],
        "Condition": {
          "StringEquals": {
            "s3:DataAccessPointAccount": "<アカウント ID>"
          }
        }
      }
    ]
  }' \
  --region ap-northeast-1
(出力なし)

組織外からアクセス可能であることを確認

aws s3api get-object \
  --bucket arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名> \
  --key test.txt /tmp/test.txt \
  --region ap-northeast-1 \
  --profile <組織外プロファイル>
{
    "AcceptRanges": "bytes",
    "ContentLength": 5,
    "ContentType": "binary/octet-stream",
    ...
}

アカウントレベル BPA を有効化

aws s3control put-public-access-block \
  --account-id <アカウント ID> \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true \
  --region ap-northeast-1
(出力なし)

アカウントレベル BPA の確認

aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

組織外からアクセス → AccessDenied

aws s3api get-object \
  --bucket arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名> \
  --key test.txt /tmp/test.txt \
  --region ap-northeast-1 \
  --profile <組織外プロファイル>
An error occurred (AccessDenied) when calling the GetObject operation: Access Denied

組織内からアクセス → アクセス可能

aws s3api get-object \
  --bucket arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名> \
  --key test.txt /tmp/test.txt \
  --region ap-northeast-1
{
    "AcceptRanges": "bytes",
    "ContentLength": 5,
    "ContentType": "binary/octet-stream",
    ...
}

アカウントレベル BPA が有効なら、AP BPA が無効でも組織外からのアクセスはブロックされる。組織内(バケットオーナーのアカウント)からはアクセス可能。

Config ルールの手動トリガー → NON_COMPLIANT のまま確認

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<BPA 無効 AP 名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<BPA 無効 AP 名>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

アカウントレベル BPA が有効で実際のアクセスがブロックされていても、S3.19 はアクセスポイント自体の BPA 設定のみをチェックするため NON_COMPLIANT のまま。

アカウントレベル BPA を元に戻す

aws s3control delete-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)

6. クリーンアップ

aws s3control delete-access-point \
  --name <デフォルト AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)
aws s3control delete-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)
aws s3control delete-access-point \
  --name <BPA 一部無効 AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)
aws s3api delete-bucket-policy \
  --bucket <テストバケット名> \
  --region ap-northeast-1
(出力なし)
aws s3 rm s3://<テストバケット名>/test.txt \
  --region ap-northeast-1
(出力なし)
aws s3api put-public-access-block \
  --bucket <テストバケット名> \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true \
  --region ap-northeast-1
(出力なし)
aws s3api delete-bucket \
  --bucket <テストバケット名> \
  --region ap-northeast-1
(出力なし)

Amazonアソシエイトリンク