はじめる前に
- 必須AWS アカウントを持ち、マネジメントコンソールにサインインできること
- 必須ターミナル(Windows の PowerShell)で
sshコマンドを数回使えること - あると良いVPC・サブネット・EC2 という言葉に、なんとなく触れたことがある
- あると良い「ポート番号」「IP アドレス」という言葉のイメージがある
※ このハンズオンは、コンソール操作を中心に、EC2 への接続と数行のコマンド入力に SSH(Windows 標準搭載の OpenSSH)を使用します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
EC2 インスタンスを起動すると、必ず 1 つ以上のセキュリティグループが割り当てられます。これは、インスタンスの周りに立つ仮想的な壁のようなもので、どの通信を中に入れる(インバウンド)か、外に出す(アウトバウンド)かを、ルールとして 1 つずつ決めていきます。
新しく作成したセキュリティグループは、インバウンドは初期状態で何も許可されていません。つまり、何もしなければ外から一切アクセスできない、完全に閉じた壁からスタートします。そこに「SSH(22番ポート)だけ許可する」「HTTP(80番ポート)だけ許可する」というように、必要な通信のぶんだけ穴を開けていくのがセキュリティグループの基本的な考え方です。今回は、SSH だけが開いた壁の中に Web サーバーを立て、HTTP の穴がまだ無いために見えない状態と、穴を開けたあとに見える状態を、自分の手で切り替えて体験します。
セキュリティグループは、OS の中のファイアウォールと同じもの?
別のものです。セキュリティグループは AWS のネットワーク側で通信を制御する壁で、Linux の中の設定(例:firewalld)とは独立して働きます。今回は OS 側の設定には触れず、セキュリティグループだけで通信を制御します。
最初は何が許可されていて、何が許可されていないの?
新規に作成したセキュリティグループは、インバウンド(外→中)は初期状態で何も許可されていません。一方でアウトバウンド(中→外)はすべて許可されているのが標準の初期値です。今回はこのインバウンド側に、必要なルールだけを追加していきます。
EC2 インスタンスを 1 台起動し、最初は SSH(22番)だけを許可したセキュリティグループで Web サーバーを立てる。HTTP(80番)を許可する前はブラウザから表示できないことを確認したうえで、ルールを 1 つ追加してブラウザから表示できる状態に変える。
穴を開ける前と、開けたあと
同じ EC2 インスタンス・同じ Web サーバーのまま、セキュリティグループのインバウンドルールだけを変えて、ブラウザからの見え方がどう変わるかを比べます。
SSH だけが開いた壁
- ブラウザでアクセス → 応答なし(タイムアウト)
- インバウンドで許可されているのは SSH(22) だけ
- 壁の外からは、中の Web サーバーの存在が見えない
SSH と HTTP、2 つの穴が開いた壁
- ブラウザでアクセス → 作成した Web ページが表示される
- インバウンドで SSH(22) と HTTP(80) の両方を許可
- 必要な通信だけを選んで、穴を追加している
要件
以下の要件を満たし、「HTTP を許可する前は見えず、許可すると見える」という変化を自分の手で確認してください。
| No | 要件 |
|---|---|
| 1 | VPC を 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」で許可する状態にする。 |
| 4 | EC2 インスタンスを 1 台起動する。AMI は Amazon Linux 2023、インスタンスタイプは無料利用枠対象(例:t2.micro または t3.micro)とする。手順 2 のパブリックサブネットに配置し、パブリック IP アドレスの自動割り当てを有効にし、手順 3 のセキュリティグループを設定する。 |
| 5 | SSH で接続し、Web サーバー(httpd)をインストール・起動する。この時点で、ブラウザからインスタンスのパブリック IP にアクセスしてもページが表示されないことを確認する。 |
| 6 | セキュリティグループのインバウンドルールに HTTP(80) を追加する。送信元は自由に選んでよい(例:誰でも見られるようにする場合は 0.0.0.0/0、自分の PC だけに絞る場合は「マイ IP」)。追加後、ブラウザで再度アクセスし、ページが表示されることを確認する。 |
構築の進め方
「壁の外側(ネットワーク)を作る → 壁そのもの(セキュリティグループ)を作る → 中にサーバーを立てる → 穴が無い状態を確認する → 穴を 1 つ開ける」という順番で進みます。各ステップで「なぜそうするのか」を意識してみてください。
-
VPC を作成する
VPC コンソールで「VPC を作成」→「VPC のみ」を選び、名前タグを
sg-demo-vpc、IPv4 CIDR ブロックを自由に決めた値(例:10.0.0.0/16)で作成します。まずは土台となるネットワークセキュリティグループは VPC の中で動く仕組みです。壁そのものを作る前に、壁を立てる場所となる VPC を用意します。
-
インターネットゲートウェイを作成してアタッチする
「インターネットゲートウェイを作成」で名前タグ
sg-demo-igwのものを作り、作成後に「VPC にアタッチ」から手順 1 の VPC に接続します。アタッチを忘れがちな理由インターネットゲートウェイは、作成しただけでは何もしてくれません。VPC にアタッチして初めて、インターネットとの出入り口として機能します。
-
パブリックサブネットとルートテーブルを用意する
サブネットを 1 つ作成します(名前タグ
sg-demo-public、CIDR は VPC の範囲内で自由に、例:10.0.0.0/24)。続けてルートテーブルを作成し(名前タグsg-demo-public-rt)、ルートに0.0.0.0/0→ 手順 2 のインターネットゲートウェイを追加し、このサブネットに関連付けます。「パブリック」を決めているのはルートテーブルサブネットが「パブリック」と呼ばれるのは、インターネットゲートウェイへの経路を持つルートテーブルが関連付けられているからです。この関連付けがないと、インターネットとやり取りできません。
-
セキュリティグループを作成する(最初は SSH のみ)
EC2 コンソールの「セキュリティグループ」から、名前を
sg-demo-web、説明を自由に入力して作成します。VPC は手順 1 で作成したものを選び、インバウンドルールに タイプ:SSH、送信元:マイ IP を 1 つだけ追加します。インバウンドルール
SSH / TCP / 22送信元:マイ IPHTTP / TCP / 80まだ追加していない↳この時点では SSH の穴しか開いていません
「マイ IP」を選ぶ理由SSH は管理用の入り口です。誰からでも接続できる状態にすると、総当たり攻撃の対象になりやすいため、まずは自分の IP アドレスからだけ許可しておきます。
-
EC2 インスタンスを起動する
「インスタンスを起動」で名前タグを
sg-demo-web-server、AMI に Amazon Linux 2023、インスタンスタイプに無料利用枠対象のもの(例:t2.micro)を選びます。新しいキーペアsg-demo-keyを作成してダウンロードし、ネットワーク設定で手順 3 のサブネットとパブリック IP の自動割り当て「有効」、セキュリティグループに手順 4 のsg-demo-webを選んで起動します。キーペアの .pem ファイルは失くさないダウンロードできるのはこの 1 回だけです。分かりやすい場所(例:ユーザーフォルダ直下)に保存しておきましょう。
-
SSH 接続して Web サーバーをインストールする
インスタンスが「実行中」になったら、パブリック IPv4 アドレスを確認し、PowerShell から SSH 接続します。接続できたら、Web サーバー(Apache)をインストールして起動します。
# 鍵ファイルの権限を自分のみ読み取り可に絞る 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>
# パッケージを更新し、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
-
ブラウザでアクセスし、見えないことを確認する
ブラウザで
http://<インスタンスのパブリックIP>/にアクセスします。Web サーバーは動いているのに、ページが読み込めずタイムアウトすることを確認します。これは正常な状態Web サーバー自体は動いていますが、セキュリティグループのインバウンドルールに HTTP(80) の許可が無いため、通信が壁の外で止められています。「サーバーが動いていること」と「外から見えること」は別ものだと分かる場面です。
-
HTTP(80) のルールを追加し、見えることを確認する
セキュリティグループ
sg-demo-webの「インバウンドルール」タブから「ルールを編集」→「ルールを追加」で、タイプ:HTTP、送信元:自由に選んだ値(例:0.0.0.0/0)を追加して保存します。もう一度同じアドレスにブラウザでアクセスし、作成したページが表示されることを確認します。穴を 1 つ開けただけで変わるサーバー側の設定は何も変えていません。セキュリティグループに HTTP(80) のルールを 1 行追加しただけで、外から見える状態に変わったことを確認しましょう。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「ルールを追加したはずなのに、変化がない」
確認したい点がいくつかあります。①追加したルールのタイプが HTTP(ポート80・プロトコル TCP)になっているか、②SSH で入り直し、sudo systemctl status httpd で active (running) になっているか、③アクセスしているアドレスが、EC2 の現在のパブリック IPv4 アドレスと一致しているか(再起動などで変わっていないか)を見直してみてください。
「ssh コマンドを打っても反応がない、または急に失敗するようになった」
多くの場合、セキュリティグループの SSH(22) の送信元に指定した「マイ IP」と、今の自分の IP アドレスがずれていることが原因です。自宅の Wi-Fi を再接続したり、別のネットワークに移動したりすると IP アドレスが変わることがあります。インバウンドルールを編集し、「マイ IP」を選び直して現在の IP に更新してみてください。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。EC2 コンソールとブラウザで、次を順に確かめましょう。
- EC2 インスタンスの詳細画面「セキュリティ」タブに、作成したセキュリティグループ(例:
sg-demo-web)が表示されている。 - そのセキュリティグループの「インバウンドルール」タブに、SSH(22) と HTTP(80) の 2 行が並んでいる。
- ブラウザで
http://<パブリックIPv4アドレス>/を開くと、手順 6 で作成したページが表示される。 - EC2 の「ネットワーキング」タブで確認できるパブリック IPv4 アドレスと、ブラウザでアクセスしたアドレスが一致している。
- 同じキーペアで SSH 接続も引き続きでき、Web サーバーとしての公開と、管理用の SSH 接続が両立できている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- なぜセキュリティグループは、新規作成した時点で「インバウンドは何も許可しない」状態から始まるのでしょうか。もし逆に「最初から全部許可」だったら、何が起きるか考えてみましょう。
ヒント
インターネットには、開いているポートを探して接続を試みる通信が常に存在します。「必要な穴だけを自分で開ける」というホワイトリスト方式と、「全部開けてから危険なものだけ塞ぐ」というブラックリスト方式、どちらが安全に保ちやすいか比べてみましょう。 - 今回は HTTP(80) の送信元を自由に選べるようにしましたが、SSH(22) の送信元は「マイ IP」のままにしました。もし SSH の送信元も
0.0.0.0/0(どこからでも)にしてしまうと、どんなリスクがあるでしょうか。ヒント
SSH は鍵さえあればサーバーの中に入れる、管理者向けの入り口です。誰からでも接続を試みられる状態にすると、総当たりでの認証試行の対象になりやすくなります。「見せてよい通信」と「絞るべき通信」の違いという観点で考えてみましょう。 - セキュリティグループのルールを削除すると、そのルールで許可されていた今まさに確立している通信(例えば開いたままの SSH セッション)はどうなると思いますか。実際に試して確かめてみましょう。
ヒント
セキュリティグループは「ステートフル」だと言われます。まずは自分の予想を立ててから、実際にルールを一時的に変更し、既存の接続がどうなるかを観察してみましょう。公式ドキュメントの「セキュリティグループのルール」のページも手がかりになります。
後片づけ
作ったものを片づけるところまでが一連の流れです。作成した順とは逆の順番で、依存関係のあるものから削除していきます。
- EC2 インスタンスを終了する:EC2 コンソールでインスタンスを選択し、「インスタンスの状態」→「インスタンスを終了」を選ぶ。
- キーペアを削除する(任意):不要であれば「キーペア」から
sg-demo-keyを削除し、手元の.pemファイルも整理する。 - セキュリティグループを削除する:インスタンスの終了後、
sg-demo-webを選択して削除する。 - サブネットを削除する:VPC コンソールでサブネット
sg-demo-publicを削除する。 - ルートテーブルを削除する:自作したルートテーブル
sg-demo-public-rtを削除する(デフォルトのルートテーブルは残る)。 - インターネットゲートウェイをデタッチ・削除する:
sg-demo-igwを VPC からデタッチしたあと、削除する。 - VPC を削除する:最後に
sg-demo-vpcを削除する。
削除するのは、自分で名前を付けたものだけ
一覧には最初から用意されている「デフォルト VPC」や「デフォルトセキュリティグループ」も並んでいます。今回自分で付けた名前タグ(sg-demo- から始まるもの)だけを選んで削除してください。デフォルトセキュリティグループはそもそも削除できない仕様になっています。
コストに関する注意: EC2 インスタンスは起動している時間に応じて課金されます(t2.micro・t3.micro などは無料利用枠の対象になる場合があります)。アタッチされるEBS ボリュームにも保存容量に応じた料金がかかります。一方、VPC・サブネット・インターネットゲートウェイ・ルートテーブル・セキュリティグループ自体の利用に料金はかかりません。検証が終わったら、上の「後片づけ」に沿って忘れずに削除しましょう。最新の料金は AWS の公式料金ページで確認してください。