🐡

S3のパブリックアクセスのブロックとバケットポリシーを深堀り / 特定ネットワークからの匿名ユーザーリクエストを許可

に公開

S3のアクセス制御で実現したいこと

S3のアクセス制御で実現したいことがありました。

  • パブリックアクセスをblock
  • presigned urlのアクセス・IAM認証を利用したリクエストはallow
  • VPCの内部ネットワークからのパブリックアクセス(匿名ユーザー)からのアクセスをallow

たとえば、プライベートネットワークに存在するEC2からのS3のGetObejctはパブリックアクセスでオブジェクトを取得できる。といったことを実現したいです。

パブリックアクセスとは

パブリックとは

ACL、バケットポリシーそれぞれで、パブリックの条件があるようです。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/access-control-block-public-access.html#access-control-block-public-access-policy-status

バケットポリシーのパブリックアクセス

今回、関連するバケットポリシーのパブリックについて。

非パブリックと見なすには、バケットポリシーで、次のうち 1 つ以上の固定値 (ワイルドカードを含まない値またはAWS Identity and Access Managementポリシー変数) にのみアクセスを許可する

パブリックアクセスの例として下記が上げられます。

{
"Principal": "",
"Resource": "
",
"Action": "s3:PutObject",
"Effect": "Allow"
}

{
"Principal": "",
"Resource": "
",
"Action": "s3:PutObject",
"Effect": "Allow",
"Condition": { "StringLike": {"aws:SourceVpc": "vpc-*"}}
}

逆に、固定値を含む下記のようなポリシーは非パブリックとはなります。

{
"Principal": "",
"Resource": "
",
"Action": "s3:PutObject",
"Effect": "Allow",
"Condition": {"StringEquals": {"aws:SourceVpc": "vpc-91237329"}}
}

補足ですが。
パブリックアクセスをブロックした状態で、バケットポリシーに"パブリックアクセス"の権限を付与しようとすると、更新出来ません。

特定ネットワーク × 匿名ユーザー からのアクセス権限を調査

パブリックアクセスを全てblockした状態で、下記のようなバケットポリシーを作成。

Principal:匿名ユーザーを許可
Action:GetObject
Resource:指定のバケット
Condition:アクセスがvpce-1234abcd経由の場合


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3BucketPolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<bucket-name>/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": "vpce-1234abcd"
                }
            }
        }
    ]
}

1:プライベートネットワーク内部のEC2から(IAM認証の署名リクエスト無し) / ec2のroleはs3のfullAccess

curl -o example.pdf \
  -w "%{http_code}\n" \
  "https://photoruction-site-v2-prd-copy.s3.ap-northeast-1.amazonaws.com/COMPANIES/1/de2177ae-1abf-4853-b884-69772f8c2184.png"

バケットポリシー有り:成功
バケットポリシー無し:失敗

2:プライベートネットワーク内部のEC2から(IAM認証の署名リクエスト無し) / ec2のroleはs3のfullAccess

aws s3 cp s3:/<bucket-name>/test.png ./test.png

※ec2のroleが利用される
バケットポリシー有り:成功
バケットポリシー無し:成功

3:ローカルから(IAM認証の署名リクエスト有り)

aws s3 cp s3:/<bucket-name>/test.png ./test.png --profile test

バケットポリシー有り:成功
バケットポリシー無し:成功

結果

IAM認証の署名リクエスト無しの場合(curlで実行)、バケットポリシーで特定VPCエンドポイントからの匿名ユーザーによるリクエストを許可することを実現した。また、署名リクエスト有りの場合は、パブリックアクセスがブロックされていても許可することも確認できた。

Discussion