S3.19
--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 設定を評価し、いずれかがブロックを示していればリクエストを拒否する。
| アカウントレベル BPA | AP 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 | 未設定 |
| バケットレベル BPA | 4 設定すべて有効(デフォルト) |
検証の流れ
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-1An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the GetPublicAccessBlock operation: The public access block configuration was not foundSecurity 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
(出力なし)