← ハンズオン一覧に戻る

AWS Hands-on / Security

セキュリティグループで、サーバーの壁に必要な穴だけを開ける

EC2 インスタンスは、起動した瞬間から「セキュリティグループ」という仮想的な壁に囲まれています。最初は SSH だけを通す壁からスタートし、Web サーバーを立てたのにブラウザからは見えない状態を体験したうえで、HTTP の穴を 1 つ開けて、見えるようになる瞬間を確かめます。

● Lv.1 AWS を触りはじめた人 ⏱ 所要 45〜60 分 コンソール操作に加えて SSH を使用します
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持ち、マネジメントコンソールにサインインできること
  • 必須ターミナル(Windows の PowerShell)で ssh コマンドを数回使えること
  • あると良いVPC・サブネット・EC2 という言葉に、なんとなく触れたことがある
  • あると良い「ポート番号」「IP アドレス」という言葉のイメージがある

※ このハンズオンは、コンソール操作を中心に、EC2 への接続と数行のコマンド入力に SSH(Windows 標準搭載の OpenSSH)を使用します。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

EC2 インスタンスを起動すると、必ず 1 つ以上のセキュリティグループが割り当てられます。これは、インスタンスの周りに立つ仮想的な壁のようなもので、どの通信を中に入れる(インバウンド)か、外に出す(アウトバウンド)かを、ルールとして 1 つずつ決めていきます。

新しく作成したセキュリティグループは、インバウンドは初期状態で何も許可されていません。つまり、何もしなければ外から一切アクセスできない、完全に閉じた壁からスタートします。そこに「SSH(22番ポート)だけ許可する」「HTTP(80番ポート)だけ許可する」というように、必要な通信のぶんだけ穴を開けていくのがセキュリティグループの基本的な考え方です。今回は、SSH だけが開いた壁の中に Web サーバーを立て、HTTP の穴がまだ無いために見えない状態と、穴を開けたあとに見える状態を、自分の手で切り替えて体験します。

セキュリティグループは、OS の中のファイアウォールと同じもの?

別のものです。セキュリティグループは AWS のネットワーク側で通信を制御する壁で、Linux の中の設定(例:firewalld)とは独立して働きます。今回は OS 側の設定には触れず、セキュリティグループだけで通信を制御します。

最初は何が許可されていて、何が許可されていないの?

新規に作成したセキュリティグループは、インバウンド(外→中)は初期状態で何も許可されていません。一方でアウトバウンド(中→外)はすべて許可されているのが標準の初期値です。今回はこのインバウンド側に、必要なルールだけを追加していきます。

Goal

EC2 インスタンスを 1 台起動し、最初は SSH(22番)だけを許可したセキュリティグループで Web サーバーを立てる。HTTP(80番)を許可する前はブラウザから表示できないことを確認したうえで、ルールを 1 つ追加してブラウザから表示できる状態に変える。

04 — Before / After

穴を開ける前と、開けたあと

同じ EC2 インスタンス・同じ Web サーバーのまま、セキュリティグループのインバウンドルールだけを変えて、ブラウザからの見え方がどう変わるかを比べます。

Before — HTTP(80) を許可する前

SSH だけが開いた壁

  • ブラウザでアクセス → 応答なし(タイムアウト)
  • インバウンドで許可されているのは SSH(22) だけ
  • 壁の外からは、中の Web サーバーの存在が見えない
After — HTTP(80) を許可したあと

SSH と HTTP、2 つの穴が開いた壁

  • ブラウザでアクセス → 作成した Web ページが表示される
  • インバウンドで SSH(22) と HTTP(80) の両方を許可
  • 必要な通信だけを選んで、穴を追加している
🔐 SSH(22) のみ許可 🌐 HTTP(80) を追加 ✓ 管理もできて、公開もできるサーバーに
05 — Requirements

要件

以下の要件を満たし、「HTTP を許可する前は見えず、許可すると見える」という変化を自分の手で確認してください。

