人とはちょっと違うことをやるのがすごく好き。

仕事(主にインフラ系のエンジニア)と家族(主にトイプードル)と趣味(主にバドミントン)について感じたことや、勉強したことなどを自分のメモ&誰かの参考になるかもしれないと思って書きます。

AWSのS3で特定の複数SourceIPからのみアクセスを許容するバケットポリシーの書き方

・ことの発端

CloudFrontを使った静的コンテンツの配信システムを設計しました。

よくある構成なので検証環境を作ることは悩むことなくできたのですが、ある問題に直面しました。

それは「https://~/Dir名/」でアクセスした際に、自動的にindex.htmlを取得してくれない問題です。

CloudFrontのRoot Objectに「index.html」を記載してもだめ。

S3のインデックスドキュメントに記載してもだめ。

どうやらRootディレクトリ(https://~/」でしか自動的に取得してくれない”仕様”だそうで。

それの解決策を探したところ、CloudFrontの「Origin Domein Name」を入力欄に自動で現れるものを選ばすに「http://バケット名.s3-website-ap-northeast-1.amazonaws.com」を手動で設定すれば解決するとのこと→確かに解決しました。

しかしながら、新たな問題としてこのままだとS3へのアクセスをCloudFrontだけに制限することができません。(パブリック公開になってしまう)

で、アクセス制限の問題に対しての対策として「CloudFrontが使用する可能性のあるIPアドレスだけを全て許容する」ことにしました。

CloudFront(というかAWSが)使用するIPアドレスは以下で確認できます。

https://ip-ranges.amazonaws.com/ip-ranges.json

 

これを元にバケットポリシーに対して43あるアドレスレンジをAllowするポリシーを書いて設定!・・・したところエラーにしかならない。

ほかにも同じようなことをやろうとしている人はいるはず、とGoogleで調べてたどり着いたこちらのサイトを参考にしました。

 S3 でIPアドレスアクセス制限をかける際のバケットポリシー | ハックノート

 

ほかのブログなどでは以下のようにSourceIPの部分をカンマで区切って複数行記載できるようなものがありますが、上記リンクの形式でないとエラーになります。(時期によって違うのかも)

 

【誤った記載例】

{
    "Version": "2012-10-17",
    "Id": "S3Policy#{unique_id}",
    "Statement": [
        {
    "Sid": "Stmt#{unique_id}",
    "Effect": "Deny",
    "Principal": {
    "AWS": "*"
        },
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::バケット名/*",
    "Condition": {
        "NotIpAddress": {
            "aws:SourceIP": [
                "xxx.xxx.xxx.xxx/xx",
                "xxx.xxx.xxx.xxx" ★ここがだめでした。
                    ]
                }
            }
        }
    ]
}

 

 

で、同じようにS3への制限をCloudFrontのIPだけに絞りたくてここにたどり着いた方のためにポリシーを公開します。

バケット名など、固有情報だけ一括置き換えなどで流用できると思いますのでどうぞ。

 

 

【S3へのアクセスをCloudFrontだけに制限するポリシー】

{
"Version": "2012-10-17",
"Id": "*****************,
"Statement": [
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "13.32.0.0/15"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.46.0.0/18"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.84.0.0/15"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.222.128.0/17"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.182.0.0/16"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.192.0.0/16"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.230.0.0/16"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.239.128.0/18"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.239.192.0/19"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.240.128.0/18"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "204.246.164.0/22"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "204.246.168.0/22"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "204.246.174.0/23"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "204.246.176.0/20"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "205.251.192.0/19"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "205.251.249.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "205.251.250.0/23"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "205.251.252.0/23"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "205.251.254.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "216.137.32.0/19"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "13.54.63.128/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "13.59.250.0/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "13.113.203.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "13.124.199.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "13.228.69.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "34.195.252.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "34.226.14.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "34.232.163.208/29"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "35.158.136.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "35.162.63.192/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "35.167.191.128/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.15.127.128/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.47.139.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.52.191.128/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.56.127.0/25"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.57.254.0/24"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.66.194.128/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.78.247.128/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.199.127.192/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.212.248.0/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "52.220.191.0/26"
}
}
},
{
"Sid": "*****************",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.233.255.128/26"
}
}
}
]
}