ablog

不器用で落着きのない技術者のメモ

S3 へのパブリックアクセスを一切禁止する

Amazon S3 Block Public Access で S3 へのパブリック・アクセスを一切禁止する設定例。アカウント全体と各バケット毎の設定があるが、各バケット毎の設定はアカウント全体設定でオーバライドされる。つまり、アカウント全体の設定で禁止していると、バケット単位で許可しても許可されない。

すでにアカウントレベルで全パブリックアクセスを拒否しているため、実際には余分な設定ですが、バケットレベルで制御可能だということは覚えておいてください。バケットレベルでオプションを変更しても、アカウントレベルでの設定は上書きできません。

Amazon S3 Block Public Access – アカウントとバケットのさらなる保護 | Amazon Web Services ブログ

設定例

このアカウントのパブリックアクセスコントロールリスト (ACL) を管理する
  • 新規のパブリック ACL と、パブリックオブジェクトのアップロードをブロックする (推奨) : チェック
  • パブリック ACL を通じて付与されたパブリックアクセスを削除する (推奨) : チェック
このアカウントのパブリックバケットポリシーを管理する
  • 新規のパブリックバケットポリシーをブロックする (推奨) : チェック
  • パブリックポリシーを持つバケットへのパブリックアクセスとクロスアカウントアクセスをブロックする (推奨) : チェック
補足
  • 以下のアクセス権限をIAMユーザーに付与しない、または Organizations の子アカウントについては SCP(Service Control Policy) で S3 Block Public Access の設定変更を禁止できる*1
    • PutAccountPublicAccessBlock … アカウントレベルの設定禁止
    • PutBucketPublicAccessBlock … バケットレベルの設定禁止
  • 新規AWSアカウントを作成すると、デフォルトで S3 Block Public Access はアカウントレベルでは False、バケットレベルでは True*2

意味

新規のパブリック ACL と、パブリックオブジェクトのアップロードをブロックする (推奨)
  • バケットACLで以下の設定がバケットレベル(左画像)でもオブジェクトレベル(右画像)でもできなくなる*3

  • オブジェクトの「公開」もできない。

パブリック ACL を通じて付与されたパブリックアクセスを削除する (推奨)
  • オブジェクトアップロード時にパブリックACLを設定すると、オブジェクトのアップロードは成功するが、パブリックACLは付与されない。



新規のパブリックバケットポリシーをブロックする (推奨)
  • パブリックバケットポリシー("Principal": "*")を設定できない。

  • AWSアカウントIDを指定したクロスアカウントのアクセス許可は可能。

パブリックポリシーを持つバケットへのパブリックアクセスとクロスアカウントアクセスをブロックする (推奨)
  • パブリックバケットポリシーが設定されても、

  • パブリックアクセスは拒否される。

$ aws s3 cp s3://s3-public-block-acl-test/test.txt ./
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

補足

RestrictPublicBuckets*4 を True にするとクロスアカウントアクセスが不可になるか?
  • パブリックポリシーを設定しなければクロスアカウントアクセス可能*5
DeleteAccountPublicAccessBlock、DeleteBucketPublicAccessBlock を許可する権限は何か?
  • Put/Delete とも PutAccountPublicAccessBlock、PutBucketPublicAccessBlock の2つの権限があれば可能。逆に禁止する場合は、SCP でこの2つの権限を拒否すれば、Put/DeleteAccountPublicAccessBlock、Put/DeleteBucketPublicAccessBlock を禁止できる。
$ aws s3control delete-public-access-block --account-id 012345678901
An error occurred (AccessDenied) when calling the DeletePublicAccessBlock operation: Access Denied

$ aws s3control put-public-access-block --account-id 012345678901 --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
An error occurred (AccessDenied) when calling the PutPublicAccessBlock operation: Access Denied

*1:要検証

*2:新規バケットを作成するとデフォルトで True

*3:チェックして「保存」をクリックすると「エラー アクセス拒否」とメッセージが表示され設定できない

*4:パブリックポリシーを持つバケットへのパブリックアクセスとクロスアカウントアクセスをブロックする

*5:s3 cp でクロスアカウントでバケット間コピーすると "An error occurred (AccessDenied) when calling the UploadPartCopy operation" と怒られる - ablog の通り、コピー先にパブリックポリシーがあっても失敗するので注意