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

这里总结以下几点:

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

以非root用户运行镜像

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

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

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

运行容器后,即可看到是以joker用户起的应用。image.png

保持镜像最小化

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

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

ubuntu                                                                            latest               f643c72bc252        7 weeks ago         72.9MB

对镜像进行安全扫描

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

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