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

前書き

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

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

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

前提条件

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

nyc1リージョンでUbuntu 16.04を実行するワンクリックLAMP(Linux、Apache、MySQL、PHP)スタックイメージを作成し、これを512MBのドロップレットに配置します。 ただし、このチュートリアルを開始する前に、How To Use Doctl, the Official DigitalOcean Command-Line ClientAn Introduction To DigitalOcean Cloud Firewallsを読んで、doctlとクラウドファイアウォールについて理解しておくことをお勧めします。

[[step-1 -—- setting-up-the-web-server]] ==ステップ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

ネットワーク経由でパスワードを送信したくないし、brute-force attackの可能性を減らしたいので、SSHキー認証でWebサーバーを保護します。

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

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

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

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

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

[.note]#Note:プロビジョニングプロセスが完了するまで数分待つ必要があります。 プロビジョニングされると、ドロップレットの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を保護する準備が整いました。

[[step-2 -—- creating-the-firewall-for-the-web-server]] ==ステップ2—Webサーバーのファイアウォールを作成する

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

protocolフィールドは必須であり、tcpudp、またはicmpのいずれかに設定する必要があり、%を除くすべてのプロトコルにports値を含める必要があります。 (t5)sは、そのspecificationによって、1つを必要としません。

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"

出力には、新しいクラウドファイアウォールの基本的な概要が含まれています。 クラウドファイアウォールのIDをメモします。これは、ステップ3で使用して、ルールをファイアウォールに追加します。

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フラグを使用することもできます。 これは、複数のDropletが相互に通信するセットアップで特に役立ちます。

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

ドロップレットに接続できない場合は、How To Troubleshoot SSHのチュートリアルシリーズが問題の診断に役立ちます。

Dropletに正常に接続したら、SSHセッションを終了します。

[environment]
exit

Cloud Firewallが正常に機能していることを確認したので、Webサーバーへの着信トラフィックを許可する追加のルールを追加します。

[[step-3 -—- adding-additional-rules]] ==ステップ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に進んでください。

[[optional-step-4 -—- adding-droplets-to-the-firewall]] ==(オプション)ステップ4 —ファイアウォールへのドロップレットの追加

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

add-dropletsコマンドを使用して、クラウドファイアウォールにドロップレットを追加します。 このコマンドには、引数としてクラウドファイアウォール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コマンドを使用して、c7b39b43-4fcc-4594-88f2-160a64aaddd4のIDを持つweb-serversファイアウォールにtest-1ドロップレットを追加します。

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

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

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

--droplet-ids 51146959,52059458

それでは、タグを使用して、クラウドファイアウォールの管理を簡単にしましょう。

[[step-5 --- using-tags]] ==ステップ5—タグの使用

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

この手順では、ドロップレットにタグを付け、クラウドファイアウォールにタグを追加し、ファイアウォールから個々のドロップレット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

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

[。警告]##

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

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

[[optional-step-6 -—- removing-rules-from-the-firewall]] ==(オプション)ステップ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クラウドファイアウォールを作成し、それらのファイアウォールにルールを追加し、ファイアウォールにドロップレットを追加し、タグ付きのファイアウォールを管理し、ファイアウォールからルールを削除しました。

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

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

Related