No要件
1VPC を 1 つ新規に作成する。IPv4 CIDR ブロックは /16/28 の範囲で自由に決めてよい(例:10.0.0.0/16)。リージョンは「東京(ap-northeast-1)」を使用する。
2インターネットゲートウェイを作成して VPC にアタッチし、パブリックサブネットを 1 つ作成する(CIDR は VPC の範囲内で自由に決めてよい。例:10.0.0.0/24)。ルートテーブルに 0.0.0.0/0 → インターネットゲートウェイのルートを追加し、このサブネットに関連付ける。
3新しいセキュリティグループを 1 つ作成する(例:sg-demo-web)。インバウンドルールは SSH(22) のみを、送信元「マイ IP」で許可する状態にする。
4EC2 インスタンスを 1 台起動する。AMI は Amazon Linux 2023、インスタンスタイプは無料利用枠対象(例:t2.micro または t3.micro)とする。手順 2 のパブリックサブネットに配置し、パブリック IP アドレスの自動割り当てを有効にし、手順 3 のセキュリティグループを設定する。
5SSH で接続し、Web サーバー(httpd)をインストール・起動する。この時点で、ブラウザからインスタンスのパブリック IP にアクセスしてもページが表示されないことを確認する。
6セキュリティグループのインバウンドルールに HTTP(80) を追加する。送信元は自由に選んでよい(例:誰でも見られるようにする場合は 0.0.0.0/0、自分の PC だけに絞る場合は「マイ IP」)。追加後、ブラウザで再度アクセスし、ページが表示されることを確認する。
06 — Steps

構築の進め方

