By

安全なVPC設計

VPCの構築はAWS を使って Web サービスを構築する上で避けて通れないものですが、デフォルトで作成済みの VPC はセキュアとは言い難いものです。
しかしながら、正しい VPC を構築するためにはネットワークに関する知識に加えて AWS 特有の事情も関わってくるため、Web アプリケーション開発者にとって容易なものではない場合が多いでしょう。
この記事では、私のおすすめする VPC の設定の紹介と、なぜそのような設定がよいのか、他の設定と比較します。

public と private サブネット

public サブネットとは、インターネットにアクセス可能なサブネット、つまり、そのサブネットのルートテーブルに Internet Gateway が設定されているサブネットのことです。
一方で private サブネットとは、直接のインターネットアクセスのできないサブネットを指します。

public サブネットのみの構成の問題点

最もシンプルな VPC 構成は public サブネットのみが存在する構成です。この構成においては、VPC内に存在するすべてのインスタンスが直接インターネットにアクセスすることが可能です。したがって、インターネットから VPC 内へのアクセスも可能です。
サブネットのレベルでアクセスを制御することができないため、この構成によるセキュリティは基本的に Security Group を正しく設定することで確保します。
もちろん Security Group を使用することで高いセキュリティを確保することは可能ですが、Security Group の設定が非常に複雑になってしまうことが考えられることに加えて、人的エラーによる脆弱性を生みやすいです。

private サブネットの導入

上記のような問題を回避するために、private サブネットを導入します。
private サブネット内のインスタンスは直接インターネットとは繋がっていないため、public サブネットを経由してインターネットとの通信を行います。Web アプリケーションサービスは private サブネット内に配置し、サービスへのアクセスは public サブネット内に配置した ELB を経由して実現します。
そして、インスタンスからインターネットへのアクセスは public サブネットに配置した NAT インスタンスを経由して実現します。
また、private インスタンスへの ssh アクセスは public サブネットに配置した 踏み台サーバーを経由します。

このような構成にすることで、private サブネットに想定しないアクセスが発生しないことを容易に保証することができます。

private サブネットと NAT インスタンス

private サブネットからのインターネットアクセスは上述したように NAT インスタンスを用いることが一般的ですが、従来の手法による NAT インスタンスの導入では NAT インスタンスが単一障害点となってしまう問題を抱えています。この問題に対処するために、様々なアプローチが考案されてきましたが、いずれも複雑な構成であることが導入の障害となっていました。
しかし現在では AWS の NAT Gatewayを利用することで容易に高可用な NAT を構築することができます。

Security Group と Network ACL

VPC の サブネットには Network ACL と呼ばれるアクセス制御を設定することができます。
Network ACL は Security Group と似通った機能ですが、次のような違いがあります。

Seucrity Group はインスタンス単位、 Network ACL はサブネット単位

Security Group はインスタンスに対して適用するものであるのに対して、Network ACL はサブネットに適用します。
「ある特定のインスタンス(群)」に対するアクセス制御のようなことは Network ACL では実現できません
また、Inbound/Outbound の対象としてSecurity Groupを指定できるのもSecurity Groupの特徴です。

Security Group はステートフル、Network ACLはステートレス

Security Group はTCPのステートを認識します。なので、「インスタンスAが1.2.3.4:443にリクエストする」ケースでは、Security Groupの場合は A の Security Group の Outbound に 「1.2.3.4:443」を設定すればよいですが、Network ACLの場合は送信先のIPとポートに加えて A が使用する Ephemeral ポートも許可する必要があります。

Security Group はホワイトリストのみ、Network ACLはブラックリストもサポート

Security Groupでは通信を「許可」する設定しかできませんが、Network ACL では通信を「拒否」する設定も行うことができます。

Security Group と Network ACL の使い分け

Subnet 内のインスタンスすべてに共通する不要な送信/受信は Network ACL で一括拒否することができます。例えば、 パブリックサブネットの ELB がHTTP/HTTPS の通信を最初に受信するのであれば、インターネットからの HTTP/HTTPS アクセスを Private サブネットに通す必要はありません。このように Network ACL を利用することで、誤って 特定の Security Group の HTTP/HTTPS アクセスを有効にしてしまっても Private サブネット内に直接インターネットからHTTP通信が流入する事故を防ぐことができます。

つづく

以上の基本を踏まえて次回以降で、どのような VPC を構築すればよいか具体的に説明していきます。

一緒にユニークな決済サービスを作ってくれる Rails エンジニアを募集中です!
多国籍なメンバーと一緒に仕事をしてみませんか?詳細はこちらのリンクです:D