はじめに

みなさん、セキュリティグループを日頃からよく使っていると思います。
私自身もAWSに触れ始めてから幾度と作成/変更/削除を行ってきました。
ところが恥ずかしながらこれってどうなるの…?というケースに出会ったので共有したく思います。

セキュリティグループとは

セキュリティグループは、関連付けられたリソースに到達するトラフィックおよびリソースから離れるトラフィックを制御します。例えば、セキュリティグループを EC2 インスタンスに関連付けると、インスタンスのインバウンドトラフィックとアウトバウンドトラフィックが制御されます。
また各設定はセキュリティグループルールとして管理され、ルールごとに、送信元、ポート範囲、プロトコルを指定できます。

さて問題です!

以下の構成図のようなケースにおいてpingは通ると思いますか?

※ポート範囲、プロトコルは全ての範囲としています
※セキュリティグループBのsshは自身の端末からのアクセス用として許可しています

正解は

さっそくですが正解は「pingは通る」となります。

[ec2-user@ip-10-0-0-97 ~]$ ping 10.0.0.72
PING 10.0.0.72 (10.0.0.72) 56(84) bytes of data.
64 bytes from 10.0.0.72: icmp_seq=1 ttl=127 time=0.906 ms
64 bytes from 10.0.0.72: icmp_seq=2 ttl=127 time=0.607 ms
64 bytes from 10.0.0.72: icmp_seq=3 ttl=127 time=2.15 ms
64 bytes from 10.0.0.72: icmp_seq=4 ttl=127 time=0.697 ms
64 bytes from 10.0.0.72: icmp_seq=5 ttl=127 time=0.857 ms
^C
--- 10.0.0.72 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4139ms
rtt min/avg/max/mdev = 0.607/1.043/2.152/0.564 ms

最初この状況になった時に、え…?!という感想になりました。
管理上の観点から通ってほしくもなかったかもです。。

解説

リソースに複数のセキュリティグループがアタッチされている場合は、全てのルールをまとめた一つのルールセットとして扱うからです。

つまり、セキュリティグループAとセキュリティグループBが合算されて左側EC2セキュリティグループとして扱われます。

先ほどの図にあてはめてみるとこうなります。

こう見て確認すると、あなんか通りそう!と思いますよね。
セキュリティグループIDは継続して保持していることも見えてきます。

AWSドキュメントから答えを知る

以下のようにしっかりを記載がありました。

トラフィックがインスタンスに到達することを許可するかどうかを Amazon EC2 が判断するとき、インスタンスに関連付けられているすべてのセキュリティグループのすべてのルールを評価します。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-security-groups.html

この結果から考えられること

  • セキュリティグループを複数リソースで共有する場合には管理(把握)が困難になる
    → なのでセキュリティグループはできるだけリソース専用で取り扱うことがよいです
  • セキュリティグループルール数のサービスクォーター内なのであれば、単一セキュリティグループで管理する方がわかりやすいです
    ※デフォルト60個となります(引き上げ可能)
    https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-security-groups

まとめ

ポリシーやアクセス元といった区切りでセキュリティグループを運用していたり、頻繁につけ外しをしているケースにおいては複数セキュリティグループをアタッチすることもあるかと思います。
その場合にはこのような挙動となることをよくよく理解して日々の安全な運用に努めたいと感じました!

最後までお読みいただきありがとうございました。
誰かの参考になれば幸いです。