「壁の外側(ネットワーク)を作る → 壁そのもの(セキュリティグループ)を作る → 中にサーバーを立てる → 穴が無い状態を確認する → 穴を 1 つ開ける」という順番で進みます。各ステップで「なぜそうするのか」を意識してみてください。

  1. VPC を作成する

    VPC コンソールで「VPC を作成」→「VPC のみ」を選び、名前タグを sg-demo-vpc、IPv4 CIDR ブロックを自由に決めた値(例:10.0.0.0/16)で作成します。

    まずは土台となるネットワーク

    セキュリティグループは VPC の中で動く仕組みです。壁そのものを作る前に、壁を立てる場所となる VPC を用意します。

  2. インターネットゲートウェイを作成してアタッチする

    「インターネットゲートウェイを作成」で名前タグ sg-demo-igw のものを作り、作成後に「VPC にアタッチ」から手順 1 の VPC に接続します。

    アタッチを忘れがちな理由

    インターネットゲートウェイは、作成しただけでは何もしてくれません。VPC にアタッチして初めて、インターネットとの出入り口として機能します。

  3. パブリックサブネットとルートテーブルを用意する

    サブネットを 1 つ作成します(名前タグ sg-demo-public、CIDR は VPC の範囲内で自由に、例:10.0.0.0/24)。続けてルートテーブルを作成し(名前タグ sg-demo-public-rt)、ルートに 0.0.0.0/0 → 手順 2 のインターネットゲートウェイを追加し、このサブネットに関連付けます。

    「パブリック」を決めているのはルートテーブル

    サブネットが「パブリック」と呼ばれるのは、インターネットゲートウェイへの経路を持つルートテーブルが関連付けられているからです。この関連付けがないと、インターネットとやり取りできません。

  4. セキュリティグループを作成する(最初は SSH のみ)

    EC2 コンソールの「セキュリティグループ」から、名前を sg-demo-web、説明を自由に入力して作成します。VPC は手順 1 で作成したものを選び、インバウンドルールに タイプ:SSH、送信元:マイ IP を 1 つだけ追加します。

    インバウンドルールを追加 — 現在の状態(イメージ)

    インバウンドルール

    SSH / TCP / 22
    送信元:マイ IP
    HTTP / TCP / 80
    まだ追加していない

    この時点では SSH の穴しか開いていません

    「マイ IP」を選ぶ理由

    SSH は管理用の入り口です。誰からでも接続できる状態にすると、総当たり攻撃の対象になりやすいため、まずは自分の IP アドレスからだけ許可しておきます。

  5. EC2 インスタンスを起動する

    「インスタンスを起動」で名前タグを sg-demo-web-server、AMI に Amazon Linux 2023、インスタンスタイプに無料利用枠対象のもの(例:t2.micro)を選びます。新しいキーペア sg-demo-key を作成してダウンロードし、ネットワーク設定で手順 3 のサブネットとパブリック IP の自動割り当て「有効」、セキュリティグループに手順 4 の sg-demo-web を選んで起動します。

    キーペアの .pem ファイルは失くさない

    ダウンロードできるのはこの 1 回だけです。分かりやすい場所(例:ユーザーフォルダ直下)に保存しておきましょう。

  6. SSH 接続して Web サーバーをインストールする

    インスタンスが「実行中」になったら、パブリック IPv4 アドレスを確認し、PowerShell から SSH 接続します。接続できたら、Web サーバー(Apache)をインストールして起動します。

    PowerShell(ローカル)
    # 鍵ファイルの権限を自分のみ読み取り可に絞る
    icacls .\sg-demo-key.pem /inheritance:r
    icacls .\sg-demo-key.pem /grant:r "$($env:USERNAME):(R)"
    
    # SSH接続(IPは自分のインスタンスのものに置き換える)
    ssh -i .\sg-demo-key.pem ec2-user@<インスタンスのパブリックIP>
    EC2 インスタンス内
    # パッケージを更新し、Webサーバー(Apache)をインストールする
    sudo dnf update -y
    sudo dnf install -y httpd
    
    # Webサーバーを起動し、再起動時にも自動起動するようにする
    sudo systemctl start httpd
    sudo systemctl enable httpd
    
    # 確認用の簡単なページを作成する
    echo "<h1>Hello from Security Group Handson</h1>" | sudo tee /var/www/html/index.html
  7. ブラウザでアクセスし、見えないことを確認する

    ブラウザで http://<インスタンスのパブリックIP>/ にアクセスします。Web サーバーは動いているのに、ページが読み込めずタイムアウトすることを確認します。

    これは正常な状態

    Web サーバー自体は動いていますが、セキュリティグループのインバウンドルールに HTTP(80) の許可が無いため、通信が壁の外で止められています。「サーバーが動いていること」と「外から見えること」は別ものだと分かる場面です。

  8. HTTP(80) のルールを追加し、見えることを確認する

    セキュリティグループ sg-demo-web の「インバウンドルール」タブから「ルールを編集」→「ルールを追加」で、タイプ:HTTP、送信元:自由に選んだ値(例:0.0.0.0/0)を追加して保存します。もう一度同じアドレスにブラウザでアクセスし、作成したページが表示されることを確認します。

    穴を 1 つ開けただけで変わる

    サーバー側の設定は何も変えていません。セキュリティグループに HTTP(80) のルールを 1 行追加しただけで、外から見える状態に変わったことを確認しましょう。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — HTTP を許可したのに、まだブラウザで表示されない

「ルールを追加したはずなのに、変化がない」

確認したい点がいくつかあります。①追加したルールのタイプが HTTP(ポート80・プロトコル TCP)になっているか②SSH で入り直し、sudo systemctl status httpdactive (running) になっているか③アクセスしているアドレスが、EC2 の現在のパブリック IPv4 アドレスと一致しているか(再起動などで変わっていないか)を見直してみてください。

Pitfall 02 — SSH が最初からつながらない、または途中でつながらなくなった

「ssh コマンドを打っても反応がない、または急に失敗するようになった」

