初学者向け：セキュリティグループのインバウンドとアウトバウンドの違い整理と実際に触ってみた

## はじめに
セキュリティグループについて勉強を始めたとき、正直なところ、インバウンドルールやアウトバウンドルールの仕組みを理解するのに少し時間がかかりました。

:::note warn
しかし、AWSにおいてセキュリティグループは非常に重要な概念です。***セキュリティグループを学ぶことは、AWSを学ぶことそのものと言っても過言ではありません（笑）。***
:::

***この記事では、AWSを学び始めた方や、これからEC2でサーバーを構築しようと思っている方向けに、セキュリティグループの基礎知識や具体例を交えてわかりやすく解説します。***

## そもそもセキュリティグループとは
セキュリティグループは、AWSにおける仮想ファイアウォールの役割を果たす重要な機能です。

![スクリーンショット 2024-12-18 22.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/fab644a8-55d4-4ad1-2c5b-958f484f67a7.png)
引用画像：https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-security-groups.html

セキュリティグループは、特定のトラフィック（通信）を許可または拒否するルールを設定します。

:::note
セキュリティグループでは、「**どのポート**」「**どのプロトコル**」「**どのIPアドレス**」などから通信を許可するかを柔軟に設定できます。
:::

例えば、Webサーバーであれば、HTTP通信（80番ポート）を全世界から許可する設定をセキュリティグループで定義します。

一方で、データベースサーバーなど機密性の高い通信は、特定のIPアドレスのみに限定することでセキュリティを確保することができます。

***AWSのセキュリティグループはステートフルな特性を持っており、一度許可された通信に対する応答トラフィックは自動的に許可されます。***

## インバウンドルール
インバウンドルールは、外部からEC2インスタンスに向かうトラフィックを制御する設定です。

:::note warn
***簡単に言えば、「どんな通信をインスタンスに受け入れるか」を決めるルールです。***
:::

SSHアクセスを許可する場合は、ルールでポート22を開放し、特定のIPアドレス（例: 管理者のPC）からのアクセスのみを許可します。

Webサーバーを運用する場合は、ポート80（HTTP）やポート443（HTTPS）を開放して、全世界からのアクセスを受け付けます。

https://dev.classmethod.jp/articles/ec2-securitygroups-and-ssh/

:::note
***インバウンドルールでは、通信元のIPアドレスや範囲（CIDR形式）を細かく制御できるため、適切に設定することでセキュリティを向上させることができます。***
:::

## アウトバウンドルール
アウトバウンドルールは、EC2インスタンスから外部に向かうトラフィックを制御する設定です。

:::note warn
***簡単に言えば、「どんな通信をインスタンスから外に送るか」を決めるルールです。***
:::

インターネットに接続する場合は、ポート80や443を開放して、インターネットへの通信を許可します。

特定のデータベースに接続する場合は、ポート3306（MySQL）などを開放し、データベースサーバーのIPアドレスのみに通信を許可します。

:::note alert
***AWSのセキュリティグループはデフォルトで「全てのアウトバウンドトラフィックが許可」されていますが、必要に応じて制限を加えることでセキュリティを強化できます。***
:::

## ここまでのまとめ

インバウンドルールは、外部からの通信をインスタンスが受け入れる条件を指定するルールです。

一方で、アウトバウンドルールは、インスタンスから外部に送信する通信の条件を指定するルールです。

![スクリーンショット 2024-12-18 22.23.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/681b9c50-ff56-5bf3-dfb4-3bf09208e40a.png)
引用画像：https://tech-camp.in/note/technology/14602/


ここまでの説明で、セキュリティグループ、インバウンドルール、アウトバウンドルールの基本が理解できたと思います。

***以下に要点を簡単に表でまとめました。***

| **特徴**               | **インバウンドルール**                                   | **アウトバウンドルール**                                |
|------------------------|--------------------------------------------------------|-------------------------------------------------------|
| **通信の方向**         | 外部 → EC2インスタンス                                | EC2インスタンス → 外部                               |
| **制御対象**           | インスタンスが受け入れる通信を制御                     | インスタンスから送信する通信を制御                    |
| **主な用途**           | - SSHアクセス許可<br>- Webサーバーの通信許可          | - インターネットアクセス<br>- 外部APIやDB接続         |
| **設定例**             | - ポート22: 特定IPからのSSHアクセス許可<br>- ポート80: 全世界からのHTTPアクセス許可 | - ポート443: インターネット接続許可<br>- ポート3306: 特定DBへの接続許可 |
| **デフォルト設定**     | 全てのトラフィックを拒否                               | 全てのトラフィックを許可                              |
| **セキュリティのポイント** | 適切なIP範囲を指定し、不必要なポートは開放しない        | 必要最低限の外部通信に絞り、意図しない通信を制限      |

