原理:
我在Docker中使用Docker(dind
)并在我的CI中使用--privileged
标志来构建源代码中的图像。我只需要build
,tag
,pull
和push
命令,并希望避免使用run
等所有其他命令(被视为所有安全问题的根源) )。
注意: 我只想限制Docker' remote API而不是守护进程本身!
到目前为止我最好的选择:
当Docker客户端通过HTTP(而不是套接字)与dind
进行通信时,我想我可以在dind
主机之前放置一个代理并过滤所有路径(例如POST /containers/create
)以限制API访问仅限构建/推送图像。
我想避免什么:
我永远不会绑定主机上的docker socket!
<小时/> 的更新
它是seems API路由器在Docker守护程序中的硬编码。
更新2:
到目前为止,我选择最佳选项,并配置了阻止特定路径的nginx服务器(例如/containers
)。这适用于构建图像,因为它是在dind
图像中完成的,我的API限制并没有阻止构建过程。
HOWEVER :这看起来很难看!
答案 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