AWS多段防御「セキュリティグループ」「ACL」を設定出来るようにする

はじめに
--
次のような構成に適切な「セキュリティグループ」「ACL」を設定して下さい。と言われて、直ぐに出来る人は、意外といないようです。今回は、意外とわかりにくいAWS多段防御「セキュリティグループ」「ACL」が出来るようにする説明を行います。AWSで基本的なシステムに基本的なセキュリティを設定したいが、どういう事をしなければならないのか、わからないという方も、この記事を読めば、出来るようになります。AWS多段防御の基本を学ぶためにご活用下さい。

## 基本構成
これをイメージして下さい。何処に「セキュリティグループ」「ACL」が必要ですか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/53892fe9-456a-4555-843a-bd21799dd4c4.png)

## AWSにおける「セキュリティグループ」と「ネットワークACL（NACL）」を組み合わせた多段防御のメリット

| **メリット**                               | **説明**                                                                                                                                                            |
|-------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 異なるレベルでのアクセス制御              | セキュリティグループはインスタンス単位で適用され、特定のリソースへのアクセスを細かく制御できます。<br>ネットワークACLはサブネット単位で適用され、広範囲のトラフィックを管理します。 |
| ステートフルとステートレスの特性を活用     | セキュリティグループはステートフルで、インバウンド通信を許可すれば対応するアウトバウンド通信も自動的に許可されます。<br>ネットワークACLはステートレスで、インバウンドとアウトバウンドのルールを個別に設定する必要があります。 |
| 冗長性とセキュリティの向上                | 両方のルールを設定することで、どちらか一方が誤設定されても、もう一方がセキュリティを補完します。<br>例: セキュリティグループで許可されていないトラフィックがネットワークACLでブロックされる可能性があります。 |
| CIDRと特定リソースの組み合わせ           | ネットワークACLではCIDR（IPアドレス範囲）を指定して広範囲のアクセスを制御できます。<br>セキュリティグループでは特定のリソースやポートに対するアクセスを細かく設定できます。<br>これにより、より安全で柔軟なアクセス制御が実現します。 |



### 前提知識の確認

#### セキュリティグループを使用して AWS リソースへのトラフィックを制御する とは？
セキュリティグループ（Security Group）は、インスタンスやその他のリソースへのトラフィックを制御するための仮想ファイアウォールです。セキュリティグループは、インバウンド（受信）およびアウトバウンド（送信）トラフィックのルールを設定することで、特定のIPアドレスやポートからのアクセスを許可または拒否することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/78612647-69d7-4676-af7c-d437f9996627.png)

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-security-groups.html

#### ネットワークアクセスコントロールリストを使用して、サブネットのトラフィックを制御する　とは？
ネットワークアクセスコントロールリスト（ACL）は、サブネット内のトラフィックを制御するための重要なツールです。ACLは、ネットワークのセキュリティを強化し、特定のトラフィックを許可または拒否するルールを設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/d7867d58-12b8-427e-92fd-fa2dd222270a.png)

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-network-acls.html

## 構成のイメージ、前提知識の確認が済んだら、早速、設定を確認して行きましょう！


## サブネット
まず、サブネットを作成します。WEB,LB1,LB2,DBのサブネットが必要です。

| サブネット名                  | タイプ    | CIDRブロック         |
|-----------------------------|---------|---------------------|
| Web Server Subnet           | Private | 10.10.10.0/24       |
| Load Balancer Subnet 1      | Public  | 10.10.1.0/24        |
| Load Balancer Subnet 2      | Public  | 10.10.2.0/24        |
| Database Server Subnet      | Private | 10.10.20.0/24       |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/8d8fc804-802a-4b9b-9757-26f0513dfaff.png)


## セキュリティグループ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/cf1f8b46-516b-421f-8d22-39b47d5b5ef6.png)

### Webサーバ側セキュリティグループ
#### インバウンド
任意の IPv4 ソース IP から WebServerSg セキュリティグループの任意のリソースへのポート 443 のインバウンドトラフィックを許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/7a3a035b-6940-4e80-b186-0bac20f2e3e1.png)

