メインコンテンツにスキップ
ブログネットワーキングVLANやVPCを利用した三層アーキテクチャによるアプリのセキュリティ確保

VLANまたはVPCを使用して、3層アーキテクチャでアプリを保護する

データ層、アプリケーション層、プレゼンテーション層の3層アーキテクチャを採用

VPCでネットワークを分離することは、プライベートなコラボレーションを可能にし、機密情報を適切に保存するなど、セキュリティ上大きなメリットがあります。

開発側では、ネットワークの分離により、多階層のWebアプリケーションの展開も可能になります。アプリケーションを階層化することで、公衆インターネットアクセスのある層とない層を区分けすることができます。これはデータベース層を公衆インターネットから分離しつつ、パッチやソフトウェアのアップデートを公衆インターネットから直接ではなくトップ層から取得できるようにするためによく利用されます。これにより、攻撃対象が減少するだけでなく、多地域展開も可能になります。

複数のレイヤーを実行する方法は数多くありますが、一般的には、拡張性、セキュリティ、および信頼性を最大化するいくつかの基本的な形式に依存することができます。最も一般的な設計の1つは3層アーキテクチャで、特にクラウドベースの環境で人気があります。

3層アプリケーションは、異なるサーバーに存在する3つの層で構成され、高い独立性で開発・管理することができる。これらのパーツは

  1. プレゼンテーション。ユーザーとアプリケーション間のコミュニケーションを管理する外部インターフェースで、通常、HTMLとそれに付随するWeb開発コードを持つWebサーバーで構成される。
  2. アプリケーション。必要なビジネスロジックを提供し、アプリケーションを接着するカスタムアプリケーションです。
  3. データです。アプリケーションで使用するデータを保存・検索するためのデータベースシステム。

この3つの層は、ネットワークベースのAPIを通じて通信する、別々のサービスとして機能します。セキュリティとパフォーマンスの観点から、アプリケーション層とデータ層は共通のファイアウォールの内側で同じローカルネットワーク内に存在する必要がありますが、各層を分離することで、それぞれのコンポーネントを異なるハードウェア、あるいは異なる物理的な場所に配置することができるようになります。このあたりの柔軟性は、アプリケーションの要件に大きく依存することになります。

下の図は、基本的な 3 階層の Web アプリケーションを実際に見たものです。プレゼンテーション層のウェブサーバーは、ブラウザーウィンドウで作業するユーザーに対してインターフェースを提供します。一方、データ層はデータベースの形をとっており、単一のシステムであったり、クラスタとしてネットワークに表示されたりします。データベース層には、SQLではMySQL、MariaDB、PostgreSQL、NoSQLではMongoDBやCassandraといったオープンソースのものがよく使われている。

1
図1:3層アーキテクチャとは、Webアプリケーションをプレゼンテーション層、アプリケーション層、データ層に分割するものである。

ウェブサーバとデータベースの間にあるのがアプリケーション層で、コーディングに費やす時間の大半をここで過ごすことになるでしょう。アプリケーション層は、アプリケーションが目標を達成するために必要なカスタムコードとビジネスロジックを含みます。フロントエンドでは、ウェブサーバがアプリケーション層にクエリを送信します。Application 層は Web サーバーに応答し、Web サーバーはデータをフォーマットしてユーザーに表示します。バックエンドでは、アプリケーション層がデータベースに問い合わせ、データを受信し、データを処理してユーザーにインテリジェンスと洞察を与えます。

非常に簡単な例として、データベースにはある会社の販売記録が保存されていることがあります。ユーザーは、特定の製品の、特定の場所での、特定の時間間隔での一日の平均売上を受け取るリクエストを入力します。Webサーバーはそのリクエストをアプリケーション層に送ります。アプリケーション層はデータベースへのクエリーを作成し、生データを受け取り、必要な計算を行い、Webサーバーにレスポンスを送り返します。

1
図2:ユーザーがプレゼンテーション層に情報セットを要求し、アプリケーション層がデータベースへの問い合わせに変換する。

アプリケーション層には、例えばプレゼンテーション層のApache Web サーバーやデータ層の MongoDB データベースに相当するような便利なドロップインソリューションは存在しません。その代わりに、カスタムコードは通常、アプリケーション層用にPython 、PHP、またはRubyで書かれます。しかし、Django (Python)、Rails (Ruby)、Symfony (PHP) など、より効率的にコードを書くための先取りとなるプログラミングフレームワークがいくつか存在します。

アプリケーション層は、ウェブサーバーにデータベースへの直接問い合わせに必要なコードを提供することで、理論的にはプレゼンテーション層と組み合わせることができます。

その中でも最も重要なメリットは、攻撃対象が小さくなることでセキュリティが 向上することです。図1に示すように、3層構造のソリューションでは、ファイアウォールの前に存在しなければならないアプリケーションの部分を最小化することができます。ウェブサーバーは、安全なAPI を介して通信を行います。残りの動作はファイアウォールの背後にあり、重要なのは、インターネットからアクセスできないプライベートなアドレス空間にあることです。特にSQLインジェクションは、最も一般的な脆弱性の一つであり、最も破壊的な脆弱性の一つでもあります。これらは、データベースとの直接通信をすべて分離して保護することで防ぐことができます。

3層構造のアプリケーションのもう一つの利点は、信頼性です。各層が別々のサーバーで動作していたり、さらに別のハードウェアや別のデータセンターで動作していれば、ある層で障害が発生しても、他の層に影響を与える可能性は低くなります。また、このことはスケーラビリティの可能性をもたらします。各コンポーネントは独立して動作するため、独立して成長することができます。たとえば、データベースへのアクセスがパフォーマンスのボトルネックになっている場合、データベース・クラスターにノードを追加しても、全体の運用にほとんど支障をきたすことはないでしょう。

3層のアプローチは、開発プロセスを最適化することも可能です。各層をつなぐAPIは、分業の効率化をサポートする形でコンポーネントを分離します。ウェブ開発者と管理者はウェブサーバーの運用と保守を行い、データベース開発者と管理者はデータベースシステムを運用します。その間に、アプリケーション層に使用しているフレームワークの専門家が、アプリケーションコードに注意を集中することができます。例えばDevOpsのシナリオでは、アプリケーション開発者はオフラインで新しいバージョンのアプリケーションコードを構築してテストすることができ、運用への影響を最小限に抑えながら簡単に変更することができます。

Webアプリケーションの構築を始めるなら、3層アーキテクチャを検討してみてください。今日のコンテナやクラウド環境では、コンポーネントを異なるシステムに分離することは容易であり、より信頼性が高く、より安全で、よりスケーラブルなアプリケーションでその努力に報いることができます。

アプリケーションレイヤーを構築するために、今すぐLinodeを始めましょう。

リソース VLANの使用開始|データセンター横断アプリケーション

Linodeのソリューション VLANマネージド・データベース


コメント (1)

  1. Author Photo

    You can eliminate the “NAT” in Figure 1. It’s not needed in an IPv6 world. A proper firewall will suffice.

コメントを残す

あなたのメールアドレスは公開されません。 必須項目には*印がついています。