2016-08-31 2 views
4

理由dockerデーモンをイメージのコンテナ(コンテナを実行していない)だけに制限することはできますか?

私は、ソースコードのうち、画像を構築するために、私のCIに--privilegedフラグとドッカーでドッカー(dind)を使用しています。 buildtagpull、およびpushコマンドだけが必要で、run(すべてのセキュリティ問題の根源とみなされます)などの他のコマンドはすべて避けたいと考えています。

注:私はちょうどドッカーのremote APIはなく、デーモン自体を制限したいです!

私の最高のオプションは、これまで

ドッカークライアントがHTTPを介して(とないソケット)dindと通信したように、私は私がdindホストする前にプロキシを入れて、(例えばPOST /containers/createを)すべてのパスをフィルタリングすることができると思いましたビルディング/プッシュ画像へのAPIアクセスのみを制限する。

私が決してバインドがホストマシン上でドッキングウィンドウソケットをマウントします:私はを避けたい何


更新: APIルータはドッカーデーモンにハードコードされていることをそれseems

アップデート2:

私はこれまでのところ、私の最良の選択肢で行き、nginxのサーバブロック特定のパス(例えば/containers)を構成しました。これは、イメージがdindイメージで行われ、APIの制限がビルドプロセスを妨げないので、イメージの構築には問題ありません。

いつも:これは本当に醜いですね!

答えて

0

理論的な観点から、私は答えがノーだと信じています。イメージをビルドすると、多くのビルドステップで、要求されたコマンドでコンテナが作成され実行されます。したがって、実行中のコンテナを無効にすると、その副作用はビルドイメージを無効にすることになります。つまり、信頼できるユーザーから実行中のdockerコマンドへのアクセスを保護し、そのユーザーが信頼できないDockerfileを作成した場合、さまざまなCLIオプションを使用してコンテナ保護を解除しない限り、そのビルド結果をコンテナに隔離する必要があります。


編集:私はそれを自分自身を再生するには時間がなかったが、twist lockを作成し、APIプロキシに頼ることなく、必要な機能を提供することができます。

+0

フェアポイント!しかし、API(socket/tcp)上でコンテナを開始することを制限しても、デーモンがコンテナをイメージビルドのために内部的に起動できないというわけではありません。右? –

+0

ドッキングクライアントはビルド中に 'POST/containers/create'を送信しません。サーバは内部的にビルドプロセスを管理します。したがって、保護しているタスクを完了させる可能性のある内部サーバー・プロセスに影響を与えることなく、外部APIエンドポイントを保護することができます。 – Matt

+0

@YanFotoは[twist lock](https://github.com/twistlock/authz)を見ています。私はまだ実験室でこれを投げるチャンスはありませんでしたが、APIプロキシなしでリクエストをフィルタリングすることができます。 – BMitch

0

Docker自体は、APIに低レベルのセキュリティを提供していません。これは基本的にオンまたはオフのスイッチです。あなたは物全体にアクセスすることができます。

APIエンドポイントをセキュリティで保護するには、Dockerを変更して、認証と認可をより細かく設定するか、または示唆したようにセキュリティ要件を実装するAPIプロキシを追加する必要があります。

あなたが見たいかもしれないものは、MulesoftのOspreyです。単純なRAML定義から認証メカニズムを含むAPIミドルウェアを生成できます。私はあなたが通過できるようにしたいだけのコンポーネントを文書化して逃げることができると思う...

#%RAML 0.8 
title: Yan Foto Docker API 
version: v1 
baseUri: https://dind/{version} 

securitySchemes: 
    - token_auth: 
     type: x-my-token 

securedBy: [token_auth] 

/build: 
    post: 
    queryParameters: 
     dockerfile: string 
     t: string 
     nocache: string 
     buildargs: string 
/images: 
    /{name}: 
    /tag: 
     post: 
     queryParameters: 
      tag: string 

オスプレイはあなたがドッカーにミドルウェアを通じて取得何もプロキシ、その後、あなたはすべてを制御するためのAPIミドルウェアを生成します。

許可を得意とする場合は、OAuth 2.0 scopesを使用できます。

ドッカークライアントは認証になると少しダムですが、キーを含む可能性のある各リクエストにカスタムhttpヘッダーを添付できます。 config.json can configure HttpHeaders

+0

DockerのAPIを定義して別のミドルウェアを' nginx' :) –

+0

あなたはどちらか一方しか必要としません。物事が複雑になると、RAMLは読みやすく、監査するのがちょっとだけ簡単です。 – Matt

+0

あなたは正しいです。私は「プロキシなんて...ドッカーに」と読むのは間違いだ。しかし、単一の設定ファイルで 'nginx'(' alpine'コンテナで6MB)を走らせることは、 'node'サーバを走らせて設定するよりも快適です。 –

関連する問題