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"]
  1. 作为,可以观察到-我已经切换到nobody用户。该用户不是 root。所以这个用户不应该能够绑定到任何低于 1024 的端口并且容器应该在启动时失败。但它成功了,我能够访问端口 80 上的 Web 应用程序。为什么。

  2. 我尝试明确删除该功能 - 但容器仍然成功。为什么还有????
    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