S3の特定ディレクトリにIP制限をかけたいという場面があったのでその時のメモです。
Actionは全てを対象にしています。
通常のIP制限
特定のバケット、パスに対して複数のIPからの操作を許可をするやり方です。
{
"Statement": [
{
"Sid": "分かるような名前に",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucketname/dirname/*",
"Condition" : {
"IpAddress" : {
"aws:SourceIp": [
"AAA.AAA.AAA.AAA/32",
"BBB.BBB.BBB.BBB/32"
]
}
}
}
]
}
複数ディレクトリ
特定のバケット、パスに対して複数のIPからの操作を許可をするやり方です。
Statementの部分を複数にします。
{
"Statement": [
{
"Sid": "limit for dirname",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucketname/dirname/*",
"Condition" : {
"IpAddress" : {
"aws:SourceIp": [
"AAA.AAA.AAA.AAA/32",
"BBB.BBB.BBB.BBB/32"
]
}
}
},
{
"Sid": "limit for dirname2",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucketname/dirname2/*",
"Condition" : {
"IpAddress" : {
"aws:SourceIp": [
"CCC.CCC.CCC.CCC/32",
"DDD.DDD.DDD.DDD/32"
]
}
}
}
]
}
ファイル自体がACL_PUBLICになってしまっている場合
ただし、ファイル自体にACL_PUBLICとか設定してあると、IP制限でかけても
参照できてしまうようです。
ファイルの属性を変えるべきだとは思いますが、数が多いとそれも面倒だったりするのでいったん全部拒否して、特定のものだけ許可するやり方です。
{
"Statement": [
{
"Sid": "limit for deny",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucketname/dirname/*",
"Condition" : {
"IpAddress" : {
"aws:SourceIp": [
"0.0.0.0/0"
]
},
"NotIpAddress" : {
"aws:SourceIp": [
"AAA.AAA.AAA.AAA/32",
"BBB.BBB.BBB.BBB/32"
]
}
}
}
]
}参考
Example Cases for Amazon S3 Bucket Policies - Amazon Simple Storage Service