これまであまり物理的なネットワークに触れてこなかったエンジニアを対象に、AWSを用いてネットワークの基礎知識を解説する連載。今回は、パケットフィルタリングによるネットワークセキュリティについて解説し、「ネットワークACL」と「セキュリティグループ」の設定を通して、AWSでパケットフィルタリングを行う方法を示す。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
これまであまり物理的なネットワークに触れられてこなかったSEやサーバ管理者、情シスなどの方を対象にネットワークの基本を「Amazon Web Services」(AWS)を用いて解説する本連載「AWSで学ぶクラウド時代のネットワーク基礎知識」。
連載第6回の今回は、ネットワークレベルでのセキュリティの実現方法を解説します。L3/L4レベルで通信をフィルタリングする方法を紹介した後、AWSのネットワークセキュリティの機能で通信フィルタを構築する方法を紹介します。
これまでの連載でInternet Protocol(IP)を利用したネットワーク通信の方法を紹介しました。インターネットのネットワークレイヤーはIPプロトコルが利用されており、送信元が宛先IPアドレスを含んだIPパケットを送付すると、インターネットを越えてパケット(データ)がルーティングされ、容易に通信できることを説明しました。
これは便利な半面、端末のIPアドレスを特定できるとインターネット上のどこからでも攻撃を仕掛けることもでき、危険にさらされてしまいます。ここからはネットワークレイヤーでのセキュリティ対策を紹介します。
通信によるデータの送受信を宅配便に例えます。あなたは配送業者から荷物を受け取る際、必ず送付元の方の名前を確認すると思います。知人からの荷物なら特に疑うことはなく受け取ると思います。しかし、もし聞いたことない会社や不明な送付元からの荷物なら受け取りを拒否するでしょう。
IPネットワークの世界でも同様で、主に送信元のIPアドレスを判断基準としてパケットを受信する/拒否する、あるいは転送する/破棄する「パケットフィルタリング」という機能があり、怪しいパケットを破棄することによって危険な通信から端末を守ることができます。
このパケットフィルタリング機能はルーターやスイッチなどの一般的なネットワーク機器なら利用できます。機能名はメーカーによって異なるものの、一般的には「ACL」(Access Control List)という名前で実装されています。このパケットフィルタリング機能を主軸にネットワークセキュリティに特化した製品が「ファイアウォール」です。WindowsやLinuxなどの端末でも一般的に「ファイアウォール」という名称でパケットフィルタリングができるようになっています。
パケットフィルタリングの方法は次の通りです。
まずは、あらかじめ通信を許可(permit)するIPのセグメントおよび拒否(Deny)するセグメントをリスト形式で登録しておきます。次に、転送されてきたパケットを受信するタイミング(In)、あるいは送信するタイミング(Out)でリストの1エントリ目から順に評価し、マッチするセグメントのアクション(Permit/Deny)を実施します。
もし全エントリを評価してもマッチしない通信は通常はDeny扱い(暗黙のDeny)となり、ドロップ(破棄)されます。
ただしIPアドレスだけで制御する場合、特定のネットワーク/端末間の全ての通信を許可/拒否するという操作しかできません。
特定の端末による特定のサービスとだけ通信を許可し、その端末からでも特定のサービス以外の通信をフィルタリングするには、IPアドレスに加えてトランスポートレイヤーのTCP(Transmission Control Protocol)/UDP(User Datagram Protocol)プロトコルヘッダにある送信元ポート番号、宛先ポート番号も転送/破棄の判断基準とします。
注意しておきたいのは、通常、通信は一方向ではなく双方向ということです。
ネットワークレイヤーにおけるパケットフィルタリングの動作はあくまでも転送されてきたパケットに対して行われるものであり、もし「端末Aから端末B行きの通信」を許可して通したとしても「端末Bから端末Aへの戻り通信」が拒否されて通らなければ通信は成り立ちません。そのため、通信を成立させるには、“行き”と“戻り”の両方のパケットを許可する必要がありますが、IPアドレスおよびポート番号の並びが逆になる“戻り”の通信を自動で許可するパケットフィルタリング機能も存在します。
このように、“戻り”の通信を自動で許可する動作を「ステートフル」といい、“戻り”の通信を自動で許可しない動作を「ステートレス」といいます。一般に、ネットワーク機器で利用されるACLではハードウェアで処理されることからステートレスで動作するものが多くなっています。アプリケーションレイヤーまで認識するファイアウォールは通常ステートフルで動作します。
ここからはAWS環境におけるネットワークセキュリティ機能、つまりパケットフィルタリング機能を紹介します。
まずAWS環境においてパケットフィルタリング機能を提供するサービスは次の通りです。
AWSサービス | 対象通信 | ステート | 対応アクション |
---|---|---|---|
ネットワークACL(以下、NACL) | サブネット間 | ステートレス | Allow/Deny |
セキュリティグループ | インスタンス | ステートフル | Allowのみ |
AWS Network Firewall | ファイアウォールサブネットを経由させる通信 | ステートレス/フル両対応 | パス/ドロップ/アラート |
基本の対策としてはセキュリティグループおよびNACLを利用します。これらはそれぞれインスタンス(厳密にはネットワークインタフェース)に出入りする通信およびサブネット間の通信をフィルタリングする機能です。規模が大きくなると個々のインスタンスやサブネット間の通信を管理するのは難しくなるので、統合的に管理する場合、もしくはIPアドレスだけでなくアクセス先のドメイン名でもフィルタリングする場合、Network Firewallを利用します。
なお前項では、通信のアクションとしてPermit/Denyと記載しましたが、セキュリティグループはホワイトリスト形式で通信を許可する対象の登録となり、明確なアクションの指定はなく、NACLではPermitではなく「Allow」(DenyはDenyのまま)となります。Network FirewallはパスがPermit、ドロップがDenyに対応しています。また通信を転送する(パスの動作)が該当通信の発生を報告する「アラート」という操作も存在します。
注意点としては、セキュリティグループおよびNetwork Firewallはステートフルのパケットフィルタリングが可能なので、“行き”の通信を許可すれば、自動で“戻り”の通信も許可させることができますが、NACLはステートレスのパケットフィルタリングとなり、“行き”の通信を許可した場合は必ず“戻り”の通信も許可されるように設定する必要があるということです。NACLでサブネット間通信を制御する場合、その点をしっかり注意する必要があります。
ここからは、NACLとセキュリティグループでパケットフィルタリングを動作させる手順を紹介します。説明に利用する環境は次の通りです。
サブネット「Subnet01」「Subnet02」にはNACLとして「NACL01」「NACL02」を、インスタンス「Instance01」「Instance02」にはセキュリティグループとして「SG01」「SG02」をひも付けています。全てを許可し、特にフィルタリングの設定はしていない状態にしています。なお、NACLにはルール番号が「*」の全通信Denyのエントリが存在しますが、これが他のエントリがマッチしなかった場合の“暗黙のDeny”に当たるエントリとなります。
なおNACL02、SG02のインバウンド/アウトバウンドルールの設定はそれぞれNACL01、SG01と同様なので割愛しています。
この時点でInstance01からInstance02に対して「Ping」通信を送ると、次のように問題なく疎通できます。
この状態でNACL02のアウトバウンドルールにICMP(Internet Control Message Protocol)のDenyを設定してみます。「Amazon Virtual Private Cloud」(VPC)のページの「ネットワークACL」の項で対象のNACL「NACL02」を選択し、下部のメニューから「アウトバウンドルール」を選択し、「アウトバウンドルールを編集」ボタンを押すことで設定ページに移動できます。
表示されるページで、「新しいルールを追加」ボタンを押すとエントリが追加されます。そのエントリで、ルール番号を「10」に、タイプを「全てのICMP - IPv4」に、送信先を「0.0.0.0/0」(デフォルト)に、許可/拒否を「拒否」に設定した後、「変更を保存」ボタンを押してICMPの通信を拒否するエントリを追加します。
ここではルール番号を「10」としていますが、全てのトラフィックを許可しているもう1つのエントリのルール番号「100」より小さい値を指定することで先に評価させるからです。この設定によって、NACL02のアウトバウンドルールが次のようになります。
エントリがルール番号の順に並んでいて、追加したエントリが先に評価されることを確認できます。この状況で再度Pingを試した結果は次のようになり、通信できなくなっています。
これは、下図のように、PingのパケットがInstance02に到達した後、戻りのパケットが生成されますが、Subnet02からSubnet01にパケットが転送されるところでNACL02のICMP拒否のアクションが発生し、通信がフィルタリングされたということです。NACL02のインバウンドルールでは“行き”の通信は許可している状態で、ステートフルな動作になっていないことを確認できます。
NACL02のアウトバウンドルールのICMPの拒否設定を「削除」ボタンによって削除し、再度Pingが通るようにします。
ここからは、セキュリティグループの動作を確認します。VPCのページの「セキュリティグループ」で対象のセキュリティグループ「SG02」を選択し、下部のメニューから「アウトバウンドルール」を選択し、「アウトバウンドルールを編集」ボタンを押下することで設定ページに移動します。
表示されるページで、全通信を許可しているエントリを、「削除」ボタンによって削除して「ルールを保存」ボタンを押します。
セキュリティグループはホワイトリスト方式で通信を許可するようになっており、ルールが何も定義されていない状態、つまり全通信を拒否する状態になったことを確認できます。
この状態でもInstance01からInstance02にPingは成功します。
この理由は、下図のようにInstance01からInstance02へのPingパケットがSG02のインバウンド方向で許可された結果、戻りの通信に対してステートフルのルールが発動し、アウトバウンド方向も許可されたからです。
最後に、セキュリティグループのパケットフィルタリング機能を確認するために、SG02のインバウンドルールも全て削除します。
この状態でInstance01からInstance02にPingしても到達しません。
これはSG02のインバウンド方向でルール上許可する通信がなく、フィルタリングされるからです。
今回はネットワークセキュリティとして重要なパケットフィルタリングの機能の説明とAWSの対応するサービスの紹介および設定方法を紹介しました。次回はネットワークの監視について説明します。
Copyright © ITmedia, Inc. All Rights Reserved.