S3 パブリックアクセス
S3 バケットおよびアクセスポイントのデータがパブリックに公開されていないかをチェックするコントロール群。S3 固有の Block Public Access(BPA)、バケットポリシー、ACL の設定を評価する。
BPA はアカウントレベル・バケットレベル・アクセスポイントレベルの 3 階層で独立して設定でき、各コントロールは評価対象とするレベルが異なる(詳細は後述)。
対象コントロール(5 件)
関連する宣言型ポリシー: S3 ポリシー(宣言型)
デフォルト保護は API のデフォルト値(CLI でオプションを省略した場合の値)に基づく。マネジメントコンソールではより安全な値がプリセットされている場合がある。評価方式の詳細は 評価方式の違い を参照。
| コントロール | 重大度 | タイトル | デフォルト保護 | IAM Access Analyzer | 記事 |
|---|---|---|---|---|---|
| S3.2 | CRITICAL | S3 汎用バケットでパブリック読み取りアクセスをブロックする | 保護済み(検証済み: 2023 年 4 月以降に作成されたバケットはバケットレベル BPA 4 設定すべてデフォルトで有効、かつデフォルトではバケットポリシーが存在しないため PASSED) | 対象 | 検証済み |
| S3.3 | CRITICAL | S3 汎用バケットでパブリック書き込みアクセスをブロックする | 保護済み(検証済み: S3.2 と同じ理由。デフォルトでバケットレベル BPA 全有効 + ポリシー不在で PASSED) | 対象 | 検証済み |
| S3.19 | CRITICAL | S3 アクセスポイントで BPA 設定を有効にする | 保護済み(検証済み: アクセスポイント作成時のデフォルトで BPA 4 設定すべて true になるため PASSED) | 対象 | 検証済み |
| S3.6 | HIGH | S3 汎用バケットポリシーで他の AWS アカウントからのアクセスを制限する | 保護済み(検証済み: デフォルトではバケットポリシーが存在せず、Principal 評価対象がないため PASSED) | 対象 | 検証済み |
| S3.8 | HIGH | S3 汎用バケットで BPA を有効にする | 保護済み(検証済み: 2023 年 4 月以降に作成されたバケットはバケットレベル BPA 4 設定すべてデフォルトで有効のため PASSED) | 対象 | 検証済み |
保護レイヤーの整理
S3 のパブリックアクセス防止には複数のレイヤーが存在する。Security Hub CSPM の 5 件のコントロールがそれぞれどのレイヤーをチェックしているかを整理する。各コントロールの評価ロジックは AWS Config ルールの公式ドキュメントで確認できる。
評価方式の違い
5 件のコントロールは、評価方式が大きく 3 種類に分かれる。
| 評価方式 | コントロール | 評価対象の BPA レベル | 説明 |
|---|---|---|---|
| 結果ベース(総合判断) | S3.2, S3.3 | アカウントレベル + バケットレベル | アカウントレベル BPA、バケットレベル BPA、バケットポリシー、ACL を総合的に評価し、実際にパブリックアクセスが可能かを判断する。バケットレベル BPA を無効化しただけでは FAILED にならない(アカウントレベル BPA が有効であればそれで条件を満たす。BPA 検証のパターン 5 で実証済み) |
| 設定ベース | S3.8 | バケットレベルのみ | バケットレベル BPA の設定値を直接チェックする。設定が無効であれば即 FAILED。アカウントレベル BPA が有効でもバケットレベル BPA が無効なら NON_COMPLIANT(S3.8 検証 で確認済み) |
| 設定ベース | S3.19 | アクセスポイントレベルのみ | アクセスポイントレベル BPA の設定値を直接チェックする。アカウント・バケットレベル BPA が有効でもアクセスポイントレベル BPA が無効なら NON_COMPLIANT |
| ポリシーベース | S3.6 | BPA は評価対象外 | バケットポリシーの Principal と Action の組み合わせをチェックする。バケット所有アカウント以外に制限対象アクションを許可していれば FAILED。Condition 付きのポリシーは COMPLIANT と判定される(S3.6 の検証で確認) |
S3.2 / S3.3 の評価ロジック
S3.2(読み取り)と S3.3(書き込み)は同じ構造で、以下の両方が満たされれば COMPLIANT となる。評価対象の BPA はアカウントレベル BPA とバケットレベル BPA の両方を含む(どちらか一方でも制限していれば条件を満たす)。
- アカウントレベルまたはバケットレベルの BPA がパブリックポリシーを制限している、またはバケットポリシーがパブリックアクセスを許可していない
- アカウントレベルまたはバケットレベルの BPA がパブリック ACL を制限している、またはバケット ACL がパブリックアクセスを許可していない
アカウントレベル BPA とバケットレベル BPA はガードレールであり、両方とも無効化しても、ポリシーと ACL の両方がパブリックアクセスを許可していなければ COMPLIANT のままとなる。
BPA の 4 設定(全レベル共通)
BPA の 4 設定(BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy, RestrictPublicBuckets)はアカウント/バケット/アクセスポイント全レベル共通で存在し、「ACL 経路/ポリシー経路」×「予防/事後対応」で分類される(公式ドキュメント)。
| 経路 | 予防(新規設定をブロック) | 事後対応(既存設定の効果を無効化) |
|---|---|---|
| ACL 経路 | BlockPublicAcls | IgnorePublicAcls |
| ポリシー経路 | BlockPublicPolicy | RestrictPublicBuckets |
- ACL は 2023 年 4 月以降のバケットではデフォルト無効(
BucketOwnerEnforced)のため、実質的にはポリシー経路が主 - S3.2 と S3.3 の違いはアカウントレベル BPA / バケットレベル BPA のどの設定を見るかではなく、最終的に「読み取りが可能か」「書き込みが可能か」という判定結果の違い
BPA 設定と S3.2 / S3.3 の関係(検証結果)
バケットポリシーでパブリック読み書きを許可した状態で、ポリシー経路の BPA 設定を変えた場合の検証結果:
| # | レベル | BlockPublicPolicy | RestrictPublicBuckets | S3.2 | S3.3 |
|---|---|---|---|---|---|
| 1 | バケット | false | false | NON_COMPLIANT | NON_COMPLIANT |
| 2 | バケット | false | true | COMPLIANT | COMPLIANT |
| 3 | バケット | true | false | COMPLIANT | COMPLIANT |
| 4 | バケット | true | true | COMPLIANT | COMPLIANT |
| 5 | アカウント | true | true | COMPLIANT | COMPLIANT |
BlockPublicPolicyまたはRestrictPublicBucketsのどちらか一方が true であれば COMPLIANT- ただし
BlockPublicPolicy=true, RestrictPublicBuckets=falseの組み合わせは、既存のパブリックポリシーが有効なままアクセス可能であり COMPLIANT だが安全ではない(偽陰性) - バケットレベルとアカウントレベルのどちらで設定しても有効
- 両方 false の場合のみ、バケットポリシーの内容が評価され NON_COMPLIANT となる
S3.8 の評価ロジック
バケットレベル BPA の 4 設定(BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy, RestrictPublicBuckets)がすべて有効かをチェックする。1 つでも無効であれば NON_COMPLIANT。アカウントレベル BPA が有効でも、バケットレベル BPA が無効なら NON_COMPLIANT(S3.8 の検証で確認済み)。
S3.19 の評価ロジック
アクセスポイントの BPA 設定が有効かをチェックする。設定ベースの評価。アクセスポイントの BPA は作成後に変更不可。アカウントレベル BPA が有効でも、アクセスポイントの BPA が無効なら NON_COMPLIANT(S3.19 の検証で確認済み)。
S3.6 の評価ロジック
バケットポリシーがバケット所有アカウント以外に制限対象アクション(s3:DeleteBucketPolicy, s3:PutBucketAcl, s3:PutBucketPolicy, s3:PutEncryptionConfiguration, s3:PutObjectAcl)を許可していないかをチェックする。「他の AWS アカウント」は組織内/外を区別しない。どのレベルの BPA(アカウント/バケット/アクセスポイント)も評価対象外で、BPA が有効でもバケットポリシーの内容自体は変わらないため finding に影響しない。CT.S3.PV.4(RCP)が有効でも finding は変わらない(S3.6 の検証で確認済み)。
予防手段との対応
| コントロール | 評価方式 | S3 ポリシー(宣言型) | CT.S3.PV.4(RCP) |
|---|---|---|---|
| S3.2 | 結果ベース | パブリックアクセスを予防 / COMPLIANT に変化 | パブリックアクセスを予防 / finding 変化なし |
| S3.3 | 結果ベース | パブリックアクセスを予防 / COMPLIANT に変化 | パブリックアクセスを予防 / finding 変化なし |
| S3.19 | 設定ベース | パブリックアクセスを予防 / NON_COMPLIANT のまま | ― |
| S3.6 | ポリシーベース | ― | クロスアカウントアクセスを予防 / finding 変化なし |
| S3.8 | 設定ベース | パブリックアクセスを予防 / NON_COMPLIANT のまま | ― |
「―」は予防手段の対象外であることを示す。
- S3 ポリシー(宣言型): 組織レベルでアカウントレベル BPA を強制する。メンバーアカウントのユーザーはアカウントレベル BPA を無効化できない(AccessDenied)。バケットレベル BPA の変更はブロックされないが、アカウントレベル BPA の
BlockPublicPolicyによりパブリックポリシーの設定自体が拒否されるため、パブリックアクセスは成立しない。結果ベース評価の S3.2 / S3.3 は COMPLIANT に変化する。一方、バケットレベル・アクセスポイントレベル BPA には触れないため、設定ベース評価の S3.8 / S3.19 は NON_COMPLIANT のまま(検証済み) - CT.S3.PV.4(RCP): 組織外アカウントからの S3 API 操作を実行時に Deny する。メンバーアカウントのユーザーはバケットポリシーを変更できるが、組織外からの実際のアクセスは RCP により拒否される(検証済み)。リソースポリシーや BPA 設定自体は書き換えないため finding に影響しない(S3.2、S3.6 で確認済み)
いずれもメンバーアカウント側で予防を突破することはできない。ただし「パブリックアクセスの予防」と「Security Hub finding の COMPLIANT 化」は別物である点に注意。予防手段を適用していても、finding が COMPLIANT になるとは限らない。