Doctlを使用してDigitalOceanクラウドファイアウォールでWebサーバーインフラストラクチャを保護する方法

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

序章

DigitalOcean クラウドファイアウォールは、ネットワークレベルで強力なファイアウォールサービスを提供し、不正なトラフィックからリソースを保護します。

DigitalOceanコントロールパネルを介してクラウドファイアウォールを構成できますが、管理するドロップレットが多数ある場合、プロセスのスクリプトを作成する必要がある場合、またはターミナルから作業する場合は、コマンドラインインターフェイスの方が適しています。

このチュートリアルでは、doctl(公式の DigitalOceanコマンドラインクライアント)を使用して、Webサーバーのクラウドファイアウォールを作成および管理する方法を学習します。

前提条件

このチュートリアルでは、次のものが必要になります。

  • doctlバージョン1.7.0は、doctlGitHubリポジトリ公式インストール手順に従ってインストールおよび認証されます。 (doctl versionコマンドを使用して、実行しているdoctlのバージョンを確認してください。)
  • DigitalOceanドロップレットでSSHキーを使用する方法チュートリアルに従って、DigitalOceanアカウントにSSHキーを追加します。

nyc1 リージョンでUbuntu16.04を実行するワンクリックLAMP(Linux、Apache、MySQL、PHP)スタックイメージを作成し、これを512MBのドロップレットに配置します。 ただし、このチュートリアルを開始する前に、 Doctlの使用方法、公式のDigitalOceanコマンドラインクライアントおよびの概要を読んで、doctlおよびクラウドファイアウォールに精通することをお勧めします。 DigitalOceanクラウドファイアウォール

ステップ1—Webサーバーのセットアップ

まず、ドロップレットのリージョンを選択します。 このチュートリアルではnyc1を使用しますが、次のコマンドですべてのリージョンとそのスラッグを確認できます。

doctl compute region list
OutputSlug    Name               Available
nyc1    New York 1         true
sfo1    San Francisco 1    true
ams2    Amsterdam 2        true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true

ネットワーク経由でパスワードを送信したくないし、ブルートフォース攻撃の可能性を減らしたいので、SSHキー認証でWebサーバーを保護します。

SSHキーを含むドロップレットを作成するには、doctlにSSHキーの指紋が必要です。これは、次のコマンドで取得できます。

doctl compute ssh-key list
OutputID         Name                  FingerPrint
9763174    sammy_rsa             your_ssh_key_fingerprint

ドロップレットで使用するSSHキーのフィンガープリントをコピーします。

それでは、Ubuntu 16.04を実行しているワンクリックのLAMPスタックイメージを使用して、nyc1リージョンにweb-1という名前の512MBドロップレットを作成する1つのコマンドにすべてをまとめましょう。 SSHキー。

doctl compute droplet create web-1 \
    --region nyc1 \
    --image lamp-16-04 \
    --ssh-keys your_ssh_key_fingerprint \
    --size 512mb

出力には、ドロップレットのID、名前、IPv4アドレス、メモリなど、作成したばかりのドロップレットの概要が表示されます。

OutputID          Name          Public IPv4       Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
52059458    web-1                                                          512       1        20      nyc1      Ubuntu LAMP on 16.04    new       

注:プロビジョニングプロセスが完了するまで数分待つ必要があります。 プロビジョニングされると、ドロップレットのIPv4アドレスとステータスはnewではなくactiveになります。


次のコマンドを使用してドロップレットのステータスを確認し、完全にプロビジョニングされている場合は、手順2でファイアウォールをドロップレットに割り当てるときに必要になるIDをメモします。 ドロップレットのステータスがactiveになるまで、このステップを超えないでください。

doctl compute droplet list web-1
OutputID          Name          Public IPv4       Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
52059458     web-1         203.0.113.1                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    active    

