🔰

【AWS】S3バケットへ「Test-Netconnection」を実行してみた。

2024/12/08に公開

執筆理由

S3のバケットポリシーで許可していないIPアドレスから「『Test-Netconnection』を実行すると失敗する」と間違えた理解をしていたこと。

対象読者

AWS初心者
※AWS(S3,ポリシー周り)、ネットワークの基礎知識があれば理解できる内容かと思います。

要約

S3のバケットポリシーのConditionブロックのIPAddressおよびNotIpAddressで拒否したIPアドレスからでも、TCPIPの接続は成功する。

調査内容

準備

まずは、バケット所有者であればS3へアクセスできるように設定する。
バケット所有者であればもっとセキュリティの高い設定でもアクセスできるが、ここではS3のバケットポリシーでのIP制御の動作がわかりやすいようシンプルな設定とした。

  1. 調査用のバケットとオブジェクトを作成した。
    バケット名:accesscontrol-research
    オブジェクト名:Success.txt
    オブジェクトURI:accesscontrol-research.s3.ap-northeast-1.amazonaws.com/Success.txt
    オブジェクト「Success.txt」に「認証に成功したよ」と書き込みをしています。
  2. パブリックアクセスブロックをオフにした。
    パブリックアクセスブロックとは、パブリックアクセスをブロックするための設定である。
    バケットポリシーで設定した内容を上書きで制限できる仕組みなので、わかりやすいようにオフにした。
    本記事ではパブリックアクセスブロックの詳細な説明は省略するが、パブリックアクセスはバケットポリシーやACLを新しく設定することを制限したり、ACLやバケットポリシーで許可しているアクセスをで上書きして拒否したりできる。
    なので、パブリックというのはACLやバケットポリシーで許可している認証のないアクセスに近いイメージとなる。
  3. ACLはデフォルト
    バケット所有者のみ、オブジェクトのリスト・書き込み、バケットACLの読み取り・書き込みを許可している。
  4. バケットポリシーは何も設定しない。
    何も設定しない場合は、暗示的に拒否される。
    ※バケットACL、オブジェクトACLで許可しており、バケットポリシーが未設定の場合、許可となる。
    参考)S3のアクセスコントロールが多すぎて訳が解らないので整理してみる
    https://dev.classmethod.jp/articles/s3-acl-wakewakame/
  5. IAMポリシーはS3のアクションは全許可に。
    S3のアクションはすべて許可している。

「Test-Netconnection」を実行してみた。

1. IP制御なし

まずはオブジェクトを読み取ってみます。
※これ以降のコマンドはすべてオブジェクト所有者(読み書きOK)で実行しています。

読み取れますね。
次に、「Test-Netconnection」を実行します。

「TcpTestSucceeded」がTrueなので成功していますね。
※Test-Netconnectionの仕様は「Test-Netconnectionとは?」の章に記載しているので、ここではTCPIPレベルで繋がっているね、へーくらいでよいと思います。

2. IP制御あり

バケットポリシーですべてのIPアドレスからの拒否をしてあげます。どりゃ。

無敵のバケットの完成です。
※rootユーザーでバケットポリシーを編集すればアクセスできるようになります。rootユーザーの利用が基本的に許されない業務等では絶対禁止です。バケットポリシーを設定する際は要注意ですね。

まずはオブジェクト読み取ってみます。

読み取れませんね。
では、本題の「Test-Netconnection」を実行します。

「TcpTestSucceeded」がTrueなので成功していますね。
ちなみにpingも通ります。

Test-Netconnectionとは?

そもそも「Test-Netconnection」とは何なのかということですが、MSの説明を引用します。

説明
Test -NetConnectionコマンドレットは、接続の診断情報を表示します。ping テスト、TCP テスト、ルート トレース、およびルート選択診断をサポートします。入力パラメータに応じて、出力には DNS ルックアップ結果、IP インターフェイスの一覧、IPsec ルール、ルート/ソース アドレス選択結果、および/または接続確立の確認が含まれます。

https://learn.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection?view=windowsserver2025-ps
今回はポート443に指定しているので、「TcpTestSucceeded」というTCP接続確立の結果が出力されるようです。
TCPはアプリケーションがサーバとデータのやり取りをするための接続の1つです。
実際に接続動作をしているのはプロトコルスタックだったりしますが、ここでは省略します。(ちゃんと理解するため、TCPの仕様については別の記事にしようと思います。)
その準備段階としてアプリケーション側とサーバ側で3wayハンドシェイクというものを実施します。
「Test-Netconnection」ではその3wayハンドシェイクが成功した場合にTrueを返す仕組みのようです。
「Test-Netconnection」の3wayハンドシェイクについては、実際に試している記事がありました!
https://zenn.dev/myuki/articles/d0ddc5a896c4cd
※ポートの広範囲のスキャンや大量のスキャンは攻撃とみなされる可能性があるので注意しましょう。

何故S3にTCPIPレベルでアクセスできちゃうの?

S3はvpcやオンプレからネットワーク経由で利用するサービスの1つである。

https://aws.amazon.com/jp/s3/features/
TCPIPでは公開されていて、アプリケーションレベルの認証と認可で利用するのがアクセス制御の基本のようです。

感想

クラウドサービス、ちゃんと理解して使わないと危なすぎる。
そもそもクラウドサービスってどのような仕組みで提供されているのか、基本的なところをちゃんと理解する必要があると思いました。
資格から目を背けていただけれど、基本的な部分は業務などでちょこちょこ拾い上げるより、一度ガッツリ学んで頭に入れておいたほうがよさそうです...
TCP、S3のアクセス周りについて勉強中なので、その辺の記事も近々上げようと思います。

Discussion