私は短命のタスクを起動し、これらをドッカーコンテナとしてスケジュールする特権を与えたいと思うアプリケーションがあります。私はdocker run
でこれを簡単に行うことを考えていました。信頼できないコンテナスケジューラを制限する方法はありますか?
私はできるだけ攻撃面を小さくしたいので、私はアプリケーションを信頼できないものとして扱います。そのため、あらかじめ定義されたドッカーAPIエンドポイントに対して任意のdocker run
コマンドを実行する可能性があります(コードベースにバグがあるか、コンテナが侵害された場合、入力が不適切にエスケープされたなど)。
私はいくつかの方法で、そのアプリケーション(効果的スケジューラ)を制限したい理由です:
- は
--privileged
使用を防ぐメモリ& CPUの制限
--read-only
フラグ
私はカップルを見ましたオプション:
- SELinuxのポリシーは、ホストレベルに設定し、
daemon
レベルに--selinux-enabled
フラグを経て容器の内部を伝播する必要があるであろう- selinuxを。ただし、スケジューラは
run --privileged
経由でこれをオーバーライドすることができます。これらが唯一のコンテナの起動時に適用される - seccompは
- selinuxを。ただし、スケジューラは
- AppArmorは
- これは(再び)とすることができる(seccompフラグが
docker run
ために利用可能である)プロファイルスケジューラレベルでオーバーライド--privileged
- これは(再び)とすることができる(seccompフラグが
- ドッキングウィンドウデーモン
--exec-opts
フラグ- だけ1つのオプションは、このフラグのために実際に利用可能である(
native.cgroupdriver
)
- だけ1つのオプションは、このフラグのために実際に利用可能である(
ドッカーは、デフォルトでは、コンテナのスケジューラを信頼するように設計されているようです。 これは設計上の決定であれば誰でも知っていますか?
私が逃した最新のDockerのバージョンでは、他に解決策がありますか?
私はまた、唯一の特定の名前空間を使用する特定のスケジューラを強制する方法がありますと仮定すると、面白そうK8S名前空間にも適用することができるKubernetes、そのLimit Ranges & Resource Quotasを見ました。しかし、これにより、この問題の範囲が運用中のK8Sクラスタに拡大します。
「信頼できない」と「任意のコマンドを実行できる」とは、本質的に矛盾していると私は主張します。実際にどんなコマンドを実行しても、それを 'docker run'コマンドにすることを期待していますか?あるいは、 'docker run'への引数の文字列を指定できるようにしていますか? '--privileged = false'と' --read-only'フラグを追加するために 'docker run'プレフィックスを修正するだけではどうですか? 2番目の '--privileged'引数を指定するコマンドは失敗するはずです –
ドキュメントでは、信頼できるユーザーのみがデーモンを制御することが許可されるべきであることが明示的に述べられています。だから興味深いかもしれないユーザの名前空間を除いて、それほど多くを見逃しているとは思えません。sudo permsを使ってランチャーシェルスクリプトを作って、あなたが "信頼できない"アプリケーションに 'ドッカーの実行 '引数。 –
@ F.StephenQ私は "任意のコマンドを実行できる"とは、意図的に "意図的に"起こることではなく、偶発的に(例えば、アプリが侵害された、または不適切なエスケープなど) –