序章

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

前提条件

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

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

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

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

  1. sudo ufw status verbose
Output
Status: 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でも同じことをしましょう。

  1. sudo ufw status verbose
Output
Status: 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ドロップレットの右側にあるその他ボタンをクリックし、タグの追加を選択します。

Select "Edit Tags"

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

Tag Editing Interface

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

Droplet List with Tags

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

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

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

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

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

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

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

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

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

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

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

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

Inbound Rules for frontend-fw

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

Apply to "frontend" tag

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

Firewall summary with the frontend rule listed

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

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

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

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

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

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

Firewall summary with database-fw and frontend-fw rules in place

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

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

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

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

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

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

Firewall summary with all rules in place

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

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

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

  1. sudo ufw disable
Output
Firewall stopped and disabled on system startup

次に、 database-01 で:

  1. sudo ufw disable
Output
Firewall stopped and disabled on system startup

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

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

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

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

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

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

  1. sudo apt-get update
  2. sudo apt-get install nmap

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

  1. nmap -Pn frontend-01_public_ip
Output
Starting 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データベースがリッスンするものです。

  1. nmap -Pn database-01_private_ip
Output
Starting 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タグを追加します。 次に、コマンドを再実行します。

  1. nmap -Pn database-01_private_ip
Output
Starting 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を介したクラウドファイアウォールの使用の詳細については、次の記事を参照してください。