#### アウトバウンド
WebServerSg セキュリティグループの任意のリソースから DatabaseServerSg セキュリティグループの任意のリソースへのポート 3306 のアウトバウンドトラフィックを許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/60bc8464-5604-4de7-ad00-a7a87257c682.png)

### DBサーバ側セキュリティグループ
#### インバウンド
WebServerSg セキュリティグループの任意のリソースから DatabaseServerSg セキュリティグループの任意のリソースへのインバウンドトラフィックを許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/45803b82-fbf9-4f5c-b7e8-da37c9be9093.png)
#### アウトバウンド
これは、出口なのでhttpsを「0.0.0.0/0」ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/95a56578-9c7f-4d5a-8c05-d88189ca857d.png)

## 最後に、ネットワークACLを行います！

## ネットワークACL

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/b69c4135-39a3-4872-bd69-4f539cfaca18.png)


| ルール番号 | タイプ                | プロトコル | ポート範囲     | ソース/送信先   | 許可/拒否 |
|------------|-----------------------|------------|----------------|----------------|-----------|
| **デフォルトの NACL - インバウンド** |
| 100        | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 許可      |
| *          | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 拒否      |
| **デフォルトの NACL - アウトバウンド** |
| 100        | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 許可      |
| *          | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 拒否      |
| **load-balancer-nacl - インバウンド** |
| 100        | HTTPS (443)           | TCP (6)    | 443            | 0.0.0.0/0      | 許可      |
| 101        | カスタム TCP          | TCP (6)    | 1024～65535    | 10.10.0.0/16   | 許可      |
| *          | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 拒否      |
| **load-balancer-nacl - アウトバウンド** |
| 100        | HTTPS (443)           | TCP (6)    | 443            | 10.10.10.0/24  | 許可      |
| 101        | カスタム TCP          | TCP (6)    | 1024～65535    | 0.0.0.0/0      | 許可      |
| *          | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 拒否      |
| **web-server-nacl - インバウンド** |
| 100        | HTTPS (443)           | TCP (6)    | 443            | 0.0.0.0/0      | 許可      |
| 101        | カスタム TCP          | TCP (6)    | 1024～65535    | 10.10.0.0/16   | 許可      |
| *          | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 拒否      |
| **web-server-nacl - アウトバウンド** |
| 100        | カスタム TCP          | TCP (6)    | 1024～65535    | 0.0.0.0/0      | 許可      |
| 101        | MySQL/Aurora (3306)   | TCP (6)    | 3306           | 10.10.20.0/24  | 許可      |
| *          | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 拒否      |
| **database-server-nacl - インバウンド** |
| 100        | MySQL/Aurora          | TCP (6)    | 3306           | 10.10.10.0/24  | 許可      |
| 101        | カスタム TCP          | TCP (6)    | 1024～65535    | 10.10.0.0/16   | 許可      |
| *          | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 拒否      |
| **database-server-nacl - アウトバウンド** |
| 100        | カスタム TCP          | TCP (6)    | 1024～65535    | 10.10.0.0/16   | 許可      |
| *          | すべてのトラフィック  | すべて     | すべて         | 0.0.0.0/0      | 拒否      |



### WEBサーバ
#### サブネットの関連付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/479bbc1d-c2fe-4980-af3d-6de885a9a2a1.png)

#### インバウンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/cb31929b-a4f0-4ea6-be6b-9382ac6be31b.png)

#### アウトバウンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/4872ef67-180b-45f9-a3ce-c97b65d8b7de.png)

### ロードバランサ
#### サブネットの関連付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/6818375c-020c-42a4-8690-24252b3f0dd1.png)

#### インバウンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/d0638c9b-19f8-4cac-9ccf-69079660c1bb.png)

#### アウトバウンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/8088790d-ecdb-426b-8853-76d57ec28c9a.png)

### データベース
#### サブネットの関連付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/4153f4a4-2186-4ade-b14c-d9ea30d24909.png)

#### インバウンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/362aee4c-06d4-4d54-acb6-1d49bfc75f0b.png)

#### アウトバウンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/e3c33760-6148-4c29-aab0-d5fe55211286.png)

この通りにやれば、AWS多段防御の基本が出来るようになります。読んで頂きまして、ありがとうございました。


## 仲間を募集しています！

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です！
ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421