主に静的にコンパイルされたgolangアプリケーションなどのマイクロサービスを実行するために、強化されたDockerインスタンスを設定したいと思います。私が探しているのは、ホストOSを不正なコンテナから保護し、コンテナを互いに保護することです。以下のシナリオで状況をまとめてみました。
シナリオ:
Alpine Linux(busyboxベースのOS)などの最小限のOSを実行するサーバーがあり、SElinuxとgrsecがインストール、アクティブ化され、正しく構成されています。
このサーバーでは、2つのコンテナー、AとB、ボリュームVを実行するDockerインスタンスを実行します。
コンテナーAには、パブリックインターネット(WebアプリまたはパブリックAPI)にネットワーク化された、依存関係のない静的にコンパイルされたアプリケーションが含まれています。このアプリケーションには、任意のコード実行/アップロード/完全リバースシェルのような、考えられないほどの大きなバグが含まれています。このコンテナは、アップロード先、データベースなどとしてボリュームVにもネットワーク接続されています。
ホストOSには、ルート時にのみ読み取ることができるフラグが含まれています(SElinuxによって適用されます)。
コンテナBにはフラグとアプリケーションも含まれていますが、外界との接続はありません。
攻撃者:
仮定:
目標:
質問:
私の提案:
ユーザーランドのない、最小限のDockerイメージを使用します。何かのようなもの:
FROM scratch
COPY app /
ENTRYPOINT ["/app"]
アプリを実行する前に特権を昇格させます。 (それを行うための適切な方法が何かわからない...)
/bin/sh
、/bin/ls
、またはそのようなものを呼び出そうとすると、アラームをトリガーするもの。強化ガイドラインについては、CISベンチマークを参照してください。 Dockerの現在のCISベンチマークは here にあります。これらは、ベースライン強化の業界標準として受け入れられています。また、Linuxなど、Webサーバー、DBなどのガイドラインも提供します。