Droplanを使用してDigitalOceanプライベートネットワークインターフェイスを自動的にファイアウォールで保護する方法

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

序章

DigitalOceanのプライベートネットワーク機能は、同じチームまたはアカウントにあり、同じデータセンターにある他のDropletにのみアクセスできるネットワークインターフェイスをDropletsに提供します。

droplanユーティリティは、同じデータセンター内の他のドロップレットからのトラフィックのみを許可する iptables ファイアウォールルールを追加することにより、ドロップレット上のプライベートネットワークインターフェイスを保護するのに役立ちます。 各ドロップレットにユーティリティをインストールして実行することにより、システムが相互にローカルトラフィックのみを受け入れるようにすることができます。

このガイドでは、droplanを個々のドロップレットにインストールし、cronジョブをスケジュールして定期的に実行し、ドロップレットが再起動または電源が切れたときにファイアウォールルールが維持されるようにします。

前提条件

このガイドでは、同じリージョンに2つ以上のLinuxドロップレットがあり、それぞれが管理タスクのsudo権限を持つ非rootユーザーで構成されていることを前提としています。 具体的には、最近のDebian、Ubuntu、およびCentOSリリースの手順を提供します。 CentOSシステムでは、firewalldが無効になるため、既存のファイアウォール構成が上書きされる可能性があることに注意してください。

読み取り専用のパーソナルアクセストークンの取得

droplanユーティリティAPIにドロップレットのリストを要求するには、droplanコマンドは、読み取りスコープを持つパーソナルアクセストークンにアクセスする必要があります。 トークンを取得するには、DigitalOceanコントロールパネルにアクセスし、トップメニューの API をクリックして、新しいトークンの生成ボタンをクリックします。 トークン名フィールドに「droplanreadonly」などの新しいトークンのわかりやすい名前を入力し、書き込み(オプション)ボックスのチェックを外します。

トークンの生成をクリックし、結果のトークンをローカルマシンにコピーします。

:トークンのコピーを必ず保持してください。そうしないと、新しいトークンを生成する必要があります。 初めて表示された後は、コントロールパネルから取得できません。


このプロセスの詳細とAPIの使用の基本については、 DigitalOcean APIv2の使用方法を参照してください。

Droplanのインストール

DebianとUbuntuの前提条件のインストール

DebianまたはUbuntuなどのDebianから派生したディストリビューションを使用している場合は、apt-getを使用してunzipパッケージをインストールします。

sudo apt-get install unzip iptables-persistent

永続的なファイアウォールルールを構成するときに、すぐにiptables-persistentが必要になります。 インストール時に現在のファイアウォールルールを保存するかどうかをインストーラーから尋ねられる可能性があります。 はいと言っても害はありません。

CentOSの前提条件のインストール

CentOS 7を使用している場合は、yumを使用してunzipおよびiptables-servicesパッケージをインストールします。

sudo yum install unzip iptables-services

永続的なファイアウォールルールを構成するときに、すぐにiptables-servicesが必要になります。

アーカイブの取得と抽出

droplan GitHubプロジェクトのリリースページにアクセスし、アーキテクチャをサポートする最新リリースのURLを見つけてください。 URLをコピーし、ドロップレットの1つにログインして、wgetまたはcurlを使用してファイルを取得します。

wget https://github.com/tam7t/droplan/releases/download/v1.0.0/droplan_1.0.0_linux_amd64.zip

次に、unzipコマンドを使用して、リリースアーカイブからdroplanバイナリを抽出します。

unzip droplan_1.0.0_linux_amd64.zip

/optdroplanのディレクトリを作成し、そこにバイナリを移動します。

sudo mkdir /opt/droplan
sudo mv ./droplan /opt/droplan/

/optディレクトリは、ディストリビューションの公式パッケージリポジトリ以外のソースからインストールされたソフトウェアの標準的な場所です。

Iptablesルールの作成

droplanバイナリを配置すると、それを使用してルールを作成できます。 sudoでコマンドを実行し、DO_KEY環境変数をトークンに設定します。

sudo DO_KEY=personal_access_token /opt/droplan/droplan

次に、iptablesのルールを確認します。

sudo iptables -L

同じリージョンに他に2つのドロップレットがあるとすると、次のように表示されます。

OutputChain INPUT (policy ACCEPT)
target     prot opt source               destination
droplan-peers  all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain droplan-peers (1 references)
target     prot opt source               destination
ACCEPT     all  --  droplet_ip1       anywhere
ACCEPT     all  --  droplet_ip2        anywhere

