セキュリティーグループのインバウンドで設定するソースとアウトバウンドで設定する送信先の役割について理解した事をまとめた

# 概要
AWSで何らかの構築を行う際、必ずセキュリティーグループの設定を行う必要があります。全ての通信を許可するセキュリティーグループの設定は簡単で早いですが、これはセキュアな構築とは言えません。またその設定により、AWSリソースへの不正アクセスの可能性が発生します。セキュアな通信を実現する為には、セキュリティーグループの**インバウンド**と**アウトバウンド**の設定、特に**ソース、送信先**の設定を適切に行う必要があります。今回は、**インバウンド**と**アウトバウンド**の設定、そして**ソース、送信先**の設定によってどの様な通信経路になるのか、自身が理解した範囲でまとめます。

# インバウンドの役割

- 外部からセキュリティグループに関連付けられたリソース(<font color="red">**外から中**</font>)への通信を制御する
:::note info
**要約**
インバウンドを設定したAWSリソースを基準(軸)として考える。外部から送信される通信に対して、どの通信であれば許可をするか判断する。
<font color="red">**※ 外部から来る通信はソースから分かる**</font>
:::

![インバウンドのイメージ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/00c757e7-d330-fea9-45ef-7451bb2778ec.png)


# アウトバウンドの役割
- セキュリティグループに関連付けられたリソースから外部（<font color="red">**中から外**</font>)への通信を制御する
:::note info
**要約**
アウトバウンドを設定したAWSリソースを基準(軸)として考える。アウトバウンドの設定行ったAWSリソースから、他のAWSリソース or 外部に対してどの通信を許可をさせるか判断する。
<font color="red">**※ 外部に送る通信をソースで設定する**</font>
:::

![アウトバウンドのイメージ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/04de77ce-6017-fbac-b655-fb07123c4379.png)

# ソースに具体的な設定を行った際の通信経路
:::note warn
- インバウンドに関しては、`HTTPS`と`HTTP`通信のみを使用して解説を行う
- アウトバウンドに関して、一部の説明を除き、全てのトラフィックで解説を行う
:::

## インバウンドの通信経路
### 全ての通信を許可する
- `HTTPS`と`HTTP`通信であれば、`443`番ポートと`80`番ポートを通じて全てのAWSリソースからの通信と外部からの通信(アクセス)が許可される

***

**`AWSリソース`に付与したセキュリティグループの設定内容**
|インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
|:---: | :---: | :---: | :---: | :---: | 
|-| HTTPS  |  TCP  |  443  | 0.0.0.0/0 |
|-| HTTP  |  TCP  |   80  | 0.0.0.0/0 |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
|:---: | :---: | :---: | :---: | :---: | 
|設定なし| -  | - | -  | - |

***

**イメージ図**
![スクリーンショット 2024-04-13 18.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/c2897d0f-b0e7-de98-7f2f-5c90fd7fa948.png)



**補足**
この設定は、公開Webサーバー等、インターネット上からのアクセスを許可する必要がある場合に適している。

### 特定の通信のみ許可する
- 指定したIPアドレスからのみ`HTTPS`と`HTTP`通信であれば、`443`番ポートと`80`番ポートを通じて通信(アクセス)が許可される

***

<font color="red">**AWSリソース タイプA**</font>**に付与したセキュリティーグループの設定内容**
|インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
|:---: | :---: | :---: | :---: | :---: | 
|-| HTTPS  |  TCP  |  443  | 1.1.1.1/32 |
|-| HTTP  |  TCP  |   80  | 1.1.1.1/32 |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
|:---: | :---: | :---: | :---: | :---: | 
|設定なし| -  | - | -  | - |

***

**イメージ図**
![スクリーンショット 2024-04-13 19.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/618ff83e-597b-4e4e-788e-a383e94684df.png)



### 特定のAWSリソースの通信のみ許可する
 <font color="red">**AWSリソースタイプA**</font>は、特定の通信のみを許可するように設定されている。具体的には、`HTTPS`（`443`番ポート）と`HTTP`（`80`番ポート）の通信で、尚且つソースが<font color="blue">**AWSリソースタイプB**</font>の場合のみ通信を許可する。これにより、<font color="red">**タイプA**</font>のリソースは、<font color="blue">**タイプB**</font>のリソースのみからアクセスが可能となります。

***

<font color="red">**AWSリソース タイプA**</font>**に付与したセキュリティーグループの設定内容**
*セキュリティーグループ名 : **sg-type-a***
| インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
| :---: | :---: | :---: | :---: | :---: | 
| - | HTTPS  |  TCP  |  443  | sg-type-b / aws-resource-b |
| - | HTTP  |  TCP  |   80  | sg-type-b / aws-resource-b |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
|:---: | :---: | :---: | :---: | :---: | 
|設定なし| -  | - | -  | - |

***

<font color="blue">**AWSリソース タイプB**</font>**に付与したセキュリティーグループの設定内容**
*セキュリティーグループ名 : **sg-type-b***
インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
| :---: | :---: | :---: | :---: | :---: | 
| 設定なし | -  | - | -  | - |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
| :---: | :---: | :---: | :---: | :---: | 
| - | 全てのトラフィック| すべて | すべて| 0.0.0.0/0 |

***

<font color="green">**AWSリソース タイプC**</font>**に付与したセキュリティーグループの設定内容**
*セキュリティーグループ名 : **sg-type-c***
インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
| :---: | :---: | :---: | :---: | :---: | 
| 設定なし | -  | - | -  | - |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
| :---: | :---: | :---: | :---: | :---: | 
| - | 全てのトラフィック| すべて | すべて| 0.0.0.0/0 |

***

