容器为我们提供应用运行环境,所以在制作镜像的时候应该重点关注镜像安全问题,而不是随意制作。
这里总结以下几点:
- 以非root用户运行
- 保持镜像最小化
- 对镜像进行安全扫描
以非root用户运行镜像
在制作镜像的时候,默认都是以root用户在容器中运行,虽然此root用户和服务器上的root用户有区别,但是黑客可以利用这个用户来获取API密钥,令牌,密码等私密信息,或者通过提权等干扰服务器主机。
所以我们在制作镜像的时候要使用非root用户,比如下面一个java服务:
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用户起的应用。
保持镜像最小化
镜像并非越大越好,也并非越小越好,适合当前需求的镜像才是最好。不过在制作镜像的时候要坚持最小化原则,只安装需要的软件和包。
可以通过docker images 查看镜像大小,如下:
ubuntu latest f643c72bc252 7 weeks ago 72.9MB
对镜像进行安全扫描
把容器类比于主机,那么容器的安全和主机的安全同等重要,所以要镜像对每一个镜像进行安全扫描,发现高危漏洞及时打补丁,这样才能随时保持一个相对安全的运行环境。
目前Harbor 2.0以上已经可以自定义镜像扫描规则,也可以定义拦截规则,可以有效的发现镜像漏洞,其他公有仓库也有类似的功能。当然我们还可以在做CI的阶段对制品镜像进行扫描,通过的才交付。具体怎么做根据不同的需求而定。