是否可以将docker守护进程限制为仅仅建立映像(而不是运行容器)?

时间:2016-08-31 10:31:47

标签: security docker

原理

我在Docker中使用Docker(dind)并在我的CI中使用--privileged标志来构建源代码中的图像。我只需要buildtagpullpush命令,并希望避免使用run等所有其他命令(被视为所有安全问题的根源) )。

注意: 我只想限制Docker' remote API而不是守护进程本身!

到目前为止我最好的选择

当Docker客户端通过HTTP(而不是套接字)与dind进行通信时,我想我可以在dind主机之前放置一个代理并过滤所有路径(例如POST /containers/create)以限制API访问仅限构建/推送图像。

我想避免什么

永远不会绑定主机上的docker socket!

<小时/> 的更新

它是seems API路由器在Docker守护程序中的硬编码。

更新2:

到目前为止,我选择最佳选项,并配置了阻止特定路径的nginx服务器(例如/containers)。这适用于构建图像,因为它是在dind图像中完成的,我的API限制并没有阻止构建过程。

HOWEVER :这看起来很难看!

2 个答案:

答案 0 :(得分:0)

从理论的角度来看,我认为答案是否定的。构建映像时,许多构建步骤将使用您请求的命令创建并运行容器。因此,如果您设法禁用正在运行的容器,那么副作用应该是禁用构建映像。也就是说,如果您保护对受信任用户运行docker命令的访问权限,并且该用户构建了一个不受信任的Dockerfile,那么只要您没有使用各种CLI选项删除容器保护,该构建的结果应该与容器隔离。

编辑:我自己没有时间玩它,但twist lock可以提供您所需的功能,而无需创建和依赖api代理。

答案 1 :(得分:0)

Docker本身不会在API上提供任何低级别的安全性。它基本上是一个开关。您可以访问整个事物。

保护API端点需要修改Docker以包含更低粒度的身份验证和授权,或者如您所建议的那样,在其间添加实现安全要求的API代理。

你可能想看的东西是来自Mulesoft的Osprey。它可以生成API中间件,包括来自简单RAML定义的身份验证机制。我认为你可以通过记录你想要允许的组件来实现......

#%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

Osprey为您控制所有内容生成API中间件,然后将通过中间件获取的任何内容代理到Docker。

如果您希望获得权限,可以使用OAuth 2.0 scopes

对于auth,docker客户端有点愚蠢,但您可以将自定义http标头附加到可能包含密钥的每个请求。 config.json can configure HttpHeaders