- セキュリティグループについて調べているけど専門用語が多くてわかりにくい
- セキュリティグループの見方がわからない
- セキュリティグループとネットワークACLがよく似ていて違いや使い分け方がわからない
セキュリティグループに関して、このように悩んでいませんか?
AWSを利用する上で、セキュリティグループを理解することは避けては通れません。
また、セキュリティグループを理解しないまま適当な設定でAWSを利用していると、悪意のある攻撃者からAWSを不正利用され、高額な利用料が請求されてしまうなんてこともありえます…。
そこで、この記事では、現役のAWSエンジニアの私が、セキュリティグループの基本的な知識から、混同されがちなネットワークACLとの違いや使い分けに関してまで初心者にもわかりやすく解説しています。
この記事を読めば、セキュリティグループについて理解でき、今後のAWS学習を効率的に進めることができるようになりますよ。
初心者にもわかりやすいように、イラストを豊富に使ってセキュリティグループについて解説しています!
以下の記事では、AWSを無料で勉強する方法をまとめているので、あわせて参考にしてください。
上記の記事でも紹介していますが、侍テラコヤ
それでは、さっそくセキュリティグループについて解説していきます!
この記事の内容はこちらの公式サイトと以下の書籍を参考にしています。
セキュリティグループとは
まずは、セキュリティグループの概要や料金について説明します。
セキュリティグループの概要と目的
セキュリティグループとは、「誰からの」「どんな」通信なら受け入れるのかを決めたルールです。
EC2などのAWSリソースに対して通信が入ってきたときに、その通信は受け入れてもOK?NGか?を判定する門番をイメージするといいでしょう。
「EC2など」と書いたのは、EC2以外にもさまざまなAWSリソースでセキュリティグループは使用されるからです。
毎回「EC2など」と記載するのもくどいので、この記事ではEC2に対してセキュリティグループを使用するという前提で話を進めます。
例えば、EC2をインターネットに公開している場合、世界中の誰もがあらゆる方法でそのEC2にアクセスすることができてしまいます。
このままだと、悪意のある誰かが、不正な方法でアクセスすることもできてしまいますよね。
そこで、セキュリティグループを使って、EC2が受け入れることができる通信に条件をつけることで、本来とは違う方法でアクセスされるのを防ぐことができます。
また、逆にEC2から「誰に対して」「どんな」通信が出ていくことがでいるのか?もセキュリティグループで管理されます。
これにより、外部に対して変な通信を送信してしまうことを防ぐことができます。
このように、セキュリティグループを正しく利用することで、AWSで構築したサービスのセキュリティを強化することができます。
一般的に、このような「この通信は許可されているのか?されていないのか?」を判断し、アクセスの許可・拒否判定を行うものをファイアウォールと呼びます。
つまり、セキュリティグループは、AWSのファイアーウォールとしての機能を持ちます。
ファイアーウォールを利用することで、インターネットに公開されている場合でもアクセス相手を制限できるのでセキュリティ的に安全です。
ファイアーウォールは、AWSに限らずインターネットに公開されているサーバーには必ずといっていいほど設定されています。
インバウンドルールとアウトバウンドルール
さきほど、セキュリティグループには「EC2インスタンスなどへ入ってくる通信に対する設定」と「EC2から出ていく通信に対する設定」の2種類のルールがあることを説明しました。
これらをそれぞれインバウンドルール、アウトバウンドルールと呼びます。
入ってくる方が「イン」で、出ていく方が「アウト」です。
例えば、ユーザーのPCからEC2インスタンスへアクセスする場合、このユーザーPCからの通信を許可するインバウンドルールが必要です。
また、EC2インスタンスからインターネットへアクセスする場合、インターネットへの通信をアウトバウンドルールで許可する必要があります。
ところで、通信というのは基本的に、手紙のように自分と相手の間を行ったり来たりします。
例えば、あなたがGoogleで何かを検索する場合、まずはあなたのPCからGoogleにアクセスして、GoogleはあなたのPCにその結果を返信します。
GoogleとあなたのPCの間で何度も通信が行き来しているわけです。
ここで、セキュリティグループはEC2から「出ていく」通信のルールと、EC2に「入ってくる」通信のルールがあることを思い出してください。
通信がお互いを行き来することを考えると、インバウンドとアウトバウンドの両方に、その相手との通信を許可する設定が必要ですよね。
しかし、セキュリティグループでは、EC2から出ていく通信をインバウンドルールで許可していれば、その返信はアウトバウンドルールで許可していなくてもEC2に入ってくることができるという性質があります。
逆も同じで、EC2に入ってくる通信がアウトバウンドルールで許可されていれば、その返信はインバウンドルールで許可していなくてもEC2から出ていくことが可能です。
これは、セキュリティグループの特徴の一つです。
ただし、あくまでも「出ていった通信に対する返信」(または「入ってきた通信に対する返信」)が暗黙的に許可されるだけです。
インバウンドルールで設定したすべての通信が、アウトバウンドルールで許可していなくても出ていくことができるというわけではありませんので、ご注意ください。
ステートフルとステートレスとは?
上記のような、「出ていく通信を許可すれば、その返信はルールで許可しなくてもOK」な性質を専門用語で「ステートフル」と呼びます。
ステートフルという言葉まで覚える必要はありませんが、公式サイトや書籍などで見かけた場合は、この内容を思い出してください。
ちなみに、ステートフルの対義語は「ステートレス」です。
ステートレスの場合は、インバウンドルールとアウトバウンドルールの両方で通信を許可しないと、やりとりができません。
後ほど説明するネットワークACLは、ステートレスの性質です。
デフォルトのセキュリティグループ
セキュリティグループには、デフォルトのセキュリティグループというものがあります(デフォルトのセキュリティグループの設定内容については後述します)。
デフォルトのセキュリティグループは、新規でVPCを作成するときに一緒に作成されます。
つまり、VPCを新規作成するたびに自動でデフォルトのセキュリティグループが作成されるので、自分で毎回セキュリティグループを作成する必要がありません。
また、EC2などを新規で作成するときにセキュリティグループを指定しない場合は、デフォルトのセキュリティグループが適用されます。
このように、デフォルトのセキュリティグループは自動で作成されるので便利ですが、実際にはあまり使用せずに、自分で必要に応じたセキュリティグループを作成することをおすすめします。
デフォルトのセキュリティグループ自体を変更することもできますが、できるだけ手を加えずにそのまま放っておくのがいいでしょう。
なぜなら、セキュリティグループを指定せずに作成されたEC2などのリソースには、デフォルトのセキュリティグループが適用されるからです。
例えば、デフォルトのセキュリティグループを修正してすべての通信を拒否するようにしている場合に、セキュリティグループを指定するのを忘れて作成したEC2が通信できなくて原因がわからないということにもなりかねません。
ちなみにデフォルトのセキュリティグループの削除はできません。
デフォルトのセキュリティグループは、ちょっとだけ試しにAWSを使いたい場合などでしか使わない「おまけ」のようなものだと思ってもらってOKです。
デフォルトのセキュリティグループの名前は「default」になるので、マネジメントコンソール上ですぐに確認することができますよ([Name]列ではなく[セキュリティグループ名]列であることに注意)。
ちなみに、デフォルトのVPCには最初からデフォルトのセキュリティグループが作成されています(デフォルトのVPCに関しては「【AWS】VPCとは?イラスト付きで初心者にもわかりやすく解説!」を参照してください)。
デフォルトのセキュリティグループの設定内容
デフォルトのセキュリティグループにはどんなルールが設定されているのか一応説明しておきます。
まず、デフォルトのセキュリティグループのアウトバウンドルールでは、すべての通信が出ていくことが許可されています。
なので、出ていく通信に関しては制限はありません。
インバウンドルールに関しては少しややこしいのですが、同じデフォルトのセキュリティグループが適用されたAWSリソースからの通信のみが許可されています。
このように、「同じセキュリティグループが適用されたAWSリソースからの通信を許可する」設定に関しては、「セキュリティグループの見方」でも詳しく説明するので、今はそんなもんなんだなくらいに思っておいてOKです。
セキュリティグループの制限
セキュリティグループには、作成できる数や、ひとつのセキュリティグループあたりのルールの数など、いくつかの制限があります。
AWSでは、このような数の上限をクォータと呼びます。
例えば、1つのリージョンあたりのセキュリティグループの数は2,500個までが上限です。
クォータは、上限緩和申請を行うことで上限を緩和できるので、絶対その数までしか作れないというわけでもありません。
具体的なクォータの値こちらの公式サイトをご確認ください。
見てみるとわかりますが、最初からある程度十分な上限が設けられているのであまり気にする必要はありません。
セキュリティグループの料金
セキュリティグループの利用に追加料金は発生しません。
セキュリティグループは利用するというよりも、あくまでEC2などの設定のひとつですので、当たり前といえば当たり前です。
セキュリティグループの作成
セキュリティグループの概要がわかったところで、セキュリティグループの作成に関して説明します。
セキュリティグループを作成する際は、どのVPCに作成するかを選択する必要があります。
作成したセキュリティグループは、そのVPC上のリソース(EC2など)でのみ使用可能です。
同じセキュリティグループを別のVPCのEC2などで利用した場合は、同じものをそのVPCで作る必要があるのでご注意ください。
セキュリティグループは、作成した時点で以下の設定となっています。
- インバウンドルール:なし
- アウトバウンドルール:すべての通信を許可
つまり、外部からEC2へ入ってくる通信はすべて拒否するが、EC2から出て行く通信はすべて許可するといった設定です。
セキュリティグループ作成後は、これらの条件をカスタマイズして、必要な設定を追加してください。
ちなみに、EC2では、複数のセキュリティグループを関連づけることができるので、1つのセキュリティグループにすべての設定を記載する必要はありません。
セキュリティグループの見方
続いて、セキュリティグループの見方について説明します。
セキュリティグループには、以下の設定項目があります。
- タイプ
- プロトコル
- ポート範囲
- ソース(インバウンドルールのみ)
- 送信先(アウトバウンドルールのみ)
- 説明
[説明]は、セキュリティグループの説明を自分で書くだけなので、それ以外の項目について詳しく解説します。
また、以下説明中で、[タイプ]のように[]でくくった部分は、設定項目を表していると思ってください。
タイプ、プロトコル、ポート範囲
セキュリティグループの[タイプ]、[プロトコル]、[ポート範囲]について説明します。
[タイプ]は、「どんな通信か?」を指定する項目です。
例えば、「メールの送受信」や「Web情報の送受信」、「SSHによるリモート接続」などがあります。
実際のセキュリティグループでは、これらをプロトコル名で指定します。
プロトコルというのは、先ほどの「どんな通信か?」をルール化したものです。
郵便で考えると、「定型郵便」とか「レターパック」などの郵便の種類に該当します。
基礎的なIT知識の話になるのでここでは詳しく説明しませんが、例えば「メールの送受信はSMTP」、「Web情報の送受信はHTTP」などのように、通信内容ごとに名前が付けられていると思ってください。
セキュリティグループでは、このようなSMTPだとかHTTPなどの名前を指定します。
初心者の方であれば、まずは自分のPCからEC2にログインするために、SSHプロトコルのルールを追加することがよくありますね。
次に[プロトコル]ですが、ここは上記の[タイプ]を指定すると自動的に埋まるのであまり気にしなくてOKです。
[タイプ]を[カスタムプロトコル]にしたときだけ入力できるようになりますが、初心者の方が使うことはまずないでしょう。
最後に[ポート範囲]ですが、ネットワークの通信では、IPアドレスで相手を特定した後、さらにポート番号という番号を用いて通信を行います。
例えば、市役所などを利用するときに、「戸籍関係なら1番窓口」「子育て関係なら5番窓口」のように、役割ごとに番号があると思ってください。
このように、「◯◯なら△番」みたいにプロトコルによって番号がある程度決められているので、ここの[ポート範囲]も[タイプ]を指定した時点で自動で埋まります。
[タイプ]を[カスタムTCP]とか[カスタムUDP]のような[カスタム◯◯]にすると入力できるようになりますが、これも初心者は気にしなくていいです。
初心者の方は、SSHは22番ポートを使う、くらいは頭の片隅においておいてもいいですね。
ソース、送信先
セキュリティグループは、インバウンドルールで「誰からの通信を許可するか」を設定し、アウトバウンドルールで「誰への通信を許可するか」を設定します。
このインバウンドルールにおける「誰からの」を指定するのが「ソース」で、アウトバウンドルールにおける「誰への」を指定するのが「送信先」です。
これらはどちらも「通信相手」を表すものなので、まとめて解説します。
[ソース]または[送信先]は、IPアドレスで指定する方法と、セキュリティグループのIDで指定する方法の2種類の方法があるので、それぞれ詳しく解説します。
IPアドレスを指定する場合
[ソース]または[送信先]は、以下の4種類から選ぶことができます。
- カスタム
- Anywhere-IPv4
- Anywhere-IPv6
- マイIP
このうち、[Anywhere-IPv4]と[Anywhere-IPv6]は、すべてのIPアドレス(誰でもOK)を表します。
[Anywhere-IPv4]と[Anywhere-IPv6]は、IPアドレスのバージョンが違うだけですが、よくわからない場合はとりあえず[Anywhere-IPv4]を選んでおけばいいでしょう。
[マイIP]を選ぶと、現在マネジメントコンソールにアクセスしている自分自身のIPアドレスが自動的に入力されます。
自分のPCのみの通信を許可したい場合に利用すると便利ですね。
最後に、[カスタム]ですが、自分でIPアドレスを入力します。
このとき、IPアドレスはCIDRという表記法で記載する必要があります。
CIDRについては、「【AWS】VPCとは?イラスト付きで初心者にもわかりやすく解説!」の「CIDRとは」で詳しく解説しているのでご参照ください。
例えば、CIDRが10.0.0.0/24のサブネットからの通信のみを許可したい場合は、[ソース]を[カスタム]にして、10.0.0.0/24を指定します。
ちなみに、[Anywhere-IPv4]を選択した場合のCIDR表記は、すべてのIPアドレスを表す0.0.0.0/0となります([Anywhere-IPv6]の場合は::0/0)。
セキュリティグループIDを指定する場合
セキュリティグループのインバウンドルールの[ソース](アウトバウンドルールの場合は[送信先])には、IPアドレス以外にもセキュリティグループのIDを指定することができます。
これは、この[ソース]に指定されたセキュリティグループIDが関連づけられたEC2からの通信のみを許可するという意味です。
例えば、以下のようなルールの場合、sg-22222222222222222が関連づけられたEC2からのSSH通信のみを許可します。
ソース | プロトコル | ポート範囲 |
---|---|---|
sg-22222222222222222 | TCP | 22 |
なぜ、わざわざEC2のIPアドレスではなく、EC2に関連づけられたセキュリティグループのIDを指定するのでしょうか?
実は、EC2のIPアドレスは固定ではなく、停止・起動するたびに変わってしまいます(固定化する方法も一応ありますが、今回は割愛)。
そのため、EC2のIPアドレスを指定した場合、そのEC2のIPアドレスが変わるたびにセキュリティグループを修正する必要がありますが、それは現実的ではありません。
「EC2のIPアドレスは変わったとしても、必ずサブネットのCIDR範囲に入るから、サブネットのCIDR範囲を指定すればいいのでは?」と思われる方もいらっしゃるかもしれません。
しかし、その場合だと、そのサブネットの他のEC2のIPアドレスも含まれてしまうので、サブネット内のすべてのEC2からの通信が許可されてしまいます。
一方で、特定のEC2にのみあるセキュリティグループを関連づけておいて、そのセキュリティグループのIDをルールに設定すれば、特定のEC2のみからの通信を許可することができます。
このように、特定のEC2などからの通信を許可したい場合は、IPアドレスではなくセキュリティグループのIDを指定するようにしましょう。
セキュリティグループとネットワークACLの違い
AWSで「どの通信を許可するか?」を定義するルールとして、セキュリティグループの他にネットワークACL(アクセスコントロールリスト)というものがあります。
ネットワークACLも、セキュリティグループと同じようにサブネット内の通信の許可ルールを定義することができます。
セキュリティグループとネットワークACLは似ているため混同してしまいがちですが、両者の違いと使い分けをわかりやすく説明するので安心してください。
まずは、セキュリティグループとネットワークACLの共通点と相違点を以下にまとめます。
共通点 | 相違点 |
---|---|
インバウンドルールとアウトバウンドルールがある ルールにプロトコルやポート番号、IPアドレスなどを指定する デフォルトのネットワークACLが作成される 追加料金なし | EC2などのリソースではなく、サブネット全体に適用する ルール番号を指定する 許可ルールに加え、拒否ルールも指定できる ステートレス |
では、これらの共通点と相違点について説明していきますね。
セキュリティグループとネットワークACLの共通点
まずはネットワークACLについてイメージしやすいように、セキュリティグループとの共通点を説明します。
セキュリティグループとネットワークACLの共通点は以下の通りです。
- インバウンドルールとアウトバウンドルールがある
- ルールに[タイプ]、[プロトコル]、[ポート範囲]、[送信元](または[送信先])を指定する([送信元]はセキュリティグループの[ソース]と同じです)
- VPC作成時にデフォルトのネットワークACLが作成される
- 追加料金なし
ネットワークACLは、セキュリティグループと同様に、インバウンドルールとアウトバウンドルールがあります。
ルール定義の方法もセキュリティグループとほぼ同じで、プロトコルやポート番号、IPアドレスなどを指定します。
ただし、ネットワークACLのルールには、プロトコルやポート番号、IPアドレス以外にセキュリティグループと異なる項目がいくつかあるので、それらは相違点の部分で説明しますね。
また、ネットワークACLもVPC作成時にデフォルトのネットワークACLが作成されます。
デフォルトのネットワークACLは、すべての通信を許可するインバウンドルールとアウトバウンドルールのみが設定されています。
セキュリティグループと同様に、デフォルトのネットワークACLのルールだと都合が悪い場合は、デフォルトのネットワークACLを編集するのではなく、自分で作成したネットワークACLを使用しましょう。
その他の共通点としては、ネットワークACLもセキュリティグループと同様に追加料金なしで無料で使用できます。
セキュリティグループとネットワークACLの相違点
セキュリティグループとネットワークACLの相違点は以下の通りです。
- EC2などのリソースではなく、サブネット全体に適用する
- ルール番号を指定する
- 許可ルールに加え、拒否ルールも指定できる
- ステートレス
セキュリティグループがEC2などに適用させるのに対し、ネットワークACLはサブネット全体に適用されます。
つまり、同一サブネットのEC2には、すべて同じネットワークACLが適用されます。
その上で、EC2インスタンスごとのセキュリティグループが適用されます。
ネットワークACLとセキュリティグループの二重の壁のようなイメージですね。
また、セキュリティグループは許可ルールだけですが、ネットワークACLは許可ルールに加えて拒否ルールも設定できます。
「IPアドレスxx.xx.xx.xxからのSSH通信は拒否します」といったイメージです。
さらに、ネットワークACLのルールには、優先度のような番号を設定することができ、番号が早いルールが優先されます。
例えば、番号が1と100のルールがあれば、1のルールが優先されます。
ちなみに、番号がアスタリスク(*)のルールは、その通信がどの番号のルールとも一致しない場合に適用されます。
さらに、ネットワークACLはセキュリティグループと違い、インバウンドルールで許可されている通信の返信であったとしても、アウトバウンドルールで許可していなければ出て行くことができません(ステートレス)。
セキュリティグループとネットワークACLの使い分け
セキュリティグループとネットワークACLの共通点と相違点について説明しました。
違いはありますが、両者とも「どんな通信を許可するか?」ということを設定したルールというおおまかな役割は同じです。
では、セキュリティグループとネットワークACLはどのように使いわけるといいのでしょうか?
私は、「基本的にはセキュリティグループで細かい設定をする」のがいいと思います。
実務でも、セキュリティグループをいじることは多いですが、ネットワークACLを触ることはほとんどありません。
セキュリティグループを基本的に使用するべき理由は、以下の通りです。
- ネットワークACLはサブネットに出入りする通信に対して管理するため、サブネット内の通信(同一サブネット内のEC2同士の通信など)を管理できない
- セキュリティグループは、送信元・送信先をセキュリティグループIDで指定できるため、特定のEC2からの通信を許可できるし、IPアドレスの変化にも対応できる
- セキュリティグループはステートフルで、戻りの通信の許可設定をする必要がない(特に、戻りの通信はポート番号がランダムに振られることがあり、戻りの通信まで細かく設定するのは面倒)
このように、セキュリティグループを利用する方が何かと便利です。
ネットワークACLを使う場面としては、サブネット全体で拒否したい通信があるときなどが考えられますね。
まとめ
以上、セキュリティグループとネットワークACLについて説明しました。
セキュリティグループは、「EC2などのリソースに出入りする通信のうち、どんな通信を許可するか?」を定義したルールです。
この「どんな通信」というのは、プロトコルやIPアドレスを用いて指定します。
また、セキュリティグループは、セキュリティグループIDを対象としたルールも定義可能です。
この場合は、そのセキュリティグループIDが適用されているEC2からの通信が対象になり、特定のEC2からの通信を許可したい場合に利用できます。
また、ネットワークACLもセキュリティグループと同様に通信の許可設定を定義することができます。
セキュリティグループとネットワークACLの共通点と相違点は以下の通りです。
共通点 | 相違点 |
---|---|
インバウンドルールとアウトバウンドルールがある ルールにプロトコルやポート番号、IPアドレスなどを指定する デフォルトのネットワークACLが作成される 追加料金なし | EC2などのリソースではなく、サブネット全体に適用する ルール番号を指定する 許可ルールに加え、拒否ルールも指定できる ステートレス |
ネットワークACLよりも、セキュリティグループの方が便利なことが多いので、基本的にはセキュリティグループを使って通信の管理を行うのがいいでしょう。
なお、 セキュリティグループに関しては侍テラコヤ
\侍テラコヤの無料プランは無期限だから今すぐ登録してもOK!/
メールアドレスだけで10秒で登録できちゃいます!
記事の中で不明点や指摘などがあれば、気軽にコメントやお問い合わせください。
Twitter/X(https://twitter.com/enjunior_blog)もやっているので、DM等も歓迎です!
それでは、引き続きAWSの勉強がんばりましょう!
コメント