Dockerコンテナーのネットワークアクセスを制限する


14

私は、SFTP専用のDockerコンテナを作成中です。このコンテナは、独自のchrooted環境でファイルをアップロードおよび管理するためだけに複数の人が使用するコンテナです。

紙の上では、かなり安全です。bashログインのすべての形式を無効にし、その中で他のプロセスを実行しません。ただし、もう少し強化したいと思います。

このコンテナがSFTPサーバーであるという目的を除いて、このコンテナが内部からインターネットにアクセスするのを防ぎたい。

物事を明確にするために:私は外の世界が私のコンテナにアクセスするのを防ぐ方法を知っています-私は入ってくるiptablesルールを設定でき、Docker runコマンドでSFTPポートのみを公開できます。

ただし、コンテナ内で実行さたときに、次のコマンドを(例として)失敗させたいと思います。

curl google.com

私の意図は、ハッキングされたコンテナが受ける可能性のある損害を減らすことです(スパムメールの送信などに使用することはできません)。


この種のものを助けることができる保留中の機能要求がいくつかあります。#6743は、コンテナーが開始される前にホストでiptablesルールを事前に作成できるようにし、#6982は、コンテナーが開始されるときにiptablesルールを追加できるようにします。
パトリック14

Dockerを使用すると、コンテナのネットワークインターフェイスを完全に制御できます。Dockerがコンテナーをネットワーク化する方法を参照してください。たとえば、--net=noneフラグをオンに設定すると、docker runすべての外部ネットワークアダプターが無効になり、独自のネットワークアダプターを追加して、ネットワークトラフィックルールをカスタマイズできます。
sffc

回答:


4

攻撃を防ぐために、Dockerインスタンス内にいくつかのイングレスルールを置くことは依然として理にかなっていますが、Dockerイメージが接続するアップストリームルーターからのアウトバウンド(インターネット)アクセスを制限する必要があります。その理由は、インスタンス内のファイアウォールルールでアウトバウンドアクセスをブロックしようとすると、インスタンスが危険にさらされると、攻撃者によってそれらのルールが削除される可能性があるためです。インスタンスのルーターを介して出力をブロックすることにより、侵害が発生した場合でも送信アクセスをブロックできます。攻撃者もルーターを侵害する必要があります。


わかりましたので、フィルタリングがコンテナのホスト向けであると説明するコメントを受け取った後、何を達成しようとしているかが少し明確になります。その場合、ホストで次のようなルールを追加します。

iptables -A FORWARD -s lo.cal.sub.net -d con.tai.ner.ip -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d lo.cal.sub.net -j ACCEPT
iptables -A FORWARD -s ! lo.cal.sub.net -d con.tai.ner.ip -p tcp --dport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d ! lo.cal.sub.net -p tcp --sport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -m state --state related,established -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -j DROP

最初の2つのルールは、ホストとコンテナー間のアクセス用です。3番目のルールは、(おおよそ)SFTPに向かうホストのサブネットではないものはすべて問題ないということです。4番目は、基本的に3番目から2番目のアウトバウンドルールです。5番目のルールはキャッチオールです(使用されている他の関連ポートがある場合)。それは必要ではありませんが、おそらく削除できます。最後のルールは、ホストサブネット以外へのアクセスを防ぐ魔法です。アクセスは最初のいくつかのルールで与えられるため、前述のルールのいずれも適用されない限りトリガーされません。その場合、「私たちはあなたが望むものを気にしません。ここからは行けません」外部からの着信トラフィックは、3番目と4番目のルールによって満たされます。


コンテナの内容に絶対的な信頼を持たない限り、コンテナ内でこれを実行する方法がないことを考えると、興味深いダウン投票です。
エイブリーペイン14

Dockerコンテナのアップストリームルーター(デフォルトで最もサポートされている構成と仮定)は、それが実行されているホストであり、他のdocker機能を壊さずに、そのホスト(コンテナ内ではない)で単一コンテナのインターネットアクセス無効にする方法を探しています。
タルネイカルマン14

(ため息)わずか6時間の睡眠中に答えを書き直すべきではない。与えられた答えを修正しました。
エイブリーペイン14年

Docker(デフォルトで最もサポートされている構成を想定)は、ユーザー空間tcpプロキシ経由でホスト上のコンテナーポートを公開するため、転送チェーンがsftpサービスに関するルールに関連するかどうかもわかりません。
タルネイカルマン14

テスト環境をセットアップしてDockerを引き出して、何が関係しているかを確認する必要があると思います。ルールを前方から入力に移動することを提案しているようです。
エイブリーペイン14年

1

これは、実際にはドッカー固有の問題ではありません。これを解決する方法はいくつかあります。

  1. ステートフルiptablesルールを使用して、受信および関連/確立されたトラフィックの接続を許可し、他のすべてをブロックします。

  2. シェルを実行できないProFTPDなどのsftpのみのサービスを使用します。

一般に、ユーザーがシェルを取得することを許可せず、コンテナ内からプログラムを実行することを許可しない場合、心配する必要はありません。


1.)Dockerはデフォルトでいくつかのルールを独自に設定しますが、キャッチキャッチルールが既に設定されているため、それらに追加しても何も行われません。それほど些細なことではありません。2.)質問に答えません。そして、OPはすでにそのように設定しています。また、私のユースケースは異なります。
タルネーカルマン14

0

これは簡単なブレインストーミングであり、まだテストしていません。実稼働環境に持ち込む前に、ラボで検査する必要があります。

非SSH(SFTP)およびWebポートでのアウトバウンドトラフィックを防ぐには、IPTABLESまたは別のレイヤー4ファイアウォールを介して、0.0.0.0 / 0宛てのdockerコンテナーが使用するセグメントから発信されるトラフィックをDROPまたはREJECTするポリシーを適用することができます。ポートはTCP22です。

承認されないWeb上の場所への移行の問題を解決するには、squidまたはbluecoatなど、インターフェイスdocker0でリッスンし、使用しているフィルタリング/キャッシングプロキシのインスタンスを設定してみてください。インターネットに出るためのホストのデフォルトルート。そこから、多くの基準に基づいてポリシーを適用できるだけでなく、静的コンテンツをキャッシュすることでネットワーク使用率を節約できます。ホストマシンでNAT(IPTABLESとMasqueradeがLinuxでこれを提供していると思います)を使用して、プロキシの透過的な使用を強制したい場合があります(HTTPのみをプロキシしたいのですが、どうすればよいかわかり ません) HTTPSトラフィックで行います)。これは、そもそもあなたの会社の方針を順守しているウェブにアクセスする理由があることを意味します。

SSH(SFTPのベース)の性質上、コンテナが提供するキーペアのみを使用するポリシーを実装しない限り、ファイル移動のトラフィックを阻止することはできません。それはあなたに与えられるので、これは、あなたのために良いですいくつかの" 私は転送されたファイルに対して何らの可視性やコントロールがありませんでした顧客のいずれかが違法なものを転送した場合(IP侵害、分類ラベルを含む情報を流出させるためにサービスを使用する場合、またはCPで取引する場合)、顧客が何らかの理由で裁判所に連れて行かれた場合の防御(これは、頻繁に再転送され、変更されていないファイルをキャッシュできず、顧客との契約に書き込むポリシーが技術的な手段によって本質的に施行できないため、これは悪いことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.