docker 删除功能没有按预期工作?
docker dropping capabilities not working as expected?
从这个 docker 文档页面 - https://docs.docker.com/engine/security/#linux-kernel-capabilities
Processes (like web servers) that just need to bind on a port below
1024 do not need to run as root: they can just be granted the
net_bind_service.
下面是我的 Dockerfile -
FROM ubuntu:20.04
#FROM openjdk:11-jre-slim
LABEL description="This is hello-docker app"
LABEL version="1.0.0-snapshot"
#distro specific things before application specific things
#this will be cached, so you have to build with --no-cache option
RUN apt-get update && apt-get install -y openjdk-11-jdk
#just for demo - installed for demo
RUN apt-get install -y sudo
RUN sudo sh -c 'echo root:root | chpasswd'
#ENV APP_HOME /usr/apps
ENV APP_HOME=/myapps
RUN mkdir -p $APP_HOME
#with customuser/appuser
RUN groupadd appgroup && useradd -g appgroup appuser
#RUN groupadd -g 999 appgroup && useradd -r -u 999 -g appgroup appuser
#COPY --chown=appuser:appgroup hello-docker-0.0.1-SNAPSHOT.jar /
COPY --chown=nobody:nogroup hello-docker-0.0.1-SNAPSHOT.jar $APP_HOME
#documenting that the application exposes these ports
EXPOSE 8080 8081
#switching to non-root user. This is recommended for security purpose
#USER appuser
USER nobody
WORKDIR $APP_HOME
RUN pwd
RUN ls -l
# this command (bash) can be overwritten while running the image using arguments
#CMD ["bash"]
#ENTRYPOINT ["sh", "-c"]
#CMD ["exec java -jar hello-docker-0.0.1-SNAPSHOT.jar"]
ENTRYPOINT ["java", "-jar", "-Dserver.port=80", "./hello-docker-0.0.1-SNAPSHOT.jar"]
作为,可以观察到-我已经切换到nobody
用户。该用户不是 root。所以这个用户不应该能够绑定到任何低于 1024 的端口并且容器应该在启动时失败。但它成功了,我能够访问端口 80 上的 Web 应用程序。为什么。
我尝试明确删除该功能 - 但容器仍然成功。为什么还有????
docker run --name hello-docker -it --cap-drop net_bind_service --rm -p 80:80 dockerdemo/hello-docker:1.0
容器 运行 即使在删除网络绑定服务功能后也成功。
非常感谢任何帮助。
编辑 -
Q3 - 与上述相关。
上面提到的相同 docker 安全文档指向此页面 - https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19
这里的 default 指的是什么:> Capabilities g运行ted 到任何用户(root 或非 root)或仅 root 用户。如果只有 root,那么 g运行 对非 root 用户有什么能力。 None?
您没有绑定到特权端口的能力。发生变化的是,非特权端口不会从容器内部的正常 1024 开始。相反,它被设置为 0,因此每个端口都是无特权的。特权限制对于单个用户/单个应用程序环境没有意义。
有关更多详细信息,请参阅此 PR:
https://github.com/moby/moby/pull/41030
从这个 docker 文档页面 - https://docs.docker.com/engine/security/#linux-kernel-capabilities
Processes (like web servers) that just need to bind on a port below 1024 do not need to run as root: they can just be granted the net_bind_service.
下面是我的 Dockerfile -
FROM ubuntu:20.04
#FROM openjdk:11-jre-slim
LABEL description="This is hello-docker app"
LABEL version="1.0.0-snapshot"
#distro specific things before application specific things
#this will be cached, so you have to build with --no-cache option
RUN apt-get update && apt-get install -y openjdk-11-jdk
#just for demo - installed for demo
RUN apt-get install -y sudo
RUN sudo sh -c 'echo root:root | chpasswd'
#ENV APP_HOME /usr/apps
ENV APP_HOME=/myapps
RUN mkdir -p $APP_HOME
#with customuser/appuser
RUN groupadd appgroup && useradd -g appgroup appuser
#RUN groupadd -g 999 appgroup && useradd -r -u 999 -g appgroup appuser
#COPY --chown=appuser:appgroup hello-docker-0.0.1-SNAPSHOT.jar /
COPY --chown=nobody:nogroup hello-docker-0.0.1-SNAPSHOT.jar $APP_HOME
#documenting that the application exposes these ports
EXPOSE 8080 8081
#switching to non-root user. This is recommended for security purpose
#USER appuser
USER nobody
WORKDIR $APP_HOME
RUN pwd
RUN ls -l
# this command (bash) can be overwritten while running the image using arguments
#CMD ["bash"]
#ENTRYPOINT ["sh", "-c"]
#CMD ["exec java -jar hello-docker-0.0.1-SNAPSHOT.jar"]
ENTRYPOINT ["java", "-jar", "-Dserver.port=80", "./hello-docker-0.0.1-SNAPSHOT.jar"]
作为,可以观察到-我已经切换到
nobody
用户。该用户不是 root。所以这个用户不应该能够绑定到任何低于 1024 的端口并且容器应该在启动时失败。但它成功了,我能够访问端口 80 上的 Web 应用程序。为什么。我尝试明确删除该功能 - 但容器仍然成功。为什么还有????
docker run --name hello-docker -it --cap-drop net_bind_service --rm -p 80:80 dockerdemo/hello-docker:1.0
容器 运行 即使在删除网络绑定服务功能后也成功。
非常感谢任何帮助。
编辑 -
Q3 - 与上述相关。
上面提到的相同 docker 安全文档指向此页面 - https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19
这里的 default 指的是什么:> Capabilities g运行ted 到任何用户(root 或非 root)或仅 root 用户。如果只有 root,那么 g运行 对非 root 用户有什么能力。 None?
您没有绑定到特权端口的能力。发生变化的是,非特权端口不会从容器内部的正常 1024 开始。相反,它被设置为 0,因此每个端口都是无特权的。特权限制对于单个用户/单个应用程序环境没有意义。
有关更多详细信息,请参阅此 PR: https://github.com/moby/moby/pull/41030