Help us understand the problem. What is going on with this article?

S3でアクセス元を制限する

More than 1 year has passed since last update.

はじめに

まずS3のバケットに対して、指定したIPからのみアクセス許可するIAMポリシーを紹介します。VPCプライベートサブネットからのアクセスを許可する場合は、NATゲートウェイのグローバルIPを指定するのではなく、「VPCエンドポイント」を指定する方が良いため、こちらの設定を紹介します。

設定方法

IPアドレスによるアクセス制限

グローバルIPを指定したアクセス制限のIAMポリシーの例です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "XXXXXXXXXX",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<バケット名>",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "<IPアドレス>/32"
                }
            }
        },
        {
            "Sid": "XXXXXXXXXX",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::<バケット名>/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "<IPアドレス>/32"
                }
            }
        }
    ]
}

VPCエンドポイントによるアクセス制限

VPCプライベートサブネットからS3のバケットにアクセスする場合でも、NATゲートウェイを使用して、上記の設定でNATのグローバルIPを指定することも可能です。
しかしVPCプライベートサブネットからのアクセス制限をする場合、NATゲートウェイ経由とするのではなく、VPCエンドポイントを使用することをおすすめします。

メリットとして、インターネット経由でのアクセスからではなくなるためセキュアとなります。さらにNATを通過しないため、NATのネットワーク負荷が軽減させることができます。
またインターネット経由で接続するよりも料金も安く、デメリットは特にないです。
注意点としては、VPCエンドポイントを経由したアクセスにする場合、S3のバケットとVPCが同じリージョンである必要があるため気をつけてください。

  1. VPCエンドポイントを、プライベートサブネット上に作成します。
    作成はVPCのメニューから可能です。

  2. IAMポリシーの設定
    IPアドレスを指定するのでなく、VPCエンドポイントIDを指定して、アクセス制限をすることが可能です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "xxxxxxxxxx",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<バケット名>",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "<VPCエンドポイントID>"
                }
            }
        },
        {
            "Sid": "xxxxxxxxxx",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::<バケット名>/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "<VPCエンドポイントID>"
                }
            }
        }
    ]
}

参考

https://qiita.com/flat-8-kiki/items/5392d931d8e34a4e2ae4
https://dev.classmethod.jp/cloud/vpc-endpoint-for-s3/
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html

atizawa
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away