将docker cli bash命令转换为供生产中使用的外部应用程序的api的最安全方法

时间:2018-10-22 16:45:55

标签: docker docker-compose docker-machine

我正在运行一个程序,该程序使用多个docker映像和容器,并且全部由代码生成和管理。同时,我需要输入docker exec -it cli bash并执行一些命令。但是,这些命令不能是手动的,必须做成api。广泛搜索之后,我发现最接近的东西是docker remote api [https://blog.trifork.com/2013/12/24/docker-from-a-distance-the-remote-api]。但是,我有点害怕弄混码头工人的内部。我希望生成和管理保持受程序控制。我只需要对docker cli运行有限数量的命令。 docker remote api是正确的方法吗?它会处理规模吗?我的应用程序可能会看到约27000个移动设备和Webapps使用/调用来自世界各地的api。经过尝试和测试的解决方案将是首选。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

对此没有一个简单的答案。由于您在问题标题中包括“最安全”,因此我建议您可能需要对应用程序体系结构进行一些重新设计。

第一个关键细节是:能够运行任何Docker命令或访问Docker API,意味着对主机的不受限制的根访问。您可以简单地docker run对主机文件系统具有可写的根级访问权限的映像,并窃取公用密钥,用户密码,授予自己sudo访问权限,等等。将其用作工作流程的核心部分非常危险。 完全打开Docker远程API极为危险。

作为一个必然结果,尽管docker exec作为调试工具很方便,但是您不能真正将其用作核心工作流程的一部分。如您所述,以可信任的管理员身份手动运行命令不会扩展。 Shell引用中也存在危险:您需要确保参数看起来不像foo; docker run -v/:/host ...,并且无意间获得了对主机系统的访问权限。

在我看来,您唯一真正的选择是“适当地”执行此操作。采取您需要执行的所有管理命令,并将它们包装在一些API中(可能基于HTTP)。构建一个(或多个)新服务并将其添加到您的Docker部署中。也许是在启动Shell脚本作为子进程的幕后,但是API包装器可以控制参数,并且可以仔细检查。好的一面是,如果您的应用程序确实需要扩展,则此方法可能不会成为瓶颈。