次に、doctlを使用してSSH経由でDropletにログインし、LAMPのインストールを有効にして、サーバーを本番環境で使用するための準備方法に関する追加の手順を取得します。 connection refusedエラーメッセージが表示された場合、ドロップレットの準備はまだできていません。 数分待ってからlistコマンドを再実行して、ドロップレットのステータスがactiveに設定されていることを確認してから続行してください。

doctl compute ssh web-1
Output...
-------------------------------------------------------------------------------
Thank you for using DigitalOcean's LAMP Application.

LAMP has now been enabled. You can access your LAMP instance at:
Your web root is located at /var/www/html and can be seen from
    http://203.0.113.1
...

必要に応じてドロップレットを構成したら、SSHセッションを終了します。

[environment]
exit

最後に、WebブラウザでDropletのIPアドレスを指定して、LAMPスタックが正しく機能していることを確認します。 デフォルトのDigitalOceanワンクリックLAMPスタックランディングページに、「SSH経由でドロップレットにログインしてLAMPインストールを構成してください」というメッセージが表示されます。 そうでない場合は、前の手順をたどって、LAMPが有効になっていることと、DropletのIPアドレスがブラウザに正しくコピーされていることを確認してください。

このチュートリアルに必要なLAMP構成はすでに完了しているので、許可されていないトラフィックからDropletを保護する準備ができています。

手順2—Webサーバーのファイアウォールを作成する

まず、手順1でdoctl compute droplet listコマンドから取得したドロップレットIDを使用して、ポート22でのインバウンドSSH接続を許可するweb-firewallという名前のクラウドファイアウォールを作成します。およびすべてのアウトバウンドTCP、UDP、およびICMP接続。 これにより、多くの基本的なサービスに正常に動作する機能を提供しながら、コマンドラインからサーバーを管理できるようになります。

protocolフィールドは必須であり、tcpudp、またはicmpのいずれかに設定する必要があり、ports値を含める必要がありますicmpを除くすべてのプロトコルで、仕様により、プロトコルは必要ありません。

addressフィールドは、特定のポートへのアクセスを許可するIPアドレスを指定します。 すべてのIPv4アドレスからのトラフィックを許可する場合は、0:0:0:0/0を使用し、すべてのIPv6アドレスからのトラフィックを許可する場合は、::0/0を使用します。

最後に、作成する各ファイアウォールには、--inbound-rulesまたは--outbound-rulesフラグの下に少なくとも1つのルールが必要であり、すべての値はコンマ区切りのkey:valueリストとして入力する必要があります。 複数のルールには、スペースで区切られた値の引用符で囲まれた文字列を使用します。

次に、createコマンドを使用して、ファイアウォールを作成します。

doctl compute firewall create --name web-firewall \     
 --droplet-ids your_droplet_id \
 --inbound-rules "protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0" \
 --outbound-rules "protocol:icmp,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:all,address:0.0.0.0/0,address:::/0 protocol:udp,ports:all,address:0.0.0.0/0,address:::/0"

出力には、新しいクラウドファイアウォールの基本的な概要が含まれています。 手順3でファイアウォールにルールを追加するために使用するため、クラウドファイアウォールのIDをメモしておきます。

OutputID                                      Name            Status     Created At              Inbound Rules                                           Outbound Rules                                                                                                                                                  Droplet IDs    Tags    Pending Changes
c7b39b43-4fcc-4594-88f2-160a64aaddd4    web-firewall    waiting    2017-06-17T21:20:38Z    protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0    protocol:icmp,ports:0,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:0,address:0.0.0.0/0,address:::/0 protocol:udp,ports:0,address:0.0.0.0/0,address:::/0    your_droplet_id               droplet_id:your_droplet_id,removing:false,status:waiting

ポート範囲を指定する必要がある場合は、次の形式を使用してください。

--inbound-rules "protocol:tcp,ports:8000-8080,address:0.0.0.0/0,address:::/0"

