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