如何防止我预先构建的 docker 容器的用户能够访问该容器正在运行的实例中的 shell?我已经在 Google 上搜索并阅读了与此场景相关的所有帖子,但没有找到可行的解决方案。我试图阻止访问容器中的给定资源,为了便于查询,假设它是配置文件中的序列号。我正在基于Java:7基于Ubuntu图像。
要测试您的解决方案,请执行以下操作:
创建并运行你的 docker 容器
导出您的容器
docker export [容器名称] | gzip -c > mycontainer.tar.gz
在外部系统上导入容器
gzip -dc mycontainer.tar.gz | docker import - [容器名称]
运行容器
使用以下任何/所有方法进入正在运行的容器:
docker exec -it [容器名称] bash
docker attachment [容器名称]
docker run -ti --entrypoint=/bin/bash [容器名称]
[容器名称] 是您的容器的名称
bash、dash 和 sh 都是有效的 shell
答案1
补充 Jose 的回答,另一个解决方案是......
docker exec :id -it /bin/rm -R /bin/*
这样就可以摆脱 sh 和 Linux 中任何有用的 bin 命令。我不确定你到那时要做什么才能进入容器。虽然我知道你可能能够使用内存调试器来获取正在运行的容器的环境变量,但这会让事情变得更加烦人……我想知道是否有办法锁定 ring 0 中的内存并完全取消对主机的 ssh 访问权限。
如果有人知道如何解决这个问题,我很想知道如何解决。
编辑
如果您要保护敏感信息,则需要使用 docker secrets。请查看:
答案2
具体到命令,我在.bashrc文件的末尾bash
添加了该命令,这样用户登录后最后被踢出,但是用户仍然可以使用命令。exit
sh
答案3
如果您要保护的信息是序列号,那么加密该信息是唯一可靠的保护方法。您可以选择多种方式来加密机密数据,请确保使用强密钥。您还可以让应用程序将机密数据发送到服务器以识别其有效性,并根据服务器的回复,应用程序可以继续工作或停止并显示消息。
简而言之,始终假设您的应用程序可以被完全彻底地剖析。始终使用强密钥加密所有机密和重要数据,因此破解密钥将需要很长时间(假设加密算法是公开的或众所周知的)。
即使您找到了方法,仅靠阻止访问也只会给人一种虚假的安全感。