VPCエンドポイントからS3へ接続してみた


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

はじめに

S3バケット内のオブジェクトを操作する場合に、セキュリティの観点からインターネット経由ではなくS3バケットポリシーで指定したVPCエンドポイントからのみアクセスを許可し、操作できるようにする方法について試してみました。

VPCエンドポイントとは

VPC エンドポイントを使用すると、Virtual Private Cloud (VPC) とサポートされているサービスの間の接続が有効になります。
VPC エンドポイント

VPCエンドポイントには、インターフェイスエンドポイントを使用する方法とゲートウェイエンドポイントを使用する方法がありますが、今回はインターフェイスエンドポイントを使用します。

S3バケットポリシーとは

Amazon S3 バケットポリシーを使用すると、バケット内のオブジェクトへのアクセスを保護して、適切な権限を持つユーザーだけがアクセスできるようにすることができます。
バケットポリシーの例

検証内容

S3バケットポリシーにて、アクセスを許可するVPCエンドポイントを指定します。
その結果、マネジメントコンソールからS3バケット内のオブジェクトへアクセスすることができなくなり、CLIからVPCエンドポイント経由でアクセスできることを確認します。

構成

パブリックサブネットのEC2インスタンスは踏み台サーバとなり、プライベートサブネットのEC2インスタンスにSSH接続するために使用します。
S3 VPCエンドポイント

準備

①AmazonS3FullAccessポリシーを追加したIAMロールを作成します。

S3 VPCエンドポイント

②プライベートサブネットを作成します。

③ルートテーブルを作成し、作成したプライベートサブネットを関連付けます。

S3 VPCエンドポイント

④パブリックサブネット用とプライベートサブネット用に1台ずつEC2インスタンスを作成します。
プライベートサブネット用EC2インスタンスは、プライベートサブネットを指定して作成します。

S3 VPCエンドポイント

⑤プライベートサブネット用のEC2インスタンスに①で作成したIAMロールを適用します。

S3 VPCエンドポイント

⑥セキュリティグループを設定します。

インバウンドルール タイプ ソース 説明
パブリックサブネット用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バケットを作成し、テスト用にテキストファイルをアップロードします。

S3 VPCエンドポイント

⑧VPCからエンドポイントを選択し、エンドポイントを作成します。

S3 VPCエンドポイント

s3で検索し、Interfaceを選択します。

S3 VPCエンドポイント

サブネットはプライベートサブネットを選択します。
セキュリティグループは、VPCエンドポイント用に作成したセキュリティグループを選択します。
S3 VPCエンドポイント

S3 VPCエンドポイント

S3 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バケットのアクセス許可タブを選択し、バケットポリシーの編集からバケットポリシーを記載します。
S3 VPCエンドポイント

指定した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 :許可または拒否する対象

IAM JSON ポリシー要素のリファレンス

<注意>
バケットポリシーが反映されると、マネジメントコンソールからS3バケット内のオブジェクトの操作ができなくなります。

VPCエンドポイントが削除されるなど、CLIからS3バケットへアクセスできなくなってしまうと、バケットポリシーやオブジェクトを削除するためにルートユーザにてログインする必要があるため注意が必要です。

事前にVPCエンドポイントからS3バケットにアクセスできること、テスト用のバケットポリシーを設定し削除できることを確認することを推奨します。

②バケットポリシーが反映され、アクセスできないことを確認します。
S3 VPCエンドポイント

検証②(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バケット名

get-bucket-policy

③マネジメントコンソールからS3バケット内のオブジェクトにアクセスできることを確認します。
S3 VPCエンドポイント

まとめ

検証行う際に、プライベートサブネットのEC2インスタンスからSSH接続を実行する方法やVPCエンドポイントでのバケットポリシーの削除方法など知らないことをたくさん調べる中で解決できたので、とても勉強になりました。

Last modified: 2023-03-27

Author