S3バケットへのアクセスをオンプレミスサーバーのプライベートIPアドレスで制限する方法2選
はじめに
本記事では、オンプレミス環境からプライベートネットワーク経由でS3バケットにアクセスする際に、オンプレミスサーバーのプライベートIPアドレスからのアクセスのみを許可する方法について解説します。
以下の図は、オンプレミス環境からAWS PrivateLinkを介してS3バケットにアクセスする際のアーキテクチャ概要を示しています。
この構成により、インターネットを経由せずにセキュアなアクセスが可能となります。
AWS PrivateLink for Amazon S3については、以下の記事をご参照ください。
結論
S3バケットへのアクセスを制限する方法として、以下の2つのアプローチがあります。
- VPCエンドポイントのセキュリティグループ
- S3バケットポリシー
以下、それぞれの方法について解説します。
VPCエンドポイントのセキュリティグループ
1つ目の方法として、S3用のVPCエンドポイントのセキュリティグループのインバウンドルールでオンプレミスのプライベートIPのみを許可する設定が可能です。
複数存在するS3バケットへのアクセスを特定のプライベートIPで統一して制限したい場合、VPCエンドポイントのセキュリティグループで制限するのがよいでしょう。
ただし、複数のオンプレミスサーバーと S3バケットが存在し、それぞれに異なるアクセス制限を設ける必要がある場合、セキュリティグループによる制御では細かな制限が困難です。
これは、VPCエンドポイントのセキュリティグループでは、アクセスを許可する全てのプライベートIPアドレスをインバウンドルールに設定する必要があるためです。
その場合、セキュリティグループではなく、後述するS3バケットポリシー側で各S3バケットに対して個別にプライベートIPによる制限を指定するとよいでしょう。
S3バケットポリシー
2つ目の方法として、S3バケットポリシーを使用し、aws:VpcSourceIp
条件キーによってオンプレミスのプライベートIPアドレスでアクセスを制限することができます。
aws:VpcSourceIp
は、IAMポリシーの条件キーの一つで、VPCエンドポイントを経由するリクエストの送信元IPアドレスとポリシーで指定したIPアドレスを比較するために使用します。
このキーは、リクエストがVPCエンドポイントを使用して行われた場合にのみ有効です。
このため、S3 の VPC エンドポイント経由の場合に、特定のオンプレミスの IP アドレスに基づいてアクセスを許可・拒否することは可能です。
AWSドキュメントにも記載されている通り、aws:VpcSourceIp
を利用する場合、aws:SourceVpc
(特定のVPC IDで評価)もしくはaws:SourceVpce
(特定のVPCエンドポイントで評価)を組み合わせることが推奨されています。
理由は、aws:VpcSourceIp
のみでは異なるVPC間でIPアドレスが重複する可能性があるため、グローバルで一意なVPC IDやVPCエンドポイントIDによる制限と組み合わせることで、より確実なアクセス制御を実現できます。
aws:VpcSourceIp 条件キーは、常に aws:SourceVpc または aws:SourceVpce 条件キーのいずれかと組み合わせて使用されるべきです。そうしないと、同じまたは重複する IP CIDR を使用する予期しない VPC からの API コールがポリシーによって許可される可能性があります。これは、2 つの無関係な VPC からの IP CIDR が同じまたは重複している可能性があるために発生する場合があります。代わりに、VPC ID または VPC エンドポイント ID は、グローバルに一意の識別子を持つため、ポリシーで使用されるべきです。これらの一意の識別子により、予期しない結果の発生が回避されます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-vpcsourceip
これらの要件を満たすため、aws:VpcSourceIp
でオンプレミスサーバーのプライベートIPを制限し、同時にaws:SourceVpce
で特定のVPCエンドポイントに制限する場合、S3バケットポリシーは以下のように記述します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::バケット名",
"arn:aws:s3:::バケット名/*"
],
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-xxxxx"
},
"NotIpAddress": {
"aws:VpcSourceIp": "X.X.X.X/32"
}
}
}
]
}
X.X.X.X/32
の形式で指定するIPアドレスには、オンプレミスサーバーのプライベートIPアドレスだけでなく、構成図に示されているEC2インスタンスのプライベートIPアドレスも指定することができます。
補足として、IAMポリシーの条件キーaws:SourceIp
は、パブリックIPアドレスのみを評価対象としているため、オンプレミス環境のプライベートIPアドレスによる制限には使用できません。
このキーを使用して、リクエスタの IP アドレスをポリシーで指定した IP アドレスと比較します。aws:SourceIp 条件キーは、パブリック IP アドレス範囲にのみ使用できます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip
プライベートIPアドレス以外のアクセス制御方法
ちなみに、プライベートIPアドレスによる制限以外のアクセス制御方法については、以下の3つの資料が参考になります。