多くの場合、セキュリティグループの SSH(22) の送信元に指定した「マイ IP」と、今の自分の IP アドレスがずれていることが原因です。自宅の Wi-Fi を再接続したり、別のネットワークに移動したりすると IP アドレスが変わることがあります。インバウンドルールを編集し、「マイ IP」を選び直して現在の IP に更新してみてください。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。EC2 コンソールとブラウザで、次を順に確かめましょう。

  • EC2 インスタンスの詳細画面「セキュリティ」タブに、作成したセキュリティグループ(例:sg-demo-web)が表示されている。
  • そのセキュリティグループの「インバウンドルール」タブに、SSH(22) と HTTP(80) の 2 行が並んでいる。
  • ブラウザで http://<パブリックIPv4アドレス>/ を開くと、手順 6 で作成したページが表示される。
  • EC2 の「ネットワーキング」タブで確認できるパブリック IPv4 アドレスと、ブラウザでアクセスしたアドレスが一致している。
  • 同じキーペアで SSH 接続も引き続きでき、Web サーバーとしての公開と、管理用の SSH 接続が両立できている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. なぜセキュリティグループは、新規作成した時点で「インバウンドは何も許可しない」状態から始まるのでしょうか。もし逆に「最初から全部許可」だったら、何が起きるか考えてみましょう。
    ヒント
    インターネットには、開いているポートを探して接続を試みる通信が常に存在します。「必要な穴だけを自分で開ける」というホワイトリスト方式と、「全部開けてから危険なものだけ塞ぐ」というブラックリスト方式、どちらが安全に保ちやすいか比べてみましょう。
  2. 今回は HTTP(80) の送信元を自由に選べるようにしましたが、SSH(22) の送信元は「マイ IP」のままにしました。もし SSH の送信元も 0.0.0.0/0(どこからでも)にしてしまうと、どんなリスクがあるでしょうか。
    ヒント
    SSH は鍵さえあればサーバーの中に入れる、管理者向けの入り口です。誰からでも接続を試みられる状態にすると、総当たりでの認証試行の対象になりやすくなります。「見せてよい通信」と「絞るべき通信」の違いという観点で考えてみましょう。
  3. セキュリティグループのルールを削除すると、そのルールで許可されていた今まさに確立している通信(例えば開いたままの SSH セッション)はどうなると思いますか。実際に試して確かめてみましょう。
    ヒント
    セキュリティグループは「ステートフル」だと言われます。まずは自分の予想を立ててから、実際にルールを一時的に変更し、既存の接続がどうなるかを観察してみましょう。公式ドキュメントの「セキュリティグループのルール」のページも手がかりになります。
10 — Clean up

後片づけ

作ったものを片づけるところまでが一連の流れです。作成した順とは逆の順番で、依存関係のあるものから削除していきます。

  1. EC2 インスタンスを終了する:EC2 コンソールでインスタンスを選択し、「インスタンスの状態」→「インスタンスを終了」を選ぶ。
  2. キーペアを削除する(任意):不要であれば「キーペア」から sg-demo-key を削除し、手元の .pem ファイルも整理する。
  3. セキュリティグループを削除する:インスタンスの終了後、sg-demo-web を選択して削除する。
  4. サブネットを削除する:VPC コンソールでサブネット sg-demo-public を削除する。
  5. ルートテーブルを削除する:自作したルートテーブル sg-demo-public-rt を削除する(デフォルトのルートテーブルは残る)。
  6. インターネットゲートウェイをデタッチ・削除する:sg-demo-igw を VPC からデタッチしたあと、削除する。
  7. VPC を削除する:最後に sg-demo-vpc を削除する。
Caution — デフォルトのリソースは消さない

削除するのは、自分で名前を付けたものだけ

一覧には最初から用意されている「デフォルト VPC」や「デフォルトセキュリティグループ」も並んでいます。今回自分で付けた名前タグ(sg-demo- から始まるもの)だけを選んで削除してください。デフォルトセキュリティグループはそもそも削除できない仕様になっています。

コストに関する注意: EC2 インスタンスは起動している時間に応じて課金されます(t2.microt3.micro などは無料利用枠の対象になる場合があります)。アタッチされるEBS ボリュームにも保存容量に応じた料金がかかります。一方、VPC・サブネット・インターネットゲートウェイ・ルートテーブル・セキュリティグループ自体の利用に料金はかかりません。検証が終わったら、上の「後片づけ」に沿って忘れずに削除しましょう。最新の料金は AWS の公式料金ページで確認してください。