我正在加固我们的Docker镜像,但对此有点薄弱的理解。目前我正在进行的步骤是防止用户以root身份运行容器。按照我的理解,“当用户运行'docker exec -it my-container bash'时,他应该是一个非特权用户”(如果我错了,请纠正我)。
当我通过docker-compose启动容器时,需要作为root运行启动脚本,因为它涉及导入证书和挂载文件(在外部创建并通过卷挂载可见)。完成后,我希望用户在以后的访问中成为“appuser”。这个问题似乎与我所寻找的内容相当吻合,但我正在使用docker-compose而不是docker run:如何禁用docker容器的root访问?
这似乎很相关,因为启动命令与例如Tomcat不同。我们正在运行一个Spring Boot应用程序,我们使用简单的“java -jar jarFile”启动它,并使用Maven的dockerfile-maven-plugin构建镜像。那么,在运行之前是否应将用户更改为非特权用户,还是之后呢?
我认为在Dockerfile内部更改用户而不是启动脚本将会实现这一点... 但是,它将不会作为root运行启动脚本,因此在需要root权限的调用上会失败。我也尝试使用ENTRYPOINT, 但可能做错了。同样,在yml文件中使用“user:”似乎使start.sh脚本以该用户而不是root身份运行,因此无法正常工作。
Dockerfile:
FROM parent/image:latest
ENV APP_HOME /apphome
ENV APP_USER appuser
ENV APP_GROUP appgroup
# Folder containing our application, i.e. jar file, resources, and scripts.
# This comes from unpacking our maven dependency
ADD target/classes/app ${APP_HOME}/
# Primarily just our start script, but some others
ADD target/classes/scripts /scripts/
# Need to create a folder that will be used at runtime
RUN mkdir -p ${APP_HOME}/data && \
chmod +x /scripts/*.sh && \
chmod +x ${APP_HOME}/*.*
# Create unprivileged user
RUN groupadd -r ${APP_GROUP} && \
useradd -g ${APP_GROUP} -d ${APP_HOME} -s /sbin/nologin -c "Unprivileged User" ${APP_USER} && \
chown -R ${APP_USER}:${APP_GROUP} ${APP_HOME}
WORKDIR $APP_HOME
EXPOSE 8443
CMD /opt/scripts/start.sh
start.sh脚本:
#!/bin/bash
# setup SSL, modify java command, etc
# run our java application
java -jar "boot.jar"
# Switch users to always be unprivileged from here on out?
# Whatever "hardening" wants... Should this be before starting our application?
exec su -s "/bin/bash" $APP_USER
app.yml文件:
version: '3.3'
services:
app:
image: app_image:latest
labels:
c2core.docker.compose.display-name: My Application
c2core.docker.compose.profiles: a_profile
volumes:
- "data_mount:/apphome/data"
- "cert_mount:/certs"
hostname: some-hostname
domainname: some-domain
ports:
- "8243:8443"
environment:
- some_env_vars
depends_on:
- another-app
networks:
a_network:
aliases:
- some-network
networks:
a_network:
driver: bridge
volumes:
data_mount:
cert_mount:
docker-compose脚本:
docker-compose -f app.yml -f another-app.yml $@
我希望的是任何内部尝试访问容器的人都会使用appuser而不是root进行访问。目标是防止某些人对不应该被更改的事物(如docker本身)进行篡改。
现在的情况是脚本会在应用程序启动后更改用户(通过echo命令证明),但似乎没有得到维护。如果我使用exec进入,我仍然是root。