**イメージ図**
![スクリーンショット 2024-04-12 23.58.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/627f4a98-8c8f-ce40-1c76-5b150a3b1d79.png)


## アウトバウンドの通信経路
### トラフィック(送信)を全てに対して許可する
- 　全てのAWSリソースまたは外部サービスに対して通信(アクセス)する事を許可する
:::note info
アウトバウンドは、特殊な事情がない限り、基本的にこの設定で良い
:::

***

**`AWSリソース`に付与したセキュリティグループの設定内容**
|インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
|:---: | :---: | :---: | :---: | :---: | 
|設定なし| -  | - | -  | - |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
|:---: | :---: | :---: | :---: | :---: | 
|-| 全てのトラフィック | すべて | すべて | 0.0.0.0/0 |

***

**イメージ図**
![スクリーンショット 2024-04-13 20.23.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/a9a220e0-cfd9-cb0a-c93c-e133ed8d5816.png)


### トラフィック(送信)を指定した場所にのみ送信
- 　<font color="black">**外部サービス**</font>は、全ての通信を許可している為、アウトバウンドで送信先を制御していたとしても通信する事が可能
- 　<font color="blue">**AWSリソース タイプB**</font>に関して、`HTTPS`（`443`番ポート）であれば、どんな通信でも通す設定になっている為、通信する事が可能
- 　<font color="green">**AWSリソース タイプC**</font>に関して、`HTTPS`（`443`番ポート）で、尚且つ`2.2.2.2/32`の通信のみしか許可していない為、<font color="red">**AWSリソース タイプA**</font>からは通信する事が不可能
***

<font color="red">**AWSリソース タイプA**</font>**に付与したセキュリティーグループの設定内容**
|インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
|:---: | :---: | :---: | :---: | :---: | 
|設定なし| -  | - | -  | - |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
|:---: | :---: | :---: | :---: | :---: | 
|-| 全てのトラフィック | すべて | すべて | 1.1.1.1/32 |

***

<font color="blue">**AWSリソース タイプB**</font>**に付与したセキュリティーグループの設定内容**
|インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
|:---: | :---: | :---: | :---: | :---: | 
| - | HTTPS  |  TCP  |  443  | 0.0.0.0/32 |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
|:---: | :---: | :---: | :---: | :---: | 
|設定なし| -  | -  | - | -  |

***
<font color="green">**AWSリソース タイプC**</font>**に付与したセキュリティーグループの設定内容**
|インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
|:---: | :---: | :---: | :---: | :---: | 
| - | HTTPS  |  TCP  |  443  | 2.2.2.2/32 |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
|:---: | :---: | :---: | :---: | :---: | 
|設定なし| - | - | - | - |

***

**イメージ図**
![スクリーンショット 2024-04-13 20.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/c19128d7-e2b2-1e57-ab15-40b472b787e3.png)


### 特定のAWSリソースにのみトラフィック(送信)を許可する
- <font color="blue">**AWSリソース タイプB**</font>は、`HTTPS`（`443`番ポート）と`HTTP`（`80`番ポート）で尚且つ<font color="red">**AWSリソース タイプA**</font>の通信を許可している為、通信する事が可能
- <font color="green">**AWSリソース タイプC**</font>は、`HTTPS`（`443`番ポート）と`HTTP`（`80`番ポート）の通信は許可しているが、<font color="red">**AWSリソース タイプA**</font>へからの通信は許可されていない為、通信する事が不可能

***

<font color="red">**AWSリソース タイプA**</font>**に付与したセキュリティーグループの設定内容**
|インバウンドの設定|　 タイプ　|プロトコル|ポート範囲|ソース|
|:---: | :---: | :---: | :---: | :---: | 
|設定なし| -  | - | -  | - |

|**アウトバウンドの設定**|　**タイプ**　|**プロトコル**|**ポート範囲**|**ソース**|
|:---: | :---: | :---: | :---: | :---: | 
|-| HTTPS | TCP | 443 | sg-type-a / aws-resource-a |
|-| HTTP | TCP | 80 | sg-type-a / aws-resource-a |

***

<font color="blue">**AWSリソース タイプB**</font>**に付与したセキュリティーグループの設定内容**
*セキュリティーグループ名 : **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 |

***

<font color="green">**AWSリソース タイプC**</font>**に付与したセキュリティーグループの設定内容**
*セキュリティーグループ名 : **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 |

***

![スクリーンショット 2024-04-16 22.51.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/771e0cb8-6603-0830-9728-375f6955a7df.png)



# 参考資料
- [AWS セキュリティグループ ハンズオン](https://zenn.dev/shonansurvivors/articles/1232608f9a201e)
- [同一セキュリティグループに属するインスタンス間の通信について調べてみた](https://dev.classmethod.jp/articles/ec2-to-ec2-with-same-sg/)


# まとめ
この記事を書くきっかけは、業務でECSを構築する際にセキュリティグループの設定で苦労した為です。最初は、自身の知識不足もあり、他に構築してある環境(EC2の構築時に使用したセキュリティーグループの設内容)のセキュリティーグループの内容をそのままコピーして構築を行なっておりました。当然、コピペ同様の作業では正常に動作しません。ただ、「他の構築がそうなっているからこのセキュリティーグループの構築は正しいんだ」と勝手に判断し、セキュリティーグループとは関係のない部分を修正し、無断に時間を浪費してしまいました。さらに、今回のミスを何度も繰り返し、先輩エンジニアに毎回聞いて対処すると言う悪い悪循環になっておりました。流石にこの状況はまずいと思い、今回の記事を書く事にしました。今回の記事は基本的な内容ですが、今回理解した事を応用してセキュリティーグループの構築も行えるようになればと思います。