DigitalOceanクラウドファイアウォールを使用して安全なWebアプリインフラストラクチャを構成する方法

提供:Dev Guides
移動先:案内検索

序章

DigitalOceanクラウドファイアウォールは、ネットワークレベルで強力なファイアウォールサービスを提供し、サーバーがアプリケーションの提供とデータの保存を自由に行えるようにします。 このチュートリアルでは、クラウドファイアウォールを使用するように2サーバーのWordpressとMySQLのセットアップを適応させ、このサービスが提供できるいくつかの利点を示します。 開始する前にこのファイアウォールサービスの背景について詳しく知りたい場合は、 DigitalOcean CloudFirewallsの概要チュートリアルをお読みください。

前提条件

このチュートリアルを開始する前に、 Ubuntu16.04でMySQLを使用してサイトパフォーマンスを最適化するためのリモートデータベースを設定する方法で概説されているインフラストラクチャを作成しておく必要があります。 これにより、2つのサーバー、PHPとWordPressがインストールされたNginx Webサーバー、およびスタンドアロンのMySQLサーバーが残ります。 このチュートリアル全体を通して、これらのサーバーをそれぞれフロントエンド-01およびデータベース-01と呼びます。

現在のファイアウォールの状況

現在、両方のサーバーでufwユーティリティを使用してファイアウォールが設定されています。 ufwは、Linuxのiptablesファイアウォールエンジンの使いやすいラッパーです。 今すぐ両方のサーバーにログインして、ファイアウォールのステータスを確認しましょう。

まず、Webサーバーで、 frontend-01

sudo ufw status verbose
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80,443/tcp (Nginx Full)    ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
80,443/tcp (Nginx Full (v6)) ALLOW IN    Anywhere (v6)

出力では、Default:の後に、ファイアウォールがデフォルトですべての着信接続を拒否し、すべての発信接続を許可していることが示されています。 さらに、ポート22(SSH)、80(HTTP)、および443(HTTPS)への着信IPv4およびIPv6 TCP接続(ALLOW IN)を許可する4つのルールがあります。

データベースサーバーdatabase-01でも同じことをしましょう。

sudo ufw status verbose
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
3306                       ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
3306 (v6)                  ALLOW IN    Anywhere (v6)

この出力は、2つのNginxポートを標準のMySQLポートであるポート3306に交換したことを除いて、同様です。 現在の設定がわかったので、交換の計画を立てましょう。

クラウドファイアウォールプラン

1つは特定のサーバーごとに調整された2つのクラウドファイアウォールを作成し、1つをフロントエンド-01 に適用し、もう1つをデータベース-01 に適用することもできますが、さらに多くのことを行います。ルールを整理する方法への柔軟なアプローチ。

まず、このシステムに3番目のタイプのサービス(おそらくキャッシュサーバー)を追加する必要があるかもしれない将来に備えて準備を整えておきたいと思います。 したがって、物理サーバーではなく、役割に基づいてファイアウォールルールを分割します。 各ドロップレットに複数のクラウドファイアウォールを適用できるため、これらのファイアウォールをきめ細かくモジュール化することは問題ありません。

注:クラウドファイアウォールの構築に関するベストプラクティスの詳細については、 DigitalOcean CloudFirewallの整理方法をお読みください。


少し分解すると、両方のサーバーが実際には複数の機能を持っていることがわかります。 Webページまたはデータベース情報を提供する主な機能があり、SSHサービスによって提供される管理機能もあります。 管理ファイアウォール、フロントエンドファイアウォール、およびデータベースファイアウォールを作成することは理にかなっています。

Webまたはデータベースサービスを複数のホストに拡張する将来のシナリオを処理するために、DigitalOceanのタグ付け機能を使用して、ドロップレットを役割別に整理します。 タグは、ドロップレットに適用してタグを分類し、サーバーのグループ全体に一度に対応できる単純なラベルです。 Cloud Firewallサービスは、タグ内のすべてのドロップレットにファイアウォールルールを適用できるため、適切なファイアウォールルールがすでに設定されている新しいドロップレットを簡単にプロビジョニングできます。

追加のボーナス-そしてufwを使用して動的な方法で行うのは難しいこと-は、クラウドファイアウォールがタグに基づいてインバウンドアクセスを制限できることです。 したがって、たとえば、データベースサーバーは、フロントエンドサーバーからのみアクセス可能である必要があります。 現在のufwセットアップでは、ネットワーク上のすべてのユーザーがデータベースを利用できます。 フロントエンドでタグ付けされたドロップレットのみにロックします。

設定する必要のある3つのファイアウォールをわかりやすい言葉で要約してみましょう。

  • 管理:任意のホストからTCPポート22へのインバウンドトラフィックを許可します
  • フロントエンド:任意のホストからTCPポート80および443へのインバウンドトラフィックを許可します
  • データベース:は、フロントエンドタグ付きサーバーからのみTCPポート3306へのインバウンドトラフィックを許可します

