概要
AWSで何らかの構築を行う際、必ずセキュリティーグループの設定を行う必要があります。全ての通信を許可するセキュリティーグループの設定は簡単で早いですが、これはセキュアな構築とは言えません。またその設定により、AWSリソースへの不正アクセスの可能性が発生します。セキュアな通信を実現する為には、セキュリティーグループのインバウンドとアウトバウンドの設定、特にソース、送信先の設定を適切に行う必要があります。今回は、インバウンドとアウトバウンドの設定、そしてソース、送信先の設定によってどの様な通信経路になるのか、自身が理解した範囲でまとめます。
インバウンドの役割
- 外部からセキュリティグループに関連付けられたリソース(外から中)への通信を制御する
要約
インバウンドを設定したAWSリソースを基準(軸)として考える。外部から送信される通信に対して、どの通信であれば許可をするか判断する。
※ 外部から来る通信はソースから分かる
アウトバウンドの役割
- セキュリティグループに関連付けられたリソースから外部(中から外)への通信を制御する
要約
アウトバウンドを設定したAWSリソースを基準(軸)として考える。アウトバウンドの設定行ったAWSリソースから、他のAWSリソース or 外部に対してどの通信を許可をさせるか判断する。
※ 外部に送る通信をソースで設定する
ソースに具体的な設定を行った際の通信経路
- インバウンドに関しては、
HTTPS
とHTTP
通信のみを使用して解説を行う
- アウトバウンドに関して、一部の説明を除き、全てのトラフィックで解説を行う
インバウンドの通信経路
全ての通信を許可する
-
HTTPS
とHTTP
通信であれば、443
番ポートと80
番ポートを通じて全てのAWSリソースからの通信と外部からの通信(アクセス)が許可される
AWSリソース
に付与したセキュリティグループの設定内容
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
HTTPS |
TCP |
443 |
0.0.0.0/0 |
- |
HTTP |
TCP |
80 |
0.0.0.0/0 |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
イメージ図
補足
この設定は、公開Webサーバー等、インターネット上からのアクセスを許可する必要がある場合に適している。
特定の通信のみ許可する
- 指定したIPアドレスからのみ
HTTPS
とHTTP
通信であれば、443
番ポートと80
番ポートを通じて通信(アクセス)が許可される
AWSリソース タイプAに付与したセキュリティーグループの設定内容
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
HTTPS |
TCP |
443 |
1.1.1.1/32 |
- |
HTTP |
TCP |
80 |
1.1.1.1/32 |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
イメージ図
特定のAWSリソースの通信のみ許可する
AWSリソースタイプAは、特定の通信のみを許可するように設定されている。具体的には、HTTPS
(443
番ポート)とHTTP
(80
番ポート)の通信で、尚且つソースがAWSリソースタイプBの場合のみ通信を許可する。これにより、タイプAのリソースは、タイプBのリソースのみからアクセスが可能となります。
AWSリソース タイプAに付与したセキュリティーグループの設定内容
セキュリティーグループ名 : sg-type-a
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
HTTPS |
TCP |
443 |
sg-type-b / aws-resource-b |
- |
HTTP |
TCP |
80 |
sg-type-b / aws-resource-b |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
AWSリソース タイプBに付与したセキュリティーグループの設定内容
セキュリティーグループ名 : sg-type-b
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
全てのトラフィック |
すべて |
すべて |
0.0.0.0/0 |
AWSリソース タイプCに付与したセキュリティーグループの設定内容
セキュリティーグループ名 : sg-type-c
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
全てのトラフィック |
すべて |
すべて |
0.0.0.0/0 |
イメージ図
アウトバウンドの通信経路
トラフィック(送信)を全てに対して許可する
- 全てのAWSリソースまたは外部サービスに対して通信(アクセス)する事を許可する
アウトバウンドは、特殊な事情がない限り、基本的にこの設定で良い
AWSリソース
に付与したセキュリティグループの設定内容
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
全てのトラフィック |
すべて |
すべて |
0.0.0.0/0 |
イメージ図
トラフィック(送信)を指定した場所にのみ送信
- 外部サービスは、全ての通信を許可している為、アウトバウンドで送信先を制御していたとしても通信する事が可能
- AWSリソース タイプBに関して、
HTTPS
(443
番ポート)であれば、どんな通信でも通す設定になっている為、通信する事が可能
- AWSリソース タイプCに関して、
HTTPS
(443
番ポート)で、尚且つ2.2.2.2/32
の通信のみしか許可していない為、AWSリソース タイプAからは通信する事が不可能
AWSリソース タイプAに付与したセキュリティーグループの設定内容
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
全てのトラフィック |
すべて |
すべて |
1.1.1.1/32 |
AWSリソース タイプBに付与したセキュリティーグループの設定内容
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
HTTPS |
TCP |
443 |
0.0.0.0/32 |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
AWSリソース タイプCに付与したセキュリティーグループの設定内容
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
HTTPS |
TCP |
443 |
2.2.2.2/32 |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
イメージ図
特定のAWSリソースにのみトラフィック(送信)を許可する
-
AWSリソース タイプBは、
HTTPS
(443
番ポート)とHTTP
(80
番ポート)で尚且つAWSリソース タイプAの通信を許可している為、通信する事が可能
-
AWSリソース タイプCは、
HTTPS
(443
番ポート)とHTTP
(80
番ポート)の通信は許可しているが、AWSリソース タイプAへからの通信は許可されていない為、通信する事が不可能
AWSリソース タイプAに付与したセキュリティーグループの設定内容
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
設定なし |
- |
- |
- |
- |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
HTTPS |
TCP |
443 |
sg-type-a / aws-resource-a |
- |
HTTP |
TCP |
80 |
sg-type-a / aws-resource-a |
AWSリソース タイプBに付与したセキュリティーグループの設定内容
セキュリティーグループ名 : sg-type-b
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
HTTPS |
TCP |
443 |
sg-type-a / aws-resource-a |
- |
HTTP |
TCP |
80 |
sg-type-a / aws-resource-a |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
全てのトラフィック |
すべて |
すべて |
0.0.0.0/0 |
AWSリソース タイプCに付与したセキュリティーグループの設定内容
セキュリティーグループ名 : sg-type-c
インバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
HTTPS |
TCP |
443 |
sg-type-z / aws-resource-z |
- |
HTTP |
TCP |
80 |
sg-type-z / aws-resource-z |
アウトバウンドの設定 |
タイプ |
プロトコル |
ポート範囲 |
ソース |
- |
全てのトラフィック |
すべて |
すべて |
0.0.0.0/0 |
参考資料
まとめ
この記事を書くきっかけは、業務でECSを構築する際にセキュリティグループの設定で苦労した為です。最初は、自身の知識不足もあり、他に構築してある環境(EC2の構築時に使用したセキュリティーグループの設内容)のセキュリティーグループの内容をそのままコピーして構築を行なっておりました。当然、コピペ同様の作業では正常に動作しません。ただ、「他の構築がそうなっているからこのセキュリティーグループの構築は正しいんだ」と勝手に判断し、セキュリティーグループとは関係のない部分を修正し、無断に時間を浪費してしまいました。さらに、今回のミスを何度も繰り返し、先輩エンジニアに毎回聞いて対処すると言う悪い悪循環になっておりました。流石にこの状況はまずいと思い、今回の記事を書く事にしました。今回の記事は基本的な内容ですが、今回理解した事を応用してセキュリティーグループの構築も行えるようになればと思います。