防止访问 docker 容器内的代码
Preventing access to code inside of a docker container
我想构建一个可供客户使用的生产就绪图像,我想知道是否有办法阻止访问图像中的代码?
我目前的方法是将我的代码存储在 /root/
中并创建一个 "customer" 用户,该用户的主目录中只有一个启动脚本。
我的 Dockerfile 看起来像这样
FROM node:8.11.3-alpine
# Tools
RUN apk update && apk add alpine-sdk
# Create customer user
RUN adduser -s /bin/ash -D customer
# Add code
COPY ./code /root/code
COPY ./start.sh /home/customer/
# Set execution permissions
RUN chown root:root /home/customer/start.sh
RUN chmod 4755 /home/customer/start.sh
# Allow customer to execute start.sh
RUN echo 'customer ALL=(ALL) NOPASSWD: /home/customer/start.sh' | EDITOR='tee -a' visudo
# Default to use customer
USER customer
ENTRYPOINT ["sudo","/home/customer/start.sh"]
这种方法按预期工作,如果我进入容器我将看不到代码库但我可以启动服务。
我的 Dockerfile 中的最后一步是为 root 用户设置密码或完全删除它。
我想知道这是否是一个正确的生产流程,或者我是否在尝试使用 docker 来做一些不该做的事情?
如果这是正确的,我还应该锁定哪些其他内容?
感谢任何提示!
有你形象的人总能做到
docker run -u root imagename sh
任何可以 运行 Docker 命令的人都可以访问他们的系统(或者可以通过 docker run -v /etc:/hostetc ...
简单地给自己),因此可以自由地在 /var/lib/docker
看看那里有什么。如果以系统特定的方式分散在目录中,它将包含所有图像的所有内容。
如果您的源代码实际上是秘密的,您应该确保您使用的是编译语言(C、Go、Java 之类)并且您的构建过程不会意外泄露源代码到构建的图像中,它将与您将二进制文件分发给最终用户的任何其他地方一样安全。如果您使用的是脚本语言(Python、JavaScript、Ruby),那么本质上最终用户必须拥有能够 运行 程序的代码。
即使源代码没有构建阶段或状态,您也可以通过删除基础映像中的 bash 和 sh 来保护它。
通过这种方法,您可以限制用户不能通过这些命令进入您的 docker 容器和图像
docker (exec or run) -it (container id) bash or sh.
要在所有构建步骤之后采用这种方法,请在构建阶段结束时添加此命令。
RUN rm -rf bin/bash bin/sh
您还可以参考更多关于 google distroless 图像的信息,这些图像遵循与上述相同的方法。
您可以从 docker 组中删除用户并为 docker 启动和 docker 停止
创建 sudo
另外需要考虑的是 docker container export 的使用。这将允许任何人导出容器文件系统,因此可以访问代码文件。
我相信这会绕过删除 sh/bash 和其他人提到的任何用户权限更改。
我想构建一个可供客户使用的生产就绪图像,我想知道是否有办法阻止访问图像中的代码?
我目前的方法是将我的代码存储在 /root/
中并创建一个 "customer" 用户,该用户的主目录中只有一个启动脚本。
我的 Dockerfile 看起来像这样
FROM node:8.11.3-alpine
# Tools
RUN apk update && apk add alpine-sdk
# Create customer user
RUN adduser -s /bin/ash -D customer
# Add code
COPY ./code /root/code
COPY ./start.sh /home/customer/
# Set execution permissions
RUN chown root:root /home/customer/start.sh
RUN chmod 4755 /home/customer/start.sh
# Allow customer to execute start.sh
RUN echo 'customer ALL=(ALL) NOPASSWD: /home/customer/start.sh' | EDITOR='tee -a' visudo
# Default to use customer
USER customer
ENTRYPOINT ["sudo","/home/customer/start.sh"]
这种方法按预期工作,如果我进入容器我将看不到代码库但我可以启动服务。
我的 Dockerfile 中的最后一步是为 root 用户设置密码或完全删除它。
我想知道这是否是一个正确的生产流程,或者我是否在尝试使用 docker 来做一些不该做的事情?
如果这是正确的,我还应该锁定哪些其他内容?
感谢任何提示!
有你形象的人总能做到
docker run -u root imagename sh
任何可以 运行 Docker 命令的人都可以访问他们的系统(或者可以通过 docker run -v /etc:/hostetc ...
简单地给自己),因此可以自由地在 /var/lib/docker
看看那里有什么。如果以系统特定的方式分散在目录中,它将包含所有图像的所有内容。
如果您的源代码实际上是秘密的,您应该确保您使用的是编译语言(C、Go、Java 之类)并且您的构建过程不会意外泄露源代码到构建的图像中,它将与您将二进制文件分发给最终用户的任何其他地方一样安全。如果您使用的是脚本语言(Python、JavaScript、Ruby),那么本质上最终用户必须拥有能够 运行 程序的代码。
即使源代码没有构建阶段或状态,您也可以通过删除基础映像中的 bash 和 sh 来保护它。
通过这种方法,您可以限制用户不能通过这些命令进入您的 docker 容器和图像
docker (exec or run) -it (container id) bash or sh.
要在所有构建步骤之后采用这种方法,请在构建阶段结束时添加此命令。
RUN rm -rf bin/bash bin/sh
您还可以参考更多关于 google distroless 图像的信息,这些图像遵循与上述相同的方法。
您可以从 docker 组中删除用户并为 docker 启动和 docker 停止
创建 sudo另外需要考虑的是 docker container export 的使用。这将允许任何人导出容器文件系统,因此可以访问代码文件。
我相信这会绕过删除 sh/bash 和其他人提到的任何用户权限更改。