是否有可能限制docker守护进程只有build立图像(而不是运行容器)?
理由 :
我正在Docker( dind
)中使用Docker中的--privileged
标志来构build源代码中的图像。 我只需要build
, tag
, pull
和push
命令,并希望避免所有其他命令,如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代理。