:::note
***Qiitaでブログ投稿を始めたことで、自然とマークアップ言語を扱えるようになったのは大きな収穫です！***
:::

## 事前準備

ここでは、過去の記事で紹介したTerraformのコードを使用して、シンプルなEC2インスタンスを1台構築し、検証を行います。

https://qiita.com/free-honda/items/7770f57db0b9e619cfb4

:::note alert
***このEC2インスタンスにはパブリックIPv4アドレスが割り当てられており、秘密鍵（キーペア）を設定済みです。インターネットからのアクセスが可能な状態です。***
:::

## 実際にセキュリティグループを触ってみた

ここでは、以下の3つのケースをハンズオン形式で解説します。

:::note info
- **ICMP（ping通信）**
- **SSH（22番ポート）**
- **HTTP（80番ポート）**
:::

画像を交えながら設定手順を説明します。また、自分への備忘録として、セキュリティグループの設定方法をまとめています。

### ICMP（ping通信）

ICMPは主にpingコマンドを使って通信確認を行います。セキュリティグループでICMPを許可していない場合、通信は失敗します。

![スクリーンショット 2024-12-18 21.51.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/aa1a066e-bff5-75cd-48fa-381f44fd7f3b.png)

「すべてのICMP-IPv4」を選択し、「0.0.0.0/0」で全世界からのpingを許可します。

![スクリーンショット 2024-12-18 21.44.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/da3800ed-0e75-c5d2-ad3c-539d7c6a210a.png)

設定後、pingを再実行して、疎通確認が成功することを確認できました！

![スクリーンショット 2024-12-18 21.52.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9497a496-e405-b22a-384e-0c3d7c1fc8ac.png)


### SSH（22番ポート）

SSHはリモート接続に使用され、セキュリティグループでポート22が許可されていないと接続できません。

:::note alert
***ポート22が未許可の場合、接続は失敗します。以下のようなエラーが表示されます。***
:::

![スクリーンショット 2024-12-18 22.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ade9f2bd-7d1c-6aa9-7061-42adc82e7315.png)

ちなみに、Tera Termを使ってEC2インスタンスに秘密鍵（```.pemファイル```）を使用してSSH接続する方法については、過去の記事で詳しく解説しています。

https://qiita.com/free-honda/items/a215ebb22140fe11d789

次に、セキュリティグループのインバウンドルールを編集し、SSHを選択して「0.0.0.0/0」（全世界）からのSSH接続を許可します。

![スクリーンショット 2024-12-18 22.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/8ed58b8c-f15b-aca3-7bf8-1827d839c978.png)

ルールを設定後、再度Tera Termを使用してEC2インスタンスに秘密鍵を使いSSH接続を試みると、無事接続が成功しました！

![スクリーンショット 2024-12-18 22.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/416f1d4d-6fc5-74e3-77b8-f4ed11925495.png)

### HTTP（80番ポート）

HTTPはウェブ通信に使用され、セキュリティグループでポート80が許可されていない場合、Webサーバーへのアクセスはブロックされます。

:::note alert
***今回は、Terraformを使用して構築したEC2インスタンスにApacheを導入しており、Webサーバーとして動作するように設定しています。***
:::

最初に、セキュリティグループでポート80が未許可の状態で接続を試みたところ、タイムアウトエラーとなり、想定通りアクセスできないことを確認しました。

![スクリーンショット 2024-12-18 22.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c86788cd-88f7-4d8c-2ddb-4bd96269f50f.png)

次に、セキュリティグループのインバウンドルールを編集し、HTTPを選択して「0.0.0.0/0」（全世界）からのインターネットアクセスを許可します。

![スクリーンショット 2024-12-18 22.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/0cdedcd8-b87d-0ba4-d28b-681f88d25428.png)

設定後、ブラウザからアクセスしたところ、事前にTerraformで設定していたテスト用のHTMLページが正しく表示されることを確認しました。

![スクリーンショット 2024-12-18 22.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cccd61bb-1911-17d7-1b3e-823d52b8ca83.png)

***今回の検証は、すべて大成功です！！***

## まとめ
ここまで読んでいただき、ありがとうございます。

:::note warn
***今回はセキュリティグループの基本について解説しました。この内容が少しでも誰かの技術の支えになれば幸いです。***
:::

今後も、自分の知識を整理しながら、基礎的な部分を体系的に学び、実際に手を動かしながら学んだ内容を記事としてまとめていきたいと思います！

## 関連記事

https://dev.classmethod.jp/articles/create-and-edit-sg/

https://dev.classmethod.jp/articles/what-is-default-sg/

https://aws.taf-jp.com/blog/57620