是否有可能限制docker守护进程只有build立图像(而不是运行容器)?

理由

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

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

我迄今为止的最佳select

由于Docker客户端通过HTTP进行通信(而不是套接字),因此我认为我可以在dind主机之前放置一个代理,并过滤所有path(例如POST /containers/create ),以限制仅访问构build/推送图像的API访问。

我想避免的是

永远不会绑定在主机上安装docker socket!


更新:

似乎 API路由器在Docker守护进程中是硬编码的。

更新2:

到目前为止最好的select,并configuration了一个阻止特定path(例如/containers )的nginx服务器。 这适用于构build图像,因为它是在dind图像中完成的,我的API限制不会影响构build过程。

不过 :这看起来真丑!

Docker本身不提供任何低级别的API安全。 这基本上是一个打开或closures开关。 你可以访问整个事物,或不。

保护API端点需要修改Docker,使其包含更低粒度的authentication和授权,或者如您所build议的,在两者之间添加一个API代理,以实现您的安全需求。

你可能要看的是Mulesoft的Osprey 。 它可以从简单的RAML定义中生成包含authentication机制的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中间件为你控制一切,然后你代理通过中间件到Docker的任何东西。

如果您想获得权限,可以使用OAuth 2.0范围 。

Docker客户端在auth中有点笨,但是你可以为每个包含key的请求附加自定义的http头。 config.json可以configurationHttpHeaders

从理论上讲,我相信答案是否定的。 在构build映像时,许多构build步骤将使用您的请求命令创build并运行容器。 所以,如果你设法禁用正在运行的容器,副作用应该是也禁用build设图像。 也就是说,如果您保护从受信任的用户运行docker命令的访问权限,并且该用户构build了不可信的Dockerfile,那么只要不使用各种CLI选项移除容器保护,该构build的结果应该与容器隔离。


编辑:我没有时间玩它自己,但扭锁可能提供您所需要的function,而无需创build和依赖api代理。