我想将我的应用程序以docker映像的形式交付给客户。但是至关重要的是,确保最终用户不要更改容器内部的任何内容。用户只能运行/停止容器并通过网络与容器交互。

是否可以禁止访问容器内部?
是否可以验证图像的完整性那个容器是用什么制成的?

评论

除非您确实管理Docker主机,否则我相信不会。您愿意通过阻止此访问来解决什么问题?

正如Tensibai所提到的,这取决于。如果出于安全原因需要知道该容器未修改,则基本上必须在自己的服务器上运行它。如果您只是想劝阻人们不要修改它,以免他们破坏事物,则可能有一些方法可以做到这一点。在这里描述用例会有所帮助。

#1 楼

简而言之,您不能阻止客户修改他们在自己的基础架构中运行的容器。容器不像二进制文件那样容易被混淆。它们是运行时环境。但是,您在容器内分发的代码可能会被混淆。

您的问题暗示了第三方支持问题:客户端修改了他们在自己的环境中运行的软件。如果您提供操作提供的容器的工具(例如,监视和记录),则客户应同意(作为软件许可的一部分)不要对它们进行未经授权的修改。这适用于所有类型的第三方软件,而不仅仅是容器。

根据您的情况,您还可以选择将应用程序作为在云基础架构中运行的软件即服务(SaaS)提供。

如果客户需要容器在其基础结构上运行,并且拒绝遵守修改限制,那么您可能不想尝试支持它们对软件的使用。

#2 楼

Docker没有提供任何手段来阻止用户访问该容器,但是作为图像开发人员,您可以遵循一些策略


对软件(红宝石,python等)进行模糊处理
从没有外壳的基本映像以及用户可以用来篡改映像的其他二进制文件构建映像。

当然,他们总是可以导出容器并重新打包,但那些容器是极端的措施...

评论


为什么将Ruby和Python作为混淆代码的示例?这些语言的代码通常作为明文源文件保存在执行的OS上。使用像C ++,C#,Java这样的编译语言还是像JS这样可以“最小化”的语言,是不是更可取?

– AjaxLeung
18年9月7日在6:56

@AjaxLeung很抱歉为您进行死角:) echo“ print('Hello')”> test.pyx; cython test.pyx-嵌入; gcc -Os -I /usr/include/python3.8/ -o test test.c -lpython3.8 -lpthread -lm -lutil -ldl

– Michael A.
20年4月20日在10:59

#3 楼

您可以从docker组中删除用户,并为docker startdocker stop创建sudos。

评论


只有拥有这些服务器才可能/有效...

–丹·科尼莱斯库(Dan Cornilescu)
17年5月7日,0:02



#4 楼

如果您的客户准备投资,那么您应该选择Docker企业版。在Docker EE中,您拥有一个UCP(Universal Control Plane) UCP工具。通过UCP,您可以创建角色和访问权限,并限制用户更改/修改容器。

如果要测试UCP而不是拥有一个月试用许可证的DDC(Docker数据中心),它将帮助您请按照您的要求详细说明。

希望这会有所帮助!

谢谢!

评论


作为有关Docker组的解决方案,如果您仅管理Docker主机系统,则此方法有效,OP听起来更像是分发映像...

–滕西拜
17年5月10日在11:47

#5 楼

通过ansible脚本进行交付。保留所有限制并检查ansible脚本。

评论


这将如何阻止访问容器?尝试解释您的主张将如何实际解决OP的问题。

–MichaëlLe Barbier
17年7月28日在12:47

#6 楼

首先,您没有问题。 Docker中的映像与整体ISO不同。它有层。运行时,Docker中的层是不可变的。

例如:


有人用哈希abc123构建Alpine图像
然后有人用以下内容基于Alpine(FROM alpine:abc123)构建Python图像哈希def456。
现在,您已经在Python(FROM python:def456)上构建了图像,并生成了哈希ghi789。

现在您的客户正在提取图像:

docker pull flask:ghi789


当他运行容器时,他在内存中获得了三个只读层(abc123,def456和ghi789)和一个最初为空的新的可读写层jkl357。稍后将在应用程序活动期间填充一些数据,例如-日志或诸如“ docker exec ...”之类的外部连接。 。

jkl357层仅在提交时变为不可变的(只读)。但是,这已经不是您的图像SHA,并且与您的应用无关:

docker commit -t my-altered-flask:tag



以上所说的都是相关的,除非您的目标是防止修改,而不是从所有阅读。