AWS S3 のバケットポリシーでのアクセス許可

はじめに

AWS のサービスにアクセスする場合にはアクセスキーとシークレットを発行して Credentials の設定を行い、 AWS CLISDK を使ってアクセスするということが多いと思います。

S3 ではこの他にバケットポリシーを設定して特定の IPアドレスからのアクセスや VPCエンドポイントからのアクセスを許可するように設定することができます。

調査や解析用のログのデータがバケットに保存されていて 色々な環境から利用していたり、AWS を普段使わないプロジェクトのメンバーなども利用する場合に バケットポリシーでアクセス許可すると管理しやすいのではないかと思います。

バケットポリシーの使い方について色々調べて見て分かったことについてまとめておきます。

バケットポリシー覚え書き

バケットポリシーとユーザーポリシーの使用 - Amazon Simple Storage Service

ドキュメントはここにありました。

  • Effect

    Allow または Deny を指定します。 ポリシーを複数種類していする場合は Statement の要素を増やして指定できるようです。

  • Principal

    Principal は使用者のような項目です。 * 設定の場合はすべての使用者が許可設定されます。 特定のIAMユーザーやIAMロールを指定することもできます。

  • Action

    Action は対象のサービスで行えることを設定します。 詳しくはここに書かれていました。 ポリシーでのアクセス許可の指定 - Amazon Simple Storage Service

    S3 のリードオンリーのアクションを設定するには s3:Get*s3:List* を設定するようです。

  • Resource

    Resource で対象のバケットを指定します。

    arn:aws:s3:::examplebucket は examplebucketバケットへの権限でファイル一覧を取得したりバケット情報取得に必要です。

    arn:aws:s3:::examplebucket/* は examplebucket に存在する全てのファイルに対する権限の指定です。

  • Condition

    Condition には IPアドレスVPCなどその他の条件設定が入ります。

IPアドレスの許可

社内からのアクセスなどはIPアドレスでの許可が設定しやすいと思います。

バケットポリシーの例 - Amazon Simple Storage Service

こちらに例がありました。

下のは IPアドレスにリードオンリー権限を与える例です。 Action, Principal, Resource などは配列で複数指定することができます。 (x.x.x.x/x, y.y.y.y/y, z.z.z.z/z に特定のIPを指定します)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ]
      "Resource": [
        "arn:aws:s3:::examplebucket",
        "arn:aws:s3:::examplebucket/*"
      ]
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "x.x.x.x/x",
            "y.y.y.y/y"
          ]
        }
      }
    }
  ]
}

VPCの許可

VPCエンドポイントとアクセス元VPCの設定をすることができます。 VPCからのアクセスとして扱われるためにはVPCエンドポイント設定が必要になるようなので この二つの設定は似たような意味になると思います。

通常は EC2 などから S3 のリソースにアクセスするとインターネットを通してアクセスすることになりますが、 VPCエンドポイントを設定すると AWSネットワーク内で通信できるようになるようです。 おそらくプライベートIPで通信してアクセス元IPで判定される感じになるんじゃないかと思います。

https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints-s3.html

料金の計算の仕方などがいまいちよくわからないのですが

ゲートウェイ VPC Endpoints - Amazon Virtual Private Cloud

ここを見ると追加料金なしで利用できますとかかれていました。

S3 の料金のページを見ると S3 から他のサービスへの転送は無料と書かれていたので、もしかすると 同一リージョンEC2 からダウンロードは安くなるのかもしれません。

料金 - Amazon S3(クラウドストレージ)|AWS

ポリシー書き方の例はこちらにありました。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html

IAMユーザーやIAMロールの許可

バケットポリシーの例 - Amazon Simple Storage Service

Principal にIAMユーザー、IAMロールを指定して許可することができます。 IAM側に設定を追加するよりもバケットポリシーで設定する方が管理しやすいという場合もあると思います。

AWS CLIから使う

AWS CLI から使う場合にバケットポリシーでIP許可されていても認証しようとしてエラーになってしまう場合があります。

これは Credentials を設定していない場合はインスタンスメタデータを取得してIAMロールの判定を行おうとするからのようです。

この場合は --no-sign-request というオプションを使うことで回避できるようです。

s3 — AWS CLI 1.15.53 Command Reference

aws s3 cp requires credentials even for public files · Issue #904 · aws/aws-cli · GitHub

AWS SDKから使う

AWS SDK から使う場合も認証をしない方法が用意されているようです。

https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.AwsClient.html#___construct

aws-sdk-php の場合は credentials を false にすることで認証しないということになるようでした。