Skip to content

镜像安全

容器为我们提供应用运行环境,所以在制作镜像的时候应该重点关注镜像安全问题,而不是随意制作。

这里总结以下几点:

  • 以非 root 用户运行
  • 保持镜像最小化
  • 对镜像进行安全扫描

以非 root 用户运行镜像

在制作镜像的时候,默认都是以 root 用户在容器中运行,虽然此 root 用户和服务器上的 root 用户有区别,但是黑客可以利用这个用户来获取 API 密钥,令牌,密码等私密信息,或者通过提权等干扰服务器主机。

所以我们在制作镜像的时候要使用非 root 用户,比如下面一个 java 服务:

dockerfile
FROM openjdk:8-jre-alpine
RUN addgroup -g 1000 -S joker && \
    adduser joker -D -G joker -u 1000 -s /bin/sh
USER joker
ADD --chown=joker springboot-helloworld.jar /home/joker/app.jar
EXPOSE 8080
WORKDIR /home/joker
CMD  exec java -Djava.security.egd=file:/dev/./urandom -jar app.jar

运行容器后,即可看到是以 joker 用户起的应用。1e8c614594bbd4af514edd81a9bad0ba MD5

保持镜像最小化

镜像并非越大越好,也并非越小越好,适合当前需求的镜像才是最好。不过在制作镜像的时候要坚持最小化原则,只安装需要的软件和包。

可以通过 docker images 查看镜像大小,如下:

dockerfile
ubuntu                                                                            latest               f643c72bc252        7 weeks ago         72.9MB

对镜像进行安全扫描

把容器类比于主机,那么容器的安全和主机的安全同等重要,所以要镜像对每一个镜像进行安全扫描,发现高危漏洞及时打补丁,这样才能随时保持一个相对安全的运行环境。

目前 Harbor 2.0 以上已经可以自定义镜像扫描规则,也可以定义拦截规则,可以有效的发现镜像漏洞,其他公有仓库也有类似的功能。当然我们还可以在做 CI 的阶段对制品镜像进行扫描,通过的才交付。具体怎么做根据不同的需求而定。

最近更新