Droplanを使用してDigitalOceanプライベートネットワークインターフェイスを自動的にファイアウォールで保護する方法
序章
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
/opt
にdroplan
のディレクトリを作成し、そこにバイナリを移動します。
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
を終了します。
結論と次のステップ
単一のドロップレットでファイアウォールを構成したので、残りのインフラストラクチャでこのプロセスを繰り返す必要があります。 一握り以上のドロップレットの場合、このプロセスを自動化するのがおそらく最も簡単でしょう。 システムのプロビジョニングにHashicorpのTerraformを使用している場合は、DroplanGitHubプロジェクトにサンプルテンプレートがあります。 このような自動化タスクの概要については、構成管理の概要を参照してください。
ファイアウォールの詳細については、ファイアウォールとは何ですか?を参照してください。