この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
S3バケット内のオブジェクトを操作する場合に、セキュリティの観点からインターネット経由ではなくS3バケットポリシーで指定したVPCエンドポイントからのみアクセスを許可し、操作できるようにする方法について試してみました。
VPCエンドポイントとは
VPC エンドポイントを使用すると、Virtual Private Cloud (VPC) とサポートされているサービスの間の接続が有効になります。
VPC エンドポイント
VPCエンドポイントには、インターフェイスエンドポイントを使用する方法とゲートウェイエンドポイントを使用する方法がありますが、今回はインターフェイスエンドポイントを使用します。
S3バケットポリシーとは
Amazon S3 バケットポリシーを使用すると、バケット内のオブジェクトへのアクセスを保護して、適切な権限を持つユーザーだけがアクセスできるようにすることができます。
バケットポリシーの例
検証内容
S3バケットポリシーにて、アクセスを許可するVPCエンドポイントを指定します。
その結果、マネジメントコンソールからS3バケット内のオブジェクトへアクセスすることができなくなり、CLIからVPCエンドポイント経由でアクセスできることを確認します。
構成
パブリックサブネットのEC2インスタンスは踏み台サーバとなり、プライベートサブネットのEC2インスタンスにSSH接続するために使用します。
準備
①AmazonS3FullAccessポリシーを追加したIAMロールを作成します。
②プライベートサブネットを作成します。
③ルートテーブルを作成し、作成したプライベートサブネットを関連付けます。
④パブリックサブネット用とプライベートサブネット用に1台ずつEC2インスタンスを作成します。
プライベートサブネット用EC2インスタンスは、プライベートサブネットを指定して作成します。
⑤プライベートサブネット用のEC2インスタンスに①で作成したIAMロールを適用します。
⑥セキュリティグループを設定します。
インバウンドルール | タイプ | ソース | 説明 |
---|---|---|---|
パブリックサブネット用EC2のセキュリティグループ | SSH | マイIP | SSH接続用 |
プライベートサブネット用EC2のセキュリティグループ | SSH | パブリックサブネット用EC2のプライベートIP | SSH接続用 |
VPCエンドポイント用セキュリティグループ | HTTPS | 0.0.0.0/0 | VPCエンドポイント接続用 |
アウトバウンドルール | タイプ | ソース | 説明 |
---|---|---|---|
パブリックサブネット用EC2のセキュリティグループ | すべてのトラフィック | 0.0.0.0/0 | デフォルト |
プライベートサブネット用EC2のセキュリティグループ | HTTPS | 0.0.0.0/0 | VPCエンドポイント接続用 |
VPCエンドポイント用セキュリティグループ | すべてのトラフィック | 0.0.0.0/0 | デフォルト |
⑦S3バケットを作成し、テスト用にテキストファイルをアップロードします。
⑧VPCからエンドポイントを選択し、エンドポイントを作成します。
s3で検索し、Interfaceを選択します。
サブネットはプライベートサブネットを選択します。
セキュリティグループは、VPCエンドポイント用に作成したセキュリティグループを選択します。
検証①(VPCエンドポイント経由でS3バケットにアクセス)
①パブリックサブネット用のEC2インスタンスにTeraTermで接続し、EC2インスタンスのキーペアファイルを書き込みします。
[ec2-user@ip-172-31-23-113 ~]$ vi キーペアファイル名
②キーペアのアクセス権限を所有者のみ読み取り許可に変更します。
[ec2-user@ip-172-31-23-113 ~]$ chmod 400 キーペアファイル名
③プライベートサブネット用EC2インスタンスにSSHで接続します。
[ec2-user@ip-172-31-23-113 ~]$ ssh ec2-user@プライベートサブネット用EC2インスタンスのプライベートIP -i キーペアファイル名
④VPCエンドポイントを経由し、S3バケット内のオブジェクト一覧を表示します。
[ec2-user@ip-172-31-60-134 ~]$aws s3 --region リージョン名 --endpoint-url https://bucket.VPCエンドポイントDNS名 ls s3://S3バケット名
S3 インターフェイスエンドポイントからのバケットおよび S3 アクセスポイントへのアクセス
S3バケットにアクセスできたことを確認します。
2023-03-22 07:09:27 0 test-endpoint.txt
バケットポリシーの設定
①S3バケットのアクセス許可タブを選択し、バケットポリシーの編集からバケットポリシーを記載します。
指定したVPCエンドポイントからのみアクセスを許可するバケットポリシーを記載します。
{
"Id": "VPCe",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VPCe",
"Action": "s3:*",
"Effect": "Deny",
"Resource": [
"arn:aws:s3:::S3バケット名/*"
],
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": [
"エンドポイント ID"
]
}
},
"Principal": "*"
}
]
}
バケットポリシーの意味
- Id:AWSサービスのID
- Version : ポリシー言語のバージョン
- Statement : ポリシーの主要要素
- Sid:ステートメントのID
- Action:許可または拒否するアクション
- Effect:ステートメントの結果を許可または拒否の指定
- Resource:ステートメントの対象になるリソース
- Condition:ポリシーを実行するタイミングの条件
- StringNotEquals:符号反転の一致
- aws:SourceVpce:エンドポイントを指定する条件
- Principal :許可または拒否する対象
<注意>
バケットポリシーが反映されると、マネジメントコンソールからS3バケット内のオブジェクトの操作ができなくなります。
VPCエンドポイントが削除されるなど、CLIからS3バケットへアクセスできなくなってしまうと、バケットポリシーやオブジェクトを削除するためにルートユーザにてログインする必要があるため注意が必要です。
事前にVPCエンドポイントからS3バケットにアクセスできること、テスト用のバケットポリシーを設定し削除できることを確認することを推奨します。
②バケットポリシーが反映され、アクセスできないことを確認します。
検証②(VPCエンドポイント経由でS3バケット内のテキストファイルを表示、バケットポリシーの削除)
①S3バケット内のオブジェクト一覧を表示するコマンドを実行します。
[ec2-user@ip-172-31-60-134 ~]$aws s3 --region リージョン名 --endpoint-url https://bucket.VPCエンドポイントDNS名 ls s3://S3バケット名
S3バケットにアップロードしたテキストファイルを確認します。
2023-03-22 07:09:27 0 test-endpoint.txt
②バケットポリシーを削除します。
aws s3api delete-bucket-policy --endpoint https://bucket.VPCエンドポイントDNS名 --bucket S3バケット名
③マネジメントコンソールからS3バケット内のオブジェクトにアクセスできることを確認します。
まとめ
検証行う際に、プライベートサブネットのEC2インスタンスからSSH接続を実行する方法やVPCエンドポイントでのバケットポリシーの削除方法など知らないことをたくさん調べる中で解決できたので、とても勉強になりました。