Doctlを使用してDigitalOceanクラウドファイアウォールでWebサーバーインフラストラクチャを保護する方法
序章
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
フィールドは必須であり、tcp
、udp
、または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ファイアウォールのトラブルシューティング方法にアクセスしてください。