これらのルールがeth1にのみ適用されることを確認するには、-vオプションを追加して、インターフェイスを含むより詳細な出力を行うことができます。

sudo iptables -L -v

永続的なIptablesルール

今のところ、同じリージョン内の他のすべてのドロップレットは現在のシステムに接続できますが、制御していないシステムからのトラフィックはブロックされます。 ただし、システムが再起動すると、iptablesルールは表示されなくなります。 また、将来のある時点で新しいドロップレットを作成する(または既存のドロップレットを削除する)可能性があります。 これらの問題に対処するために、再起動時にルールが持続することを確認し、droplanを定期的に実行して、ファイアウォールに必要な変更を加えるようにスケジュールします。

DebianまたはUbuntuでのルールの永続化

ファイアウォールルールは/etc/iptables/rules.v4(およびipv6ルールの場合は/etc/iptables/rules.v6)に保持されます。 iptables-saveコマンドを使用して、このファイルの新しいバージョンを生成できます。

sudo iptables-save | sudo tee /etc/iptables/rules.v4

CentOS7での永続的なルール

デフォルトでは、CentOS7はiptablesの代わりにfirewalldサービスを使用します。 上記のiptables-servicesパッケージはすでにインストールされているため、systemctlを使用してこのサービスを停止し、マスクして、再起動されないようにすることができます。

sudo systemctl stop firewalld
sudo systemctl mask firewalld

次に、iptablesサービスを有効にします。

systemctl enable iptables

iptablesサービスを配置したら、現在のファイアウォールルールを保存します。

sudo service iptables save

ルールの永続性のテスト

システムを再起動して再接続し、ルールが保持されていることを確認することをお勧めします。 まず、再起動します。

sudo reboot

次に、ドロップレットに再接続し(これには数秒かかります)、ルールを確認します。

sudo iptables -L

Iptablesルールを更新するためのcronジョブのスケジューリング

最後のステップとして、droplanが定期的に実行され、ドロップレットのコレクションの変更をキャッチできるようにします。

nano(または選択したエディター)を使用して、/opt/droplan/refresh.shという新しいスクリプトを作成することから始めます。

sudo nano /opt/droplan/refresh.sh

以下を貼り付け、先頭の#を削除して、ディストリビューションの適切な行のコメントを解除します。

/opt/droplan/refresh.sh

#!/usr/bin/env bash

/opt/droplan/droplan

# Uncomment for Centos:
# service iptables save

# Uncomment for Debian or Ubuntu:
# iptables-save > /etc/iptables/rules.v4

ファイルを終了して保存し、実行可能としてマークします。

sudo chmod +x /opt/droplan/refresh.sh

次に、/etc/cron.d/droplanに新しいファイルを作成します。

sudo nano /etc/cron.d/droplan

5分ごとにrootとしてスクリプトを実行するには、ファイルに次の行を追加します。

crontab

*/5 * * * * root PATH=/sbin:/usr/bin:/bin DO_KEY=personal_access_token /opt/droplan/refresh.sh > /var/log/droplan.log 2>&1

これにより、最初のフィールドの*/5で示されるように、5分ごとにrefresh.shスクリプトが実行され、最新の出力が/var/log/droplan.logに記録されます。

終了してファイルを保存します。 これで、watchコマンドを使用して、数秒ごとに別のコマンドの出力を表示し、スクリプトが正常に実行されることを確認できます。

sudo watch cat /var/log/droplan.log

スクリプトを実行すると、次のような出力が表示されます。

Sample CentOS OutputEvery 2.0s: cat droplan.log                      Fri Mar 25 01:14:45 2016

2016/03/25 01:14:02 Added 2 peers to droplan-peers
iptables: Saving firewall rules to /etc/sysconfig/iptables: [  OK  ]

Debianから派生したシステムでは、systemctl iptables saveは出力を表示しません。

Ctrl-Cを押してwatchを終了します。

:APIはレート制限されているため、ドロップレットが多数ある場合は、更新の頻度を調整する必要がある場合があります。 cronまたはAPI自体の詳細を読むことができます。


結論と次のステップ

単一のドロップレットでファイアウォールを構成したので、残りのインフラストラクチャでこのプロセスを繰り返す必要があります。 一握り以上のドロップレットの場合、このプロセスを自動化するのがおそらく最も簡単でしょう。 システムのプロビジョニングにHashicorpのTerraformを使用している場合は、DroplanGitHubプロジェクトサンプルテンプレートがあります。 このような自動化タスクの概要については、構成管理の概要を参照してください。

ファイアウォールの詳細については、ファイアウォールとは何ですか?を参照してください。