このチュートリアルでは、アウトバウンドトラフィックをまったく制限しません。 これは悪い考えではありませんが、基盤となるオペレーティングシステムの自動更新メカニズムやその他の重要な機能を壊さないように注意する必要があります。

新しいファイアウォールの計画ができたので、始めましょう。

ステップ1—サーバーにタグを付ける

まず、ファイアウォールルールの準備として、役割ごとにドロップレットにタグを付けます。 DigitalOceanコントロールパネルに移動します。 デフォルトのビューは、ドロップレットのリストです。 フロントエンド-01ドロップレットの右側にあるその他ボタンをクリックし、タグの追加を選択します。

このドロップレットのタグを入力できるテキストボックスがポップアップ表示されます。 フロントエンドと入力し、タグの追加ボタンをクリックします。

データベースサーバーについても同じことを行い、databaseタグを付けます。 タグはドロップレットリストに表示されます。

将来のドロップレットを作成するときに、最初のプロビジョニングプロセス中にこれらのタグを適用できます。 ドロップレットは、対応するファイアウォールルールを自動的に継承します。

次のステップでこれらのルールを設定します。

ステップ2—クラウドファイアウォールを作成する

次に、クラウドファイアウォールを設定します。 最初にフロントエンドファイアウォールを実行し、次にデータベース、次に管理を実行します。 この注文により、Webサイトの訪問者のサービスが中断することはありませんが、新しいSSH接続を確立する機能が一時的に失われます。 これは、すでに確立されている接続には影響しません。

ファイアウォールサービスは、DigitalOceanコントロールパネルのNetworkingセクションで利用できます。 そこで、ファイアウォールタブをクリックし、ファイアウォールの作成ボタンをクリックして開始します。

フロントエンドファイアウォールの作成

ファイアウォールの作成ページで、名前に入力し、インバウンドルールを構成して、ファイアウォールを適用するドロップレットを選択する必要があります。 アウトバウンドルールセクションはそのままにしておきます。

最初にフロントエンドファイアウォールを作成しているので、名前フィールドにフロントエンド-fwを入力します。

注:ファイアウォール名の末尾に -fw を追加して、ファイアウォール名を明確にします。 コントロールパネルのインターフェイスはアイコンを使用してリソースの種類を区別しますが、たとえば、コマンドラインまたはAPIを使用していて、複数のフロントエンドアイテムがある場合は混乱する可能性があります。


次に、インバウンドルールセクションからデフォルトのSSHルールを削除する必要があります。 このルールを管理ファイアウォールに分割して柔軟性を高めます。 ページの右側にあるDeleteリンクを使用して、SSHルールを今すぐ削除します。

次に、新しいルールドロップダウンをクリックして、HTTPを選択します。 これにより、正しいプロトコル(TCP)とポート(80)が自動入力され、デフォルトですべてのIPv4およびIPv6アドレスからのトラフィックが許可されます。 これが私たちが望んでいることです。

HTTPSを有効にしている場合は、上記のプロセスを繰り返して2番目のルールを作成し、今回はHTTPSを選択します。 インバウンドルールセクションは次のようになります。

最後に、ドロップレットに適用フィールドで、フロントエンドの入力を開始し、自動提案されたらフロントエンドタグを選択します。

ファイアウォールの作成ボタンをクリックします。 新しいファイアウォールが作成され、フロントエンドタグが付いたすべてのドロップレットに適用されます。 新しいファイアウォールを示す更新されたファイアウォールの概要ページに戻ります。

次に、データベースファイアウォールを作成します。

データベースファイアウォールの作成

[ファイアウォール]ページで、ファイアウォールの作成をもう一度クリックします。 プロセスは、フロントエンドファイアウォールの場合とほとんど同じです。

Nameフィールドにdatabase-fwと入力します。

インバウンドルールで、デフォルトのSSHルールを削除します。 次に、ドロップダウンを使用してMySQLを選択して新しいルールを作成します。 デフォルトのMySQLルールが作成され、すべてのIPからポート3306へのアクセスが許可されます。 SourcesフィールドからAllIPv4およびAllIPv6を削除します。 フロントエンドサーバーのみがデータベースにアクセスできるようにする必要があります。 フロントエンドソースボックスに入力し始め、自動提案されたらフロントエンドタグを選択します。 これで、そのタグが適用されたすべてのドロップレットがデータベースサーバーへのアクセスを許可されます。 他のすべてのIPはブロックされます。

アウトバウンドルールはそのままにしておきます。 ドロップレットに適用で、このファイアウォールをデータベースタグに適用し、ファイアウォールの作成をクリックします。 もう一度、ファイアウォールの概要ページに戻ります。

