前書き
DigitalOceanCloud Firewallsは、ネットワークレベルで強力なファイアウォールサービスを提供し、不正なトラフィックからリソースを保護します。
DigitalOceanコントロールパネルからクラウドファイアウォールを構成できますが、管理するドロップレットが多数ある場合、プロセスのスクリプトを作成する必要がある場合、または端末からの作業を希望する場合は、コマンドラインインターフェイスの方が適しています。
このチュートリアルでは、doctl
(公式のDigitalOcean Command-Line Client)を使用して、Webサーバーのクラウドファイアウォールを作成および管理する方法を学習します。
前提条件
このチュートリアルでは、次のものが必要です。
-
doctl
バージョン1.7.0がインストールされ、official installation instructions in thedoctl
GitHub repositoryに従って認証されます。 (doctl version
コマンドを使用して、実行しているdoctl
のバージョンを確認します。) -
How To Use SSH Keys with DigitalOcean Dropletsチュートリアルに従って、DigitalOceanアカウントに追加されたSSHキー。
nyc1リージョンでUbuntu 16.04を実行するワンクリックLAMP(Linux、Apache、MySQL、PHP)スタックイメージを作成し、これを512MBのドロップレットに配置します。 ただし、このチュートリアルを開始する前に、How To Use Doctl, the Official DigitalOcean Command-Line ClientとAn 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
フィールドは必須であり、tcp
、udp
、または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にアクセスしてください。