2016-05-01 16 views
17

私は短命のタスクを起動し、これらをドッカーコンテナとしてスケジュールする特権を与えたいと思うアプリケーションがあります。私はdocker runでこれを簡単に行うことを考えていました。信頼できないコンテナスケジューラを制限する方法はありますか?

私はできるだけ攻撃面を小さくしたいので、私はアプリケーションを信頼できないものとして扱います。そのため、あらかじめ定義されたドッカーAPIエンドポイントに対して任意のdocker runコマンドを実行する可能性があります(コードベースにバグがあるか、コンテナが侵害された場合、入力が不適切にエスケープされたなど)。

私はいくつかの方法で、そのアプリケーション(効果的スケジューラ)を制限したい理由です:

  • --privileged使用を防ぐメモリ& CPUの制限
を強制 --read-onlyフラグ
  • を施行

    私はカップルを見ましたオプション:

    • SELinuxのポリシーは、ホストレベルに設定し、daemonレベルに--selinux-enabledフラグを経て容器の内部を伝播する必要があるであろう

      • selinuxを。ただし、スケジューラはrun --privileged経由でこれをオーバーライドすることができます。これらが唯一のコンテナの起動時に適用される
      • seccompは
    • AppArmorは
      • これは(再び)とすることができる(seccompフラグがdocker runために利用可能である)プロファイルスケジューラレベルでオーバーライド--privileged
    • ドッキングウィンドウデーモン--exec-optsフラグ
      • だけ1つのオプションは、このフラグのために実際に利用可能である(native.cgroupdriver

    ドッカーは、デフォルトでは、コンテナのスケジューラを信頼するように設計されているようです。 これは設計上の決定であれば誰でも知っていますか?

    私が逃した最新のDockerのバージョンでは、他に解決策がありますか?


    私はまた、唯一の特定の名前空間を使用する特定のスケジューラを強制する方法がありますと仮定すると、面白そうK8S名前空間にも適用することができるKubernetes、そのLimit Ranges & Resource Quotasを見ました。しかし、これにより、この問題の範囲が運用中のK8Sクラスタに拡大します。

  • +0

    「信頼できない」と「任意のコマンドを実行できる」とは、本質的に矛盾していると私は主張します。実際にどんなコマンドを実行しても、それを 'docker run'コマンドにすることを期待していますか?あるいは、 'docker run'への引数の文字列を指定できるようにしていますか? '--privileged = false'と' --read-only'フラグを追加するために 'docker run'プレフィックスを修正するだけではどうですか? 2番目の '--privileged'引数を指定するコマンドは失敗するはずです –

    +2

    ドキュメントでは、信頼できるユーザーのみがデーモンを制御することが許可されるべきであることが明示的に述べられています。だから興味深いかもしれないユーザの名前空間を除いて、それほど多くを見逃しているとは思えません。sudo permsを使ってランチャーシェルスクリプトを作って、あなたが "信頼できない"アプリケーションに 'ドッカーの実行 '引数。 –

    +0

    @ F.StephenQ私は "任意のコマンドを実行できる"とは、意図的に "意図的に"起こることではなく、偶発的に(例えば、アプリが侵害された、または不適切なエスケープなど) –

    答えて

    1

    niceと互換性があり、UNIXプラットフォーム上でドッキングウィンドウを実行しているかので、私は最初の「--cpu少しはより密接に、それはあなたが2番目のリンクから-cpuset-cpus="0,1"

    ようsomethign必要があるように見える探しに思うだろう-quotaは--cpuset-cpus ...と同じように見えますが、1つまたは複数のコアをプロセスに割り当てると、管理されるプロセッサ番号の代わりに管理されるだけです。

    関連する問題