web-dev-qa-db-ja.com

DockerコンテナーからWebアプリケーションをプロキシすることは良い習慣ですか?

現在の設定は次のとおりです。

  • 運用サーバー(ホスト)には、HTTP、HTTPS、および電子メール用のセキュリティ保護されたポートなど、いくつかの開いているポートしかありません。
  • ホスト上には、Dockerエンジンとコンテナーを実行している非特権ユーザーがいます。
  • いくつかのWebアプリケーションがDockerコンテナーで実行されており、それぞれがDockerランタイムによって提供される仮想ブリッジネットワークで実行されています。彼らは開いているポートHTTPとHTTPSを持っています。アプリケーションは、Apache 2などの任意のWebサーバーテクノロジで実行されていますか?またはAKKA-HTTP。
  • 1つの「http-proxy」コンテナのみが、そのポート(80、443)をホストに公開します。このコンテナーでは、特権のないユーザーがmodで保護されたApache 2サーバーを実行しています。このサーバーは、要求されたドメインに基づいて要求を転送し、アプリケーションコンテナーの1つに転送します。
  • メールサーバーは、ポートをホストに公開する非特権ユーザーのDockerコンテナーで実行されています。

質問は:

  1. このモデルに欠点はありますか?
  2. どうすればより安全になりますか?
  3. アプリケーションコンテナはどの程度攻撃にさらされていますか?
  4. Dockerに関するセキュリティ上の考慮事項はありますか?

ありがとう!

1
Dyin

このモデルに欠点はありますか?

ボリュームをチェックせずにローリングベースでアプリケーションをデプロイする場合のオーバーヘッドとディスク領域の使用を除いて、直接的な欠点はありません。 「コンテナーが削除された後もDockerデータボリュームは存続します。」 Dockerのドキュメントを参照

ただし、長期的な欠点がいくつかある場合があります。たとえば、これを運用環境で実行している場合、セキュリティ更新をコンテナに適用する頻度はどれくらいですか。 Dockerイメージが上流から削除されたステップであることを考えると、セキュリティパッチは十分に速く展開されない可能性があります。どのくらいの頻度でコンテナの更新を確認し、それらを再デプロイしますか?

また、ifコンテナの1つが0wnedになった場合、送信接続をフィルタリングしますか?アプリの些細なエクスプロイトがボットネットの一部になった場合はどうなりますか?

どうすればより安全になりますか?

場合によります。ホストの/ procまたは/ sysを任意のコンテナーにマウントしますか?もしそうなら、 この種の攻撃 に注意してください(そして、楽しい読み取りのために「docker escape」を検索してください)

アプリケーションコンテナはどの程度攻撃にさらされていますか?

ネットワーク境界の外部からの攻撃については、アプリケーションがシステム上で通常のUNIXプロセスとして実行されているかのように公開されます。

奇妙なことに、他のコンテナーからの攻撃の場合、実際には攻撃面が増加します:一部のコンテナーが他のコンテナーを参照できると仮定します(たとえば、Webサーバーがdbサーバーを参照できる、またはログサーバーなど)、各コンテナが追加のサービスを実行しないことを確認する必要があります。最も重要なことは最新の状態に保つことです

Dockerに関するセキュリティ上の考慮事項はありますか?

はい、しかし質問は広すぎます。コンテナ管理が不十分なため、Dockerエスケープがあります(例:マウント/proc)。 Dockerの悪用の可能性があります。ローカルユーザーが攻撃することを許可する misconfiguration が時々あります。展開して忘れるような特効薬を探しているなら、あなたは失望するでしょう...

2
lorenzog

Web/appserverの前で軽量プロキシを実行するのは良い考えです。私はApache httpdの大ファンですが、プロキシとしてはあまり良い選択ではないと思います。それは軽量からはほど遠いので、あなたのアーキテクチャは大量のトラフィックに対処しません。私はnginxまたはATSまたはおそらくニスをお勧めします。しかし、ATSやvarnishのmodsecurityポートはなく、nginxバージョンはApacheモジュールほど安定していません。 3つすべてに代替WAFがあります。それらが適切かどうかは、WAFで何をしているのかによって異なります。

Lorenzogが言うように、Dockerイメージはパッチのリリースで遅れがちです。サーバーの構成、展開、およびパッチへの対応を提案する方法については言及していません。

すべてのデーモンは非特権ユーザーとして実行する必要があり、Linuxディストリビューションのすべての標準アプリケーションはrunを非ルートユーザーとして実行しますが、ほとんどのデーモンは、小さい番号のポートを取得するためにルートとして開始します。番号の大きいポートで非ルートとして起動し、iptablesを使用してポート変換を行うか、linuxの機能を使用して、番号の小さいポートをバインドするか、他の場所でポートマッピングを行う権限を委任できます。ただし、これには構成ファイルのいじりが含まれ、配布パッチとの競合につながる可能性があることに注意してください。

1
symcbean

セットアップは異なる環境を十分に分離するので、1つのコンテナーの違反が別のコンテナーへのアクセスを与えないようにします。

チェックする必要があることの1つは、WebアプリケーションがDockerコンテナー内でrootとして実行されていないことです。 Webアプリケーションのコードは、通常のユーザーとして実行する必要があります。

0
Sjoerd