addressフラグの代わりにdroplet_idフラグを使用することもできます。 これは、複数のドロップレットが相互に通信するセットアップで特に役立ちます。

--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_droplet_id"

また、次のように、複数のaddressまたはdroplet_idフィールドを1つのルールに組み合わせることができます。

--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_first_droplet_id,droplet_id:your_second_droplet_id"

この時点で、WebブラウザでDropletのIPアドレスを指定して、クラウドファイアウォールが正しく機能していることを確認します。 サイトにアクセスできなくなったことを示すメッセージが表示されます。 そうでない場合は、前のcreateコマンドからの出力を再確認して、エラーメッセージを見逃していないことを確認してください。

最後に、インバウンドルールでSSHがすでに許可されているはずですが、doctlを使用して検証します。

doctl compute ssh web-1

ドロップレットに接続できない場合は、 SSHのトラブルシューティング方法チュートリアルシリーズが、問題の診断に役立ちます。

ドロップレットに正常に接続したら、SSHセッションを終了します。

[environment]
exit

クラウドファイアウォールが正しく機能していることを確認したので、Webサーバーへの着信トラフィックを許可するルールを追加します。

ステップ3—ルールを追加する

手順2でdoctl compute firewall createコマンドから取得したファイアウォールIDを使用して、ポート80でApacheのインバウンドTCPトラフィックを許可するルールを追加します。

add-rulesコマンドを使用します。これには、ファイアウォールIDと少なくとも1つのルールが必要です。 ルールは、手順2と同様に、--outbound-rulesおよび--inbound-rulesフラグを使用して指定されます。

doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
   --inbound-rules "protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0"

HTTPSが必要な場合は、ポート443でインバウンドTCPトラフィックを許可します。

doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
   --inbound-rules "protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0"

成功した場合、このコマンドは出力を生成しません。 エラーメッセージが表示された場合は、画面の指示に従って問題を診断してください。

次に、WebブラウザでDropletのIPアドレスを指定し直します。 今回は、デフォルトのDigitalOceanワンクリックLAMPスタックランディングページが再び表示されるはずです。 そうでない場合は、IPアドレスがWebブラウザに正しくコピーされていることを再確認してから、前の手順を再度トレースしてください。

保護したい追加のWebサーバーがある場合は、ステップ4に進みます。 それ以外の場合は、ステップ5に進んでください。ここでは、タグを使用してクラウドファイアウォールを管理します。

(オプション)ステップ4 —ファイアウォールへのドロップレットの追加

複数のドロップレットがある場合は、それぞれに同じクラウドファイアウォールを適用できます。

add-dropletsコマンドを使用して、クラウドファイアウォールにドロップレットを追加します。 このコマンドには、引数としてCloud Firewall IDが必要であり、droplet-idsフラグを使用して、ファイアウォールを適用するドロップレットを決定します。

クラウドファイアウォールのIDがわからない場合は、listコマンドを使用してください。

doctl compute firewall list
OutputID                                      Name                      Status       Created At              Inbound Rules                                                                                                Outbound Rules                                                                                                                                                  Droplet IDs    Tags              Pending Changes
c7b39b43-4fcc-4594-88f2-160a64aaddd4    web-firewall              succeeded    2017-06-17T21:20:38Z    protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0    protocol:icmp,ports:0,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:0,address:0.0.0.0/0,address:::/0 protocol:udp,ports:0,address:0.0.0.0/0,address:::/0    52059458                         

listコマンドを使用して、ドロップレットのIDを取得することもできます。

doctl compute droplet list
OutputID          Name                Public IPv4       Private IPv4     Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
51146959    test-1              203.0.113.1                                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active    
52059458    web-1               203.0.113.2                                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active    

次のdoctlコマンドを使用して、test-1ドロップレットをweb-serversファイアウォールに追加します。このファイアウォールのIDはc7b39b43-4fcc-4594-88f2-160a64aaddd4です。

doctl compute firewall add-droplets c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
   --droplet-ids 51146959

