刚接触docker,是否能够保护我的源代码并添加权限?

24

我有兴趣使用Docker来托管我在工作中正在协助开发的项目。然而,我有几个关于它适用性的问题。

首先,我想知道是否有可能隐藏源代码以防止潜在用户/客户看到?显然,Docker政策的一部分是代码开源,但是否有任何方法添加权限以锁定除指定用户/开发人员之外的任何其他人?

其次,就我们正在开发的产品而言,某些用户可能只希望访问产品的一个方面。是否有任何方法可以向Docker注册表添加权限,使客户只能访问其请求的内容?

2个回答

8

不确定OP是否需要这个,但根据问题的上下文,VonC的答案可能是不完整的:

如果项目有可与项目源代码分开共享的交付成果物,则确实可以按照所建议的进行操作。例如,您可以使用Dockerfile创建图像设置系统,获取源代码,将项目编译为可交付成果物并删除源代码(或在其他地方编译并复制它)。这是构建此软件包并向客户发布它的一种好而安全的方式。这就是@VonC在他的答案中提出的内容。

我想补充一下,如果您正在查看的是某些难以从交付成果物中分离出代码的Web系统,例如HTML / PHP等系统,则会很棘手。

问题在于,最终图像将与客户端服务器相同。无论如何,它都是完全可访问的,并且上面的所有内容都是可以读取的。因此,即使不必在系统上保留源代码和机密信息,也不能使用docker作为打包方法来交付隐藏源代码的自包含系统。

因此,您无法锁定任何人访问该镜像;您只能确保编译项目所需的任何内容在最终图像中不可用。如果“秘密”内容在编译后不再需要,则这只是一种解决方案。


我需要澄清一些事情:对于像PHP和MySQL这样的Web应用程序,我们是否可以使Docker运行应用程序,即Docker的Web服务器(如Apache)读取、写入和执行应用程序源代码,同时防止任何其他用户进入Docker读取或编写该源代码。当然,这些文件的完全访问可以通过密码或类似于Docker本身而不是托管系统的sudo用户的方式来实现。 - SaidbakR
1
如果您想保护的用户具有运行容器的服务器的完全访问权限,则他们可以作为root“进入”容器。从那里开始,我不认为您如何保护您的代码,所以不行。底线是您不应将Docker用作保护系统。任何对非Docker有效的系统在此处都有效,但是那么就没有必要使用Docker(至少不是特别针对此用例)。 - Nanne
那么你认为,为了保护代码,我们可以使用字节码编译的方式,比如Zend Guard,或者加密`public_html'文件夹? - SaidbakR
1
当然可以,只要将实际源代码与容器分开即可。但这样做就与Docker无关了。这并不是坏事,就像您将其发布到客户完全可以访问的私有服务器一样。 - Nanne

5
Docker不会“托管项目”,它提供了指定执行环境(Dockerfile和docker build)并运行的可能性。
“源”(Dockerfile和资源,如项目源代码)根本不需要可用:只有构建的图像必须存在于其中才能运行docker。
该图像可以存储在私有注册表(docker distribution)中,并且它不包括您项目的源代码,而仅包括通过Dockerfile指令从这些源代码构建和安装到镜像中的交付内容(可执行文件)。
某些用户可能只想访问产品的某个方面,一个简单的解决方案是拥有:
- 几个图像(每个图像中都安装了产品的某个方面) - 几个docker图像注册表(每个注册表只能被某个客户组访问,并包含相关的图像)。

Kauê Oliveira评论中提出了一个有趣的问题:

容器运行时,它并不会阻止任何人访问代码。你可以进入容器进行sh操作并且做任何你想做的事情。

关于 "容器镜像是否包含应用程序源代码?" 也有类似的辩论。

当然,这取决于应用程序:

  • 编译后的应用程序可以利用 多阶段构建,并仅包含可执行文件
  • 解释性语言的应用程序可以将源代码分离,但仍然通过卷挂载可见(因此源代码仍在容器中可见,但不在镜像中)。

从那个线程中得到:

这个想法是,你的容器映像包含运行应用程序所需的一切,而没有其他(或者尽可能少的其他内容)。例如,如果你有一个Java应用程序,你不希望在最终只需要编译后的Java代码和JRE时,必须发送完整的JDK、所有构建工具和插件等。这会减小映像的总体大小和最终运行应用程序的安全足迹。
另外(使用PHP应用程序,可以说是解释性的):
为什么不从GitHub中拉取源代码?将你的凭据存储为env变量。这样,任何随机人员拉取你的映像都看不到你的代码,如果这是你关心的问题。老实说,PHP代码似乎从未如此复杂,以至于你无法理解某些函数是如何完成的。如果有人想窃取你的想法,他们会这样做,无论你如何试图混淆它。

当然可以,但是一旦容器运行起来,它并不能阻止任何人访问代码。你可以在容器中使用 sh 命令,并且可以做任何想做的事情(因为 Docker 总是以 sudo 模式运行)。 - Kauê Oliveira
@KauêOliveira 你会在哪里寻找这个代码源呢?如果 Dockerfile 没有使用 COPY 命令将其复制进去,那么它就不可访问。而在容器内部,你是由 Dockerfile 中的 USER 指令指定的用户,这个用户并不总是 root 用户。 - VonC
如果 Docker 文件没有复制它,那么 Genius 应该如何运行呢?如果应用程序正在运行,这意味着代码已经在镜像中了。此外,设置本地用户是为了使主机文件可以从容器内访问,并且对保护访问没有任何影响,因为 Docker 进程以 root 用户身份运行。 - Kauê Oliveira
@KauêOliveira 这确实取决于应用程序。如果应用程序首先在多阶段构建中编译,则只有生成的可执行文件会被复制到最终镜像中。 - VonC
@KauêOliveira 我已经在答案中包含了你有趣的问题,以增加其可见性,并提供了另一个讨论类似问题的线程的参考。 - VonC
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接