両方のファイアウォールが、それぞれ1つのドロップレットに適用されていることを示していることに注意してください。 あなたがあなたのウェブサイトをロードするならば、それはまだうまくロードするはずです。 それでは、SSHを介した管理を再度有効にしましょう。

管理ファイアウォールの作成

最後にもう一度ファイアウォールの作成をクリックします。 management-fwNameフィールドに追加します。

このファイアウォールに必要なのは、デフォルトのSSHルールだけです。 これにより、すべてのIPがポート22に接続できるようになります。

または、SSHルールの Sources フィールドを、接続元の特定のIPに変更することもできます。 たとえば、オフィスに静的IPがあり、SSHアクセスをオフィスからの接続のみに制限する場合は、そのIPをソースに配置し、すべてのIPv4を置き換えます。すべてのIPv6。 将来IPが変更された場合は、この1つのルールを更新するだけで、管理アクセスを復元できます。これは、事前に計画を立ててルールをモジュール化することのもう1つの利点です。

[ドロップレットに適用]で、フロントエンドタグとデータベースタグの両方を追加し、ファイアウォールの作成をクリックします。 最終的なファイアウォールの概要を見てみましょう。

この時点で、クラウドファイアウォールは完全に機能しているはずですが、ホストベースのufwファイアウォールもアクティブになっています。 それらを無効にしてから、接続をテストしてみましょう。

ステップ3—ホストファイアウォールを削除する

両方のホストでufwファイアウォールを無効にする必要があります。 まず、フロントエンド-01 で:

sudo ufw disable
OutputFirewall stopped and disabled on system startup

次に、 database-01 で:

sudo ufw disable
OutputFirewall stopped and disabled on system startup

これにより、現在のファイアウォールが停止し、すべてのルールがフラッシュされ、起動時にルールが再度有効になるのを防ぎます。

この時点で、すべての接続が復元されます。 サーバーの1つに新しいSSHセッションを作成してみてください。 次に、Webサイトをロードして、Webサーバーがまだデータベースに接続し、Webページをブラウザーに返していることを確認します。

ただし、すべてのサービスに接続できるからといって、ファイアウォールが機能していることを実際に証明することはできません。 もう少しテストを行って、ファイアウォールが実際に設置されていることを確認しましょう。

ステップ4—ファイアウォールのテスト

ファイアウォールをテストするには、3番目のサーバーにログインし、nmapというユーティリティを使用してWebサーバーとデータベースサーバーをスキャンします。 nmapは、ホストをスキャンして、開いている、閉じている、またはフィルタリングされているポートを通知するポートスキャナーです。

フロントエンド-01およびデータベース-01サーバーと同じリージョンにある別のUbuntu16.04サーバーにログインします。 次に、nmapをインストールします。

sudo apt-get update
sudo apt-get install nmap

次に、nmapを使用して、WebサーバーのパブリックIPをスキャンします。

nmap -Pn frontend-01_public_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:08 UTC
Nmap scan report for 203.0.113.11
Host is up (0.0022s latency).
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 4.54 seconds

filtered portsに関する出力に注意してください。 ファイアウォールが機能していない場合、これらはclosed portsと表示されます。 Filtered は、nmapが接続して、ポートが開いているか閉じているかを判断できないことを意味します。

予想どおり、SSH、HTTP、およびHTTPSポートが開いていることにも注意してください。

次に、データベースサーバーをスキャンします。 ドロップレットをそのように設定した場合は、必ずドロップレットのプライベートIPを使用してください。これは、MySQLデータベースがリッスンするものです。

nmap -Pn database-01_private_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:21 UTC
Nmap scan report for 198.51.100.20
Host is up (0.0024s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 8.17 seconds

以前と同様に、ほとんどのポートがフィルタリングされていることがわかります。 ただし、SSHポートは開いているだけで、MySQLポートは使用できません。 フロントエンドでタグ付けされたサーバーのみにデータベースアクセスを制限したことを思い出してください。 DigitalOceanコントロールパネルに戻り、nmapを使用しているサーバーにfrontendタグを追加します。 次に、コマンドを再実行します。

nmap -Pn database-01_private_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:22 UTC
Nmap scan report for 198.51.100.20
Host is up (0.0033s latency).
Not shown: 998 filtered ports
PORT     STATE SERVICE
22/tcp   open  ssh
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 4.46 seconds

MySQLポートが開いていると表示されるようになりました。 両方のサーバーがクラウドファイアウォールルールによって保護されていることを確認しました。 これで、コントロールパネルに戻り、Dropletのフロントエンドタグを削除することで、このテストサーバーの元のファイアウォール設定を復元できます。

結論

このチュートリアルでは、ufwファイアウォールのセットアップを、柔軟で強力なネットワークベースのクラウドファイアウォール構成に置き換えました。 doctlまたはDigitalOceanAPIを介したクラウドファイアウォールの使用の詳細については、次の記事を参照してください。