Amazon VPCのネットワークACLについて
Amazon VPCのネットワークACLとは?
Amazon VPCのネットワークACL(アクセスコントロールリスト)は、サブネット内外のトラフィックを制御するファイアウォールとして任意のセキュリティを提供します。セキュリティグループの設定と同じようにACLのルールを適応することによって、VPCに追加のセキュリティ層を提供します。EC2はサブネット指定ができませんのでネットワークACLを利用することはできません。
セキュリティグループとネットワークACLの違い
VPCのセキュリティグループとネットワークACLには違いがあります。比較表を見てください。
インスタンスレベルで設定します。(インスタンス向け第1層ファイアウォール) | サブネットレベルで設定します。(サブネット向け第2層ファイアウォール) |
通信の入り(VPCの場合は出も)の設定のために、許可ルールのみ設定することができます。 | 通信の入りと出の設定のために、許可ルールと拒否ルールを設定することができます。 |
ステートフル:戻りの通信はセキュリティグループの設定に関わらず許可されます。(VPCの場合はステートレス) | ステートレス:戻りの通信はACLのルールに従いますので許可設定する必要があります。 |
該当のトラフィックを許可する前に全ての許可設定を評価します。 | 該当のトラフィックを許可するとき、ルール番号順にACLのルールを処理します。 |
セキュリティグループは、インスタンスを起動するときのみ指定できます。言い換えれば、正しいセキュリティグループの設定でインスタンスを起動しなければいけません。正しいかどうかはインスタンを起動する人や命令に依存します。(VPCの場合は後からセキュリティグループを変更できます。) | ネットワークACLは、サブネットに適応されます。言い換えれば、セキュリティの設定が正しいかどうかはインスタンスを起動する人や命令に依存しません。ネットワークACLは、セキュリティグループのバックアップ層として動作すると考えることができ、サブネット内で起動した全てのインスタンスに対して自動的に適応されます。 |
フィルタできない通信について
セキュリティグループとネットワークACLは、リンクローカルアドレス(169.254.0.0/16)に関するトラフィックをフィルタすることができません。リンクローカルアドレスとは、VPC内で動いているDNSサーバー、DHCP、Amazon EC2指定のメタデータ、KMS(Key Management Server:Microsoft Serverなどのライセンス管理サーバー)です。もし、これらの通信をブロックしたければ、EC2内にオリジナルのファイアウォールを設定すればブロックすることができます。ただし、必要な機能ばかりですのでよく考えて決めましょう。
ネットワークACLの基本的なこと
ネットワークACLを理解する上で基本的に知っておくべきことを並べます。
- ネットワークACLは、ルールに番号付けしたリストです。これは、ACLに関連づけられたサブネットの入りと出のトラフィックのに対して小さな番号順に許可されます。
- ネットワークACLは、インバウンドまたはアウトバウンドのトラフィックについて、個別に許可と拒否の設定ができます。
- VPCは自動的にデフォルトACLに属します。デフォルトACLは、初期設定で全ての入りと出のトラフィックを許可しています。
- 任意にカスタマイズしたACLを追加することができます。カスタムACLは、初期設定として全ての入りと出のトラフィックを拒否していますので、許可ルールを追加することで通信を行うことができます。
- どのサブネットもACLを関連づける必要があります。サブネットにACLを指定しない場合には、デフォルトACLが適応されます。
- ACLはステートレスです。レスポンスの通信を許可する必要があります。(入りに対する出、出に対する入り)
ACLルールについて
ACLの構成要素は以下です。
- ルール番号
- プロトコル:あらゆる標準プロトコル番号を指定することができます。ICMPを指定する場合、一部か全部のコードとタイプを指定できます。
- インバウンドルールの場合:CIDR範囲のソースと宛先ポート(listen等)/範囲
- アウトバウンドルールの場合:CIDR範囲の宛先と宛先ポート/範囲
- 許可または拒否
デフォルトACLの初期設定
以下は、デフォルトACLの初期設定です。全てのインバウンドと全てのアウトバウンドを許可しています。ルール番号に*が入っているのが分かります。これは、全てのルールに当てはまらないときに適応されるという意味です。
カスタムACLの例
カスタムのACLを作成してVPC内のインスタンスに適応してみます。まずはSSHのみを使えるように許可します。EC2インスタンスを起動してセキュリティグループを指定します。繰り返し補足ですが、VPC内のEC2インスタンスは後からセキュリティグループを変更できます。変更するにはメニューリストから選んでください。以下は、セキュリティグループの設定例です。インバウンドはSSHのみ許可しました。アウトバウンドは全て許可しました。
続いてACLの設定です。繰り返し補足ですが、ACLの設定はサブネットに関連づけられ、サブネット内の全てのインスタンスに自動的に適応されます。インバウンドはSSHのみ許可を指定しました。アウトバウンドは49152 - 65535ポートを許可しています。これは一体なんでしょうか。これは、Ephemeralポートといってリクエスト側の一時利用のポートです。詳しくは後に説明します。
実際にSSH接続できるか確かめてみます。繰り返し補足ですが、VPC内のインスタンスにはEIPの付与が必要ですのでお忘れなく。
$ ssh -i mykey1.pem ec2-user@103.4.11.40 Last login: Sat Dec 3 15:06:16 2011 from w0109-49-134-134-28.uqwimax.jp __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| See /usr/share/doc/system-release/ for latest release notes. There are 14 security update(s) out of 18 total update(s) available $
無事にログインすることができました。
Ephemeralポートとは
Ephemeralポートとは、クライアントがサーバーへリクエストする際に利用する一時利用のポートのことを指します。今回、ネットワークACLでなぜアウトバウンドの許可設定に49152 - 65535ポートを指定したのか解説します。このポート範囲は、クライアント側のOSに依存します。以下に例を示します。OSの種類やバージョンによって異なりますね。
- 多くのLinuxカーネル(Amazon Linuxを含む):32768-61000
- Windows XP、Windows Server 2003:1025-5000
- Windows Vista、Windows 7、Windows Server 2008:49152-65535
- Mac OS X、Mac OS X Server:49152-65535
- FreeBSD 5.0:49152-65535
- AIX、HP-UX:32768 - 65535
インターネットからVPC内のインスタンスにアクセスする場合、あらゆるクライアントに対応させるためには、アウトバウンドのポート範囲として1024 - 65535を指定する必要があります。最近のOSだけに対応させたいのであれば、49152-65535と指定すればよいですね。
VPC内のインスタンスからインターネットにアクセスする場合、インスタンスがAmazon LinuxやWindows Server 2008であれば、インバウンドで許可するポート範囲として49152-65535を設定しておけば、この中から使っていない空いているポートを接続元ポートとして使えますね。これはデフォルトACLにしてもよいのではないでしょうか。
実際にどのような番号が使われているか確認してみましょう。以下は、Mac OS XからVPC内のインスタンスに接続した際に表示したネットワーク情報です。
Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 0 192.168.0.3.53826 ec2-103-4-11-40..ssh ESTABLISHED
同じく、SSHでVPC内のインスタンスにログインした後のネットワーク情報を以下に示します。
Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 48 10.0.0.243:ssh w0109-49-134-134-28.u:53826 ESTABLISHED
この例では、53826ポートを使っている事が分かりますね。このポートは、Ephemeral(一時利用)ポートですから、接続し直すと空いている番号から再割り当てされますので番号が変わります。
まとめ
ネットワークACLの理解を深めるためには、Ephemeral(一時利用)ポートの理解が必要である事が分かりました。最後に図に表してみました。頭スッキリ!?。今日から君もVPCマエストロだ!!