前書き

DigitalOceanクラウドファイアウォールは、ネットワークレベルで強力なファイアウォールサービスを提供し、サーバーがアプリケーションを提供してデータを保存するという仕事を自由に行えるようにします。 このチュートリアルでは、2サーバーのWordpressとMySQLのセットアップをクラウドファイアウォールを使用するように調整し、このサービスが提供できる利点のいくつかを示します。 開始する前にこのファイアウォールサービスの背景を詳しく知りたい場合は、https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-cloud-firewalls [Introduction To DigitalOcean Cloud Firewalls]チュートリアルをご覧ください。 。

前提条件

このチュートリアルを開始する前に、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-に概説されているインフラストラクチャを作成する必要があります。 performance-with-mysql-on-ubuntu-16-04 [Ubuntu 16.04でMySQLを使用してサイトパフォーマンスを最適化するためにリモートデータベースを設定する方法]。 これにより、PHPとWordPressがインストールされたNginx Webサーバーと、スタンドアロンのMySQLサーバーの2つのサーバーが残ります。 このチュートリアルでは、これらのサーバーをそれぞれ* frontend-01 および database-01 *と呼びます。

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

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

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

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

To                         Action      From
--                         ------      ----

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

データベースサーバー* database-01 *で同じことを行います。

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

To                         Action      From
--                         ------      ----

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

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

特定のサーバーごとに調整された2つのクラウドファイアウォールを作成し、1つを* frontend-01 に適用し、もう1つを database-01 *に適用することもできますが、ルールの編成方法により柔軟なアプローチを取ります。 。

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

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

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

追加のボーナス(および+ ufw を使用して動的な方法で行うのが難しいこと)は、クラウドファイアウォールがタグに基づいてインバウンドアクセスを制限できることです。 したがって、たとえば、*データベース*サーバーは、*フロントエンド*サーバーからのみアクセスできる必要があります。 現在の「 ufw +」セットアップでは、ネットワーク上の誰でもデータベースを開くことができます。 * frontend *でタグ付けされたドロップレットのみにロックダウンします。

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

  • *管理:*任意のホストからTCPポート22へのインバウンドトラフィックを許可します

  • *フロントエンド:*任意のホストからTCPポート80および443へのインバウンドトラフィックを許可します

  • データベース: * frontend *タグ付きサーバーからのみTCPポート3306への受信トラフィックを許可

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

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

ステップ1-サーバーのタグ付け

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

image:https://assets.digitalocean.com/articles/fw-webapp/edit-tags-o.png [「タグの編集」を選択]

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

image:https://assets.digitalocean.com/articles/fw-webapp/add-tags-o.png [タグ編集インターフェイス]

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

image:https://assets.digitalocean.com/articles/fw-webapp/droplet-list.png [タグ付きドロップレットリスト]

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

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

ステップ2-クラウドファイアウォールの作成

クラウドファイアウォールを設定します。 まず* frontend ファイアウォールを実行し、次に database を実行し、次に management *を実行します。 この順序により、Webサイト訪問者のサービスが中断することはありませんが、一時的に新しいSSH接続を確立することができなくなります。 これは、すでに確立された接続には影響しません。

ファイアウォールサービスは、DigitalOceanコントロールパネルの[ネットワーク]セクションで利用できます。 表示されたら、[ファイアウォール]タブをクリックし、ボタンをクリックして開始します。

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

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

最初に* frontend ファイアウォールを作成するため、 Name *フィールドに入力します。

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

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

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

image:https://assets.digitalocean.com/articles/fw-webapp/frontend-inbound.png [frontend-fwの受信ルール]

最後に、[ドロップレットに適用]フィールドで、* frontend *と入力し、自動提案されたらタグを選択します。

image:https://assets.digitalocean.com/articles/fw-webapp/apply-to-frontend.png [「フロントエンド」タグに適用]

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

image:https://assets.digitalocean.com/articles/fw-webapp/firewall-summary.png [フロントエンドルールが記載されたファイアウォールの概要]

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

Database Firewallの作成

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

*名前*フィールドに入力します。

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

  • Outbound Rules *はそのままにします。 *ドロップレットに適用*で、このファイアウォールをタグに適用し、をクリックします。 もう一度、ファイアウォールの概要ページに戻ります。

image:https://assets.digitalocean.com/articles/fw-webapp/firewall-summary-2.png [database-fwおよびfrontend-fwルールが設定されているファイアウォールの概要]

両方のファイアウォールがそれぞれ1つのドロップレットに適用されることを示していることに注意してください。 Webサイトをロードしても、正常にロードされるはずです。 次に、SSHを介して管理を再度有効にします。

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

最後にもう一度クリックします。 * Name *フィールドに追加します。

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

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

[ドロップレットへの適用]で、とタグの両方を追加して、をクリックします。 最後のファイアウォールの概要を見てみましょう。

image:https://assets.digitalocean.com/articles/fw-webapp/firewall-summary-3.png [すべてのルールが整ったファイアウォールの概要]

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

手順3-ホストファイアウォールの削除

両方のホストで「+ ufw +」ファイアウォールを無効にする必要があります。 まず、* frontend-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 +`はホストをスキャンし、どのポートが開いているか、閉じているか、フィルターされているかを示すポートスキャナーです。

  • frontend-01 および database-01 *サーバーと同じ地域にある別のUbuntu 16.04サーバーにログインします。 次に、 `+ nmap +`をインストールします。

sudo apt-get update
sudo apt-get install nmap

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

nmap -Pn
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:
PORT    STATE SERVICE




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

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

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

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

nmap -Pn
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:
PORT   STATE SERVICE


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

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

nmap -Pn
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


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

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

結論

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