前書き

DigitalOcean https://www.digitalocean.com/products/cloud-firewalls/ [クラウドファイアウォール]は、ネットワークレベルで強力なファイアウォールサービスを提供し、不正なトラフィックからリソースを保護します。

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

このチュートリアルでは、Webサーバーのクラウドファイアウォールを作成および管理するために、公式のhttps://github.com/digitalocean/doctl[DigitalOceanコマンドラインクライアント]である `+ doctl +`を使用する方法を学習します。

前提条件

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

  • `+ doctl `バージョン1.7.0は、https://github.com/digitalocean/doctl#installing-doctl [ doctl + `GitHubリポジトリの公式インストール手順]に従ってインストールおよび認証されます。 (実行中の `+ doctl `のバージョンを確認するには、 ` doctl version +`コマンドを使用します。)

  • DigitalOcean DropletsでSSHキーを使用する方法に従ってDigitalOceanアカウントに追加されたSSHキーチュートリアル。

  • nyc1 *リージョンでUbuntu 16.04を実行するワンクリックLAMP(Linux、Apache、MySQL、PHP)スタックイメージを作成し、これを512MBのドロップレットに配置します。 ただし、このチュートリアルを開始する前に、https://www.digitalocean.com/community/tutorials/how-to-use-doctl-the-official-digitaloceanを読んで、「+ doctl +」とクラウドファイアウォールに精通することをお勧めします-command-line-client [公式のDigitalOceanコマンドラインクライアントであるDoctlの使用方法]およびhttps://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-cloud-firewalls [入門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

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

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

doctl compute ssh-key list
OutputID         Name                  FingerPrint
9763174    sammy_rsa

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

次に、SSHキーを使用してUbuntu 16.04を実行するワンクリックLAMPスタックイメージを使用して、* nyc1 *領域に名前が付けられた512MBのドロップレットを作成する単一のコマンドですべてをまとめましょう。

doctl compute droplet create  \
   --region  \
   --image  \
   --ssh-keys  \
   --size

出力には、作成したばかりのドロップレットの概要が表示されます。これには、ドロップレットの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

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

doctl compute droplet list
OutputID          Name          Public IPv4       Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
    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
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 computedroplet list 」コマンドから取得したDroplet IDを使用して、「+」という名前のクラウドファイアウォールを作成し、ポート「22」およびすべてのインバウンドSSH接続を許可しますアウトバウンドTCP、UDP、およびICMP接続。 これにより、コマンドラインからサーバーを管理しながら、多くの基本的なサービスを正常に動作させることができます。

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

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

0/0 +」を使用します。

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

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

doctl compute firewall create --name  \
--droplet-ids  \
--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
   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                   droplet_id:,removing:false,status:waiting

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

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

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

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

また、次のように、複数の `+ address `または ` droplet_id +`フィールドを単一のルールに結合できます。

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

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

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

doctl compute ssh

ドロップレットに接続できない場合は、https://www.digitalocean.com/community/tutorial_series/how-to-troubleshoot-ssh [SSHのトラブルシューティング方法]チュートリアルシリーズが問題の診断に役立ちます。

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

[environment]
exit

Cloud Firewallが正常に機能していることを確認したので、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  \
   --inbound-rules "protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0"

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

doctl compute firewall add-rules  \
   --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 」コマンドを使用します。 このコマンドは引数としてクラウドファイアウォールIDを必要とし、 ` droplet-ids +`フラグを使用してファイアウォールを適用するドロップレットを決定します。

クラウドファイアウォールIDがわからない場合は、 `+ list`コマンドを使用します。

doctl compute firewall list
OutputID                                      Name                      Status       Created At              Inbound Rules                                                                                                Outbound Rules                                                                                                                                                  Droplet IDs    Tags              Pending Changes
   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
   test-1              203.0.113.1                                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
   web-1               203.0.113.2                                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

次の「+ doctl 」コマンドを使用して、「」のIDを持つ「」ファイアウォールに「+」ドロップレットを追加します。

doctl compute firewall add-droplets  \
   --droplet-ids

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

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

--droplet-ids ,

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

ステップ5-タグの使用

この時点で、個別のドロップレットをクラウドファイアウォールに追加しましたが、クラウドファイアウォールは複数のリソースの管理を容易にするためのタグもサポートしています。 タグの仕組みをよりよく理解するには、https://www.digitalocean.com/community/tutorials/how-to-tag-digitalocean-droplets [DigitalOcean Dropletsにタグを付ける方法]を参照してください。

この手順では、ドロップレットにタグを付け、クラウドファイアウォールにタグを追加し、ファイアウォールから個々のドロップレットIDを削除して、タグによってドロップレットを保護します。

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

doctl compute tag create
OutputName           Droplet Count
   0

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

doctl compute droplet tag  \
   --tag-name ""

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

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

doctl compute firewall add-tags  \
   --tag-names

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

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

--tag-names ,

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

doctl compute firewall remove-droplets  \
   --droplet-ids

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

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

(オプション)ステップ6-ファイアウォールからルールを削除する

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

`+ remove-rules `コマンドは引数としてファイアウォールIDを取り、ルールは `-outbound-rules `および `-inbound-rules +`フラグを使用して指定されます。 指定されたルールは、作成中に使用されたルールと正確に同じでなければならないことに注意してください。

doctl compute firewall remove-rules  \
   --inbound-rules

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

結論

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

クラウドファイアウォールを使用する他の方法については、https://www.digitalocean.com/community/tutorials/how-to-organize-digitalocean-cloud-firewalls [DigitalOceanクラウドファイアウォールを整理する方法]を参照してください。

また、クラウドファイアウォールのトラブルシューティングについては、https://www.digitalocean.com/community/tutorials/how-to-troubleshoot-digitalocean-firewalls [DigitalOceanファイアウォールのトラブルシューティング方法]にアクセスしてください。