Amazon S3へのアクセスをVPCエンドポイント経由のみに制限する

はじめに

SCSKの根岸です。

S3バケットに重要なデータを格納する場合、セキュアな通信方法としてVPCエンドポイント経由の通信が利用されます。しかし、そのままの設定ではS3バケットへの通信をVPCエンドポイント経由の通信のみに厳密に制限することはできません。(たとえば、権限を持っているユーザであればVPCエンドポイントを経由しなくてもインターネット経由でバケットの閲覧・操作が可能です)

S3バケットはデフォルトではパブリックアクセスは無効になっており、S3バケットポリシーを設定しないからと言ってS3へ保存したデータが外部に晒されることはまずありませんが、念には念をいれて今回はよりセキュアな設定を目指してVPCエンドポイント経由の通信のみ可能なS3バケットポリシーを試してみます。

バケットポリシーの設定

今回の設定は下記の記事を参考にしています。

Amazon S3 バケットアクセスを特定の VPC または IP アドレスに制限する

こちらのバケットポリシーをS3に設定してみます。

① 特定のVPCエンドポイントからのみアクセスを許可するS3バケットポリシー

{
  "Id": "VPCe",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VPCe",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::<<S3-BUCKET-NAME>>",
        "arn:aws:s3:::<<S3-BUCKET-NAME>>/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": [
            "<<VPC-ENDPOINT-ID>>"
          ]
        }
      },
      "Principal": "*"
    }
  ]
}

バケットポリシーを設定する際は内容に注意しながら実施してください。

ポリシーの内容によっては自分自身もS3バケットにアクセスできなくなってしまいます(1敗)。本番環境などでいきなりバケットポリシーを設定することは推奨されません。誤ったポリシーを設定してアクセスできなくなってしまった場合は、rootアカウントからバケットポリシーを更新または削除しなくてはなりません。

また、S3バケットとVPCは同じリージョンに存在する必要があります。

設定が完了するとすぐにコンソールからはエラー画面が表示され、バケットの操作をすることができなくなります。コンソールからS3へのアクセスはVPCエンドポイントを経由していないためです。

VPC内からの接続を確認する

VPC内のEC2インスタンスから接続を試してみましょう。

正常にバケットにアクセスして中身を確認することができました!

これで正真正銘VPCからのみアクセスできるS3バケットになりました。

おまけ:コンソールもちょっと使いたい

「① 特定のVPCエンドポイントからのみアクセスを許可するS3バケットポリシー」を設定をした場合、バケットはコンソールからの操作は一切受け付けなくなります。(コンソールからはバケットの中身を見ることすらできません。)

せめてバケットの中身くらいは確認できてほしい…という場合には下記のポリシーを設定してみてください。

② 特定のVPCエンドポイントからのみアクセスを許可するS3バケットポリシー(コンソールからS3の中身だけは確認できるver.)

{
  "Id": "VPCe",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VPCe",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::<<S3-BUCKET-NAME>>",
        "arn:aws:s3:::<<S3-BUCKET-NAME>>/*"
      ],
      "NotAction": [
        "s3:ListBucket",
        "s3:ListAllMyBuckets"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": [
            "<<MY-ENDPOINT-ID>>"
          ]
        }
      },
      "Principal": "*"
    }
  ]
}

“Action”要素を削除し”NotAction”要素を追加しています。このように設定するとコンソールからバケットの中身を確認することだけできるようになります。(もちろんコンソールからのアップロードやコピーなどのアクションは権限がないため失敗します)

このあたりの設定はセキュリティの要求レベルによって利便性を損なわない範囲で調整するといいのではないかと思いました。

おまけ2

2021/07/24 更新

S3に関連する記事として、S3の暗号化キーの管理についてまとめた記事を追加しました!

SSE-S3とSSE-KMSの違いやそれぞれのメリットなどについてまとめていますので、もしよろしければこちらも見ていただけますと嬉しいです!

S3バケットの暗号化 (SSE-S3とSSE-KMSとSSE-Cの比較) – TechHarmony