概要
VPC エンドポイントを設定した AWS サービスへの IP アドレスによるアクセス許可は SourceIp ではなく、VpcSourceIp を利用する必要があります。
詳細
前提条件
S3 の特定のバケットに対して VPC エンドポイントを利用していると仮定します。
その S3 に対しては次のようにパブリックなアクセス許可を与えています。
{
"Version": "2012-10-17",
"Id": "Policy156583539788",
"Statement": [
{
"Sid": "Stmt156583536527",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "0.0.0.0/0"
}
}
}
]
}
この設定ではすべての IP アドレスからの GetObject を許可しています。
VpcSourceIp の指定
この状態で VPC 内のインスタンスなどからこのバケットにアクセスしようとしても Access Denied になります。
VPC エンドポイントへのアクセス許可(およびアクセス制限)に SourceIp は使えないからです。
VPC エンドポイントを介した Amazon S3 へのリクエストに、IAM ポリシーの aws:SourceIp 条件を使用することはできません。これはユーザーとロールの IAM ポリシー、およびバケットポリシーに適用されます。ステートメントに aws:SourceIp 条件が含まれる場合、値は指定した IP アドレスまたは IP アドレス範囲に一致しません。
ref: https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints-s3.html
その代わり、VpcSourceIp を利用します。
リクエスト実行元が Amazon VPC エンドポイントを使用するホストである場合、aws:SourceIp キーは使用できません。代わりに、aws:VpcSourceIpなどの VPC 固有のキーを使用する必要があります。
ref: https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-keys.html
{
"Version": "2012-10-17",
"Id": "Policy1565835397817",
"Statement": [
{
"Sid": "Stmt1565835396529",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket/*",
"Condition": {
"IpAddress": {
"aws:VpcSourceIp": "0.0.0.0/0"
}
}
}
]
}
これで VPN エンドポイントを経由した VPC 内からのアクセスを許可することができます。
SourceIp と VpcSourceIp の併用
VPC 内に加えて、外部からもアクセスを許可したい場合は次のように SourceIp と VpcSourceIp のアクセス許可を二つ列挙します。
{
"Version": "2012-10-17",
"Id": "Policy1565835397817",
"Statement": [
{
"Sid": "Stmt156583539651",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "0.0.0.0/0"
}
}
},
{
"Sid": "Stmt1565835396529",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket/*",
"Condition": {
"IpAddress": {
"aws:VpcSourceIp": "0.0.0.0/0"
}
}
}
]
}