DigitalOceanクラウドファイアウォールを使用して安全なWebアプリインフラストラクチャを構成する方法
序章
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:
ファイアウォールは、デフォルトですべての着信接続を拒否し、すべての発信接続を許可していることが示されています。 さらに、着信IPv4およびIPv6 TCP接続を許可する4つのルールがあります(ALLOW IN
)ポート22(SSH)、80(HTTP)、および443(HTTPS)に接続します。
データベースサーバー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-fwをNameフィールドに追加します。
このファイアウォールに必要なのは、デフォルトの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コントロールパネルに戻り、使用しているサーバーにfrontendタグを追加します nmap
から。 次に、コマンドを再実行します。
- 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については、次の記事を参照してください。