こんにちは、ふくちと申します。
今回は友人からふと言われた、
「セキュリティグループIDを指定してEC2同士の接続制御をする時に、ポート番号の指定って必要なんやっけ?」
という疑問について検証してみました!
そもそもEC2の接続制御って何を使うべき?
これはセキュリティグループを用いるのがベストプラクティスです。ネットワークACLでも接続制御はできますが、ベストプラクティスはセキュリティグループの利用です。
下記の公式ドキュメントに明記されています。
ベストプラクティスに従い、セキュリティグループを用いて接続制御を行っていきます。
EC2同士で接続する際、セキュリティグループ(以下SG)をどのように設定するべき?
大きく分けて3つの手段があります。
1.通信相手となるEC2インスタンスのIPアドレスを指定する
1つ目は通信相手となるEC2インスタンスのIPアドレスを指定する方法です。
わかりやすくオーソドックスである反面、通信相手のIPアドレスが変化するケースや、膨大な通信相手がいるケースに対応するのが難しいです。
2.通信先VPCやサブネットのIPアドレス・CIDRブロックを指定する
2つ目はVPCやサブネットのIPアドレスもしくはCIDRブロックを指定する方法です。
VPCピアリングをしている時などに使えそうです。
また、1つ以上のCIDRブロックのセットから成る、プレフィックスリストを用いることもできます。
3.通信相手となるEC2インスタンスのセキュリティグループIDを指定する
そして3つ目は通信相手のSGを指定する方法です。
SGの設定において、別のSGを指定できる、という形になります。
複数のEC2インスタンスに同一SGをアタッチしていた場合、そのSGを指定するだけで該当するすべてのEC2と通信することができるようになります。1.と比べると、設定の手間が大きく減らせます。
また、同じSGがアタッチされたEC2を後から増やしたとしても、そのEC2にはすぐさま通信可能になります。すなわち、運用の手間が大きく省けるということです。
以上より、通信相手のSGを指定することで、設定・運用の手間を大きく無くすことができます。
今回はこの3.を用いて接続制御した際のお話です。
検証してみた!
疑問に基づき、大きく2パターンで検証します。
①ポートを全開放した状態での接続制御パターン
②ポートを指定した状態での接続制御パターン
※どちらも同一VPC内での通信を想定しています。VPCピアリングでの検証は下記の記事をご参照ください。
1.VPCを作成する
今回はプライベートサブネットのEC2インスタンスから、プライベートサブネットのEC2インスタンスへ接続を試みます。
2.セキュリティグループ(以下SG)を作成する
ここでは、接続元SGのアウトバウンドルールを0.0.0.0/0にしておきます。
一方で接続先SGのインバウンドルールを無しにしておきます(アウトバウンドルールはデフォルトのまま)。
3.EC2を2つ作成し、それぞれに先ほど作成したSGをアタッチする
※接続先EC2に、Apacheをインストールしておきます。下記のようにコマンドを実行します。
パッケージを最新に更新する
sudo yum update -y
Apacheのインストール
sudo yum install httpd -y
Apacheの起動
sudo systemctl start httpd.service
Apacheが起動されていることを確認
sudo systemctl status httpd.service
4.接続元EC2から接続先EC2にアクセスができないことを確認する。
接続元EC2から、接続先EC2のプライベートIPアドレス宛にcurlコマンドを投げます。
しかし、現在は接続先EC2のインバウンドルールが存在しないため、一切のアクセスが許可されていません。したがって、接続元EC2から発信したcurlコマンドは、接続先EC2に届かず、返ってくることもありません。
また、pingコマンドを投げても届きません。
現在は一切接続できない状況だとわかります。
5.接続先SGのインバウンドルールに、接続元SGを指定する
接続元SGからのhttp通信を許可し、ソースに接続元SGを指定します。この時、httpのポート80を指定します。
また、pingはICMPプロトコルを使用するので、接続元SGからのICMP通信も許可しておきます。この時、ポート範囲を「すべて」としています。
6.接続元EC2から接続先EC2にアクセスできることを確認する。
再び接続元EC2から、接続先EC2のプライベートIPアドレス宛にcurlコマンドとpingコマンドを投げます。
すると今度は応答が確認され、無事EC2インスタンス同士の接続が確認できました!
また、この検証によって、ポート番号の指定があってもなくても問題ないことも確認できました!
結論
通信相手のセキュリティグループIDを指定してEC2同士の通信制御をする場合、ポート番号の指定はあってもなくても大丈夫!
どなたかのお役に立てば幸いです。