出力が表示されない場合、コマンドは成功しています。 エラーメッセージが表示された場合は、画面の指示に従って問題を診断してください。

また、一度に複数のドロップレットを追加する場合は、コンマを使用してそれらを区切ります。 2つのIDの間にスペースがないことに注意してください。

--droplet-ids 51146959,52059458

それでは、クラウドファイアウォールの管理を容易にするためにタグを使用しましょう。

ステップ5—タグの使用

この時点で、クラウドファイアウォールに個別のドロップレットを追加しましたが、クラウドファイアウォールは、複数のリソースの管理を容易にするためのタグもサポートしています。 タグがどのように機能するかをよりよく理解するには、DigitalOceanドロップレットにタグを付ける方法を参照してください。

このステップでは、ドロップレットにタグを付け、クラウドファイアウォールにタグを追加してから、ファイアウォールから個々のドロップレットIDを削除し、タグを使用してドロップレットを安全に保ちます。

doctlを使用してドロップレットにタグを追加する前に、まずtag createコマンドを使用してタグを作成する必要があります。

doctl compute tag create web-servers
OutputName           Droplet Count
web-servers    0

タグが作成されたら、droplet tagコマンドを使用してドロップレットに適用します。 このコマンドは、ドロップレットIDを引数として取り、--tag-nameフラグからタグ名を取得します。

doctl compute droplet tag 52059458 \
   --tag-name "web-servers"

1つのクラウドファイアウォールで複数のドロップレットを保護する場合は、ドロップレットごとに前のコマンドを繰り返します。

次に、add-tagsコマンドを使用してタグをクラウドファイアウォールに追加します。このコマンドは、ファイアウォールIDを引数として取り、--tag-namesフラグから使用するタグ名のリストを取得します。

doctl compute firewall add-tags c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
   --tag-names web-servers

出力が表示されない場合、コマンドは成功しています。 エラーメッセージが表示された場合は、画面の指示に従って問題を診断してください。

また、複数のタグを追加する必要がある場合は、それらをコンマ区切りのリストとして提供します。

--tag-names web-servers,backend-servers

最後に、ドロップレットはweb-serversタグの一部であり、そのタグ全体が保護されているため、ファイアウォールからドロップレットのIDを削除できます。

doctl compute firewall remove-droplets c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
   --droplet-ids 52059458

タグのみで保護するドロップレットごとに、前の手順を繰り返します。

警告:タグ付けされていないドロップレットをクラウドファイアウォールから削除すると、ドロップレットは不正なトラフィックから保護されなくなります。


これで、許可されていないトラフィックからWebサーバーを保護する完全に構成されたクラウドファイアウォールができました。 ファイアウォールからルールも削除する場合は、手順6に進みます。

(オプション)ステップ6 —ファイアウォールからのルールの削除

クラウドファイアウォールからルールを削除する場合は、remove-rulesコマンドを使用してください。

remove-rulesコマンドは、ファイアウォールIDを引数として取り、--outbound-rulesおよび--inbound-rulesフラグを使用してルールを指定します。 指定するルールは、作成時に使用したルールと完全に同じである必要があることに注意してください。

doctl compute firewall remove-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
   --inbound-rules protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0

出力が表示されない場合、コマンドは成功しています。 エラーメッセージが表示された場合は、画面の指示に従って問題を診断してください。

結論

このチュートリアルでは、doctlを使用して、DigitalOceanクラウドファイアウォールを作成し、それらのファイアウォールにルールを追加し、ファイアウォールにドロップレットを追加し、タグ付きのファイアウォールを管理し、ファイアウォールからルールを削除しました。

クラウドファイアウォールを使用する他の方法については、DigitalOceanクラウドファイアウォールを整理する方法を参照してください。

また、クラウドファイアウォールのトラブルシューティングについては、DigitalOceanファイアウォールのトラブルシューティング方法にアクセスしてください。