iptables
自己管理型配置用のLinux ファイアウォールを構成する
現在の Linux システムでは、 iptables
プログラムは Linux カーネルのnetfilter
またはネットワーク パケット フィルタリング機能を管理するためのメソッドを提供します。 これらのファイアウォール ルールにより、管理者はシステムに接続できるホストを制御し、システムに接続できるホストを制限することでリスク露出を制限できます。
このドキュメントでは、Linux 上のiptables
ファイアウォールの基本的なファイアウォール構成について説明します。 これらのアプローチを、大規模なネットワーク組織の開始点として使用してください。 MongoDB のセキュリティプラクティスとリスクマネジメントの詳細については、「 セキュリティ 」を参照してください。
Overview
iptables
構成のルールは、特定のトラフィック ストリームをフィルタリングして処理するプロセスを記述する連鎖になります。 チェーンには順序があり、後のルールに到達するには、パケットがチェーン内の前のルールを通過する必要があります。 このドキュメントでは、次の 2 つのチェーンのみについて説明します。
INPUT
- すべての受信トラフィックを制御します。
OUTPUT
- すべての送信トラフィックを制御します。
すべての MongoDB プロセスの デフォルト ポート を考慮すると、アプリケーションと適切な およびmongod
インスタンスとの間の必要な通信mongos
のみ を許可するネットワーク ルールを構成する必要があります。
デフォルトでは、 iptables
のデフォルト ポリシーは、明示的に無効にされていない限り、すべての接続とトラフィックを許可することになっていることに注意してください。 このドキュメントで説明されている設定の変更により、明示的に許可されていないすべてのトラフィックをドロップするデフォルトのポリシーを使用して、特定のアドレスと特定のポートからのトラフィックを明示的に許可するルールが作成されます。 許可するトラフィックのみを許可するようにiptables
ルールを適切に構成したら、 デフォルト ポリシーをDROP
に変更できます。
パターン
このセクションでは、MongoDB の配置で使用するためにiptables
を構成するための多くのパターンと例を紹介します。 port
構成設定を使用して別のポートを構成した場合は、それに応じてルールを変更する必要があります。
mongod
インスタンスとの間のトラフィック
このパターンは、スタンドアロンmongod
インスタンスとして、または レプリカセット の一部として実行されているすべての インスタンスに適用されます。
このパターンの目的は、アプリケーション サーバーからmongod
インスタンスへのトラフィックを明示的に許可することです。 次の例では、 <ip-address>
をアプリケーション サーバーの IP アドレスに置き換えます。
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
The first rule allows all incoming traffic from <ip-address>
on port 27017
, which allows the application server to connect to the mongod
instance. 2 つ目のルールは、 mongod
からの送信トラフィックがアプリケーション サーバーに到達することを許可します。
注意
任意
アプリケーション サーバーが 1 つしかない場合は、 <ip-address>
を IP アドレス自体に置き換えることができます(例: 198.51.100.55
。 これは、198.51.100.55/32
として CIDR 表記を使用してExpressすることもできます。 可能な IP アドレスのより大きなブロックを許可する場合は、次のように、 <ip-address>
に次のいずれかの仕様を使用して/24
からのトラフィックを許可できます。
10.10.10.10/24 10.10.10.10/255.255.255.0
mongos
インスタンスとの間のトラフィック
mongos
インスタンスは、 シャーディングされたクラスターのクエリ ルーティングを提供します。 クライアントはmongos
インスタンスに接続します。これはクライアントの観点から見るとmongod
インスタンスとして動作します。 次に、 mongos
は、シャーディングされたクラスターのコンポーネントであるすべてのmongod
インスタンスに接続します。
これらのインスタンスとの間で、レプリカセットのノードであるmongod
インスタンスとの間でトラフィックを許可するには、同じiptables
コマンドを使用します。 「 mongod
インスタンスとの間のトラフィック」セクションで説明されている構成を例として取得します。
MongoDB Config Server との間のトラフィック
コンフィギュレーションサーバーは、シャーディングされたクラスターのメタデータを保存するコンフィギュレーションデータベースをホストします。 コンフィギュレーションサーバーはポート27019
の接続をリッスンします。 その結果、次のiptables
ルールをコンフィギュレーションサーバーに追加して、他のコンフィギュレーションサーバーへの接続用にポート27019
での受信接続と送信接続を許可します。
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27019 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27019 -m state --state ESTABLISHED -j ACCEPT
<ip-address>
を、コンフィギュレーションサーバーを提供するすべてのmongod
のアドレスまたはアドレス空間に置き換えます。
さらに、コンフィギュレーションサーバーは、クラスター内のすべてのmongos
インスタンスとクラスター内のすべてのmongod
インスタンスからの着信接続を許可する必要があります。 次のようなルールを追加します。
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27019 -m state --state NEW,ESTABLISHED -j ACCEPT
MongoDB シャード サーバーとの間のトラフィック
シャード サーバーのデフォルトのポート番号は27018
です。 各シャード間のトラフィックを許可するには、次のiptables
ルールを設定する必要があります。
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27018 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27018 -m state --state ESTABLISHED -j ACCEPT
<ip-address>
仕様をすべてのmongod
の IP アドレスに置き換えます。 これにより、構成レプリカセット ノードを含むすべてのシャード間での受信および送信トラフィックを許可し、次のようにします。
さらに、シャードは次の送信接続を行える必要があります。
: コンフィギュレーションサーバー内のすべての
mongod
インスタンス。
次のようなルールを作成し、 <ip-address>
をコンフィギュレーションサーバーとmongos
インスタンスのアドレスに置き換えます。
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27018 -m state --state ESTABLISHED -j ACCEPT
[1] | チャンク操作とバランシング操作を容易に行うために、クラスター内のすべてのシャードが他のすべてのシャードと通信できる必要があります。 |
監視システムへのアクセスの提供
で実行中のmongostat
--discover
診断ツールは、コンフィギュレーションサーバー、シャード サーバー、mongos
インスタンスなど、クラスターのすべてのコンポーネントにアクセスできる必要があります。
デフォルト ポリシーを に変更 DROP
iptables
チェーンのデフォルト ポリシーはすべてのトラフィックを許可することです。 すべてのiptables
構成の変更が完了したら、デフォルト ポリシーをDROP
に変更して、上記のように明示的に許可されていないすべてのトラフィックが MongoDB 配置のコンポーネントに到達できないようにする必要があります。 このポリシーを変更するには、次のコマンドを発行します。
iptables -P INPUT DROP iptables -P OUTPUT DROP
構成の管理と維持iptables
このセクションでは、 iptables
を管理および使用するための基本的な操作の数が含まれています。 iptables
構成の一部を自動化するさまざまなフロントエンド ツールがありますが、本質的にはすべてのiptables
フロントエンドが同じ基本機能を提供します。
iptables
すべての ルールを永続化します
デフォルトでは、すべてのiptables
ルールはメモリにのみ保存されます。 システムを再起動すると、ファイアウォール ルールはデフォルトに戻ります。 ルールセットをテストして、効果的にトラフィックを制御できることが保証されたら、次の操作を に使用して、ルールセットを永続的にする必要があります。
Red Hat Enterprise Linux、Fedora Linux、および関連するディストリビューションでは、次のコマンドを発行できます。
service iptables save
Debian、Ubuntu、および関連ディストリビューションでは、次のコマンドを使用してiptables
ルールを/etc/iptables.conf
ファイルにダンプできます。
iptables-save > /etc/iptables.conf
ネットワーク ルールを復元するには、次の操作を実行します。
iptables-restore < /etc/iptables.conf
このコマンドをrc.local
ファイルに、または他の同様の操作を使用して/etc/network/if-up.d/iptables
ファイルに配置します。
すべてのiptables
ルールを一覧表示する
現在適用されているすべてのiptables
ルールを一覧表示するには、システム shell で次の操作を使用します。
iptables -L
すべての ルールをフラッシュしますiptables
iptables
ルールを入力するときに構成を誤った場合、またはデフォルトのルールセットに戻す必要がある場合は、システム shell で次の操作を実行してすべてのルールをフラッシュできます。
iptables -F
すでにiptables
ルールを永続化している場合は、 「 すべてのiptables
ルールを永続化する 」セクションで適切な手順を繰り返す必要があります。