S3のVPC Endpoint経由でアクセス出来ているか否かの確認 – Publicサブネット編

AWS運用自動化サービス「Cloud Automator」

 

S3のVPC Endpointを作成した場合、アクセス元がPrivateサブネットにあれば弊社Godai Nakamuraのblog(*1)にある通りcurl等を利用してインターネットの任意のサイトへアクセスはできないが、S3へはVPC Endpointを作成した事でアクセス可能となった事を確認をするといったシンプルな話で済みます。

しかしPublicサブネットの場合は、デフォルトルート(0.0.0.0/0)がIGWに向いているためIGW経由でもVPC Endpoint経由でもS3へアクセス出来るため上の手法は通用しません。
従って実際にどの経路でアクセスがされたのかを見極めるには少し深い確認をする必要があります。

Publicサブネットのルートテーブルの例 (S3のVPC Endpointの経路設定済み) (*2)

このルートテーブルを見た瞬間、S3関連のIPアドレス帯が4つ指定されているのでロンゲストマッチでVPC Endpointに向く(IGWを経由しない)筈だし問題ないであろうと思えたりもしますが、設定後には実際に通信を発生させ動作確認(裏どり)はしておきたいものです。
確認方法の1つの例として、CloudTrailのログから確認するといった手法があるので今回メモ代わりに残します。

これからやる事を一行で纏めると
「当該PublicサブネットにいるEC2インスタンスからS3へ何らかのアクションを実行し、CloudTrailの対象ログにあるCloudTrailEventの内容から経路を判断する」です。

CloudTrailにイベントログとして残りさえすればどのようなオペレーションでも良い筈(*3)ですが、今回は一時的に適当なS3bucketを作成しそのログから経路を確認します。

簡易検証環境の構成はざっくり以下です。

  • S3のVPC Endpoint (今回作成したものに割り当てられたIDは、vpce-0a7e08b0a117fddb5)
  • Publicサブネット
    • デフォルトルートがIGWに向いている
    • ルートテーブルにVPC Endpoint宛てのレコード有無を検証のポイントで切り替える
  • EC2インスタンス
    • Publicサブネット内に作成したAmazon Linux2のもの
    • S3へのFullAccess権限のIAMロールをアタッチ
  • S3 bucket
    • via-internet-test (IGW経由で一時的に作成するS3bucket名)
    • via-vpce-test (VPCE経由で一時的に作成するS3bucket名)
  • ローカルマシン(macOS)
    • jqコマンドツール導入済み(*4) #目がつよい方なら別になくても良いです

EC2(Amazon Linux2)からS3bucketを作成して削除します。
(膨大な量のCloudTrailのログを追いやすくなるので同時にdateを叩いておくと後に幸せになれます)

そして、IGW経由となるようルーティングテーブルを設定し直し(VPC EndpointとPublicサブネットの関連づけを外し)、今度は上の内容をS3bucket名: via-igw-testとして再度実施します。(こちらは差分確認しなくて良いなら別にやらなくて良いです)

実施が完了したらCloudTrailからS3bucketを作成した対象ログを突き止めます。

“EventName”: “CreateBucket” ログが対象日時前後で見つかる筈です。
マネージドコンソールを利用して確認(*5)した方が楽だと思われます。
# CloudTrailのログ反映には少々時間がかかるのでまだ出力されていなければ珈琲でも飲みながら待ちましょう。そして参照リージョンを間違え珈琲も冷めてしまう事があるので気をつけましょう。<-自分への戒め

S3bucket作成した対象ログのCloudTrailEventの中身を確認すると以下のような感じになっており
“vpcEndpointId”: “vpce-0a7e08b0a117fddb5” といった今回作成したVPC EndpointのID情報が2箇所見て取れます。
CloudTrailEvent[]の中が JSONのなかにJSONといった感じで人の目に優しくないビジュアルな為、今回はjqコマンドツールを利用して整形しています。
また、不本意ですが色々と伏せた方がよさげな情報がドバドバ出たので一部結果を XXXX といった形で手動で置き換えています。

今回、VPC Endpoint経由とIGW経由のCloudTrailEventの差分は以下の通りでした。
“vpcEndpointId”の有無の違いだけでなく、
“sourceIPAddress”がVPC Endpoint経由の場合はEC2のプライベートIPアドレスであり、IGW経由の場合はAWSのグローバルIPアドレスとなっている事がわかります。

参考URI

*1…VPC Endpointを使ってS3にアクセスしてみる

VPC Endpointを使ってS3にアクセスしてみる

*2…ゲートウェイ VPC エンドポイント
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpce-gateway.html

*3…AWS CloudTrail を使用して Amazon S3 API コールのログを記録する
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/cloudtrail-logging.html

*4…jq
https://stedolan.github.io/jq/

*5…CloudTrailの基本

CloudTrailの基本

AWS運用自動化サービス「Cloud Automator」