Day26-保护鲸鱼人人有责(一)

前言

自从进入大容器时代後,Docker、K8s 已经逐渐成为开发、测试及部署时不可或缺的工具,但也因为这样跟容器有关的攻击越来越普遍

而想要从零开始建出一个容器,第一步就是要写 Dockerfile 把你的应用包装成 Docker image。关於怎麽产生出尽量小的 image 已经很多人写过了,所以这两天要来说说想要写出一个安全的 Dockerfile,有哪些该注意的地方

使用 stable 或 LTS 的 base image

很多人在写 Dockerfile 并不会特别指定 base image 的版本(就懒啊,我懂 XD),譬如说想要包一个 Node API server,就直接写 FROM node 或是 FROM node:latest

# Bad
FROM node

WORKDIR /app
COPY . .
RUN npm install
RUN npm run test

但这样可能会在哪次 build image 时就意外从 Node 14 升到 Node 16,导致部分功能直接坏掉。而且最新版本的 Node 可能有一些不为人知的 bug,需要有一些勇者去帮忙踩坑,所以除非是自己的 Side Project 想要玩玩看最新的 feature,否则直接把最新版本的 Node 用在 production 并不是个好作法

比较好的方式是先看看 Node 的 LTS(Long-Term Support) 版本是多少,像我在写文章的当下是 v14.17.5,那就选择 node:14 或是 node:14.17 作为 base image

# Good
FROM node:14

WORKDIR /app
COPY . .
RUN npm install
RUN npm run test

安装套件时要指定版本

这点跟上面提到的不要用 latest image 有些类似,不管你是用 apt-get install 安装 CLI 工具、用 npm install 装函式库、还是用 curl/wget 把东西下载回来编译,都要尽量确保每次下载到的东西是一样的

譬如在用 apt-get 安装 nginx 时就可以透过 apt-get install nginx=1.14.0 来下载指定版本(有点麻烦对吧,我也觉得XD),而 npm、pip 这类的语言套件管理工具则是看官方推荐什麽方法,像 npm 就是用 package-lock.json 来锁定套件的版本、pip 的话则是先跑 pip freeze > requirements.txt 把套件的版本冻起来,等要安装时再跑 pip install -r requirements.txt 把原本的套件装回来

# Good
FROM ubuntu:20.04

RUN apt-get update
RUN apt-get install nginx=1.14.0 python=2.7.15 nodejs=12.18.2

虽然把套件版本的锁定之後可以省下很多麻烦,但也不能一直锁在那都不更新,所以记得偶尔去检查一下版本是不是太旧了,如果太旧再手动把版号升上去就好了~

不要把敏感资料 hardcode 在 Dockerfile 里面

我想这已经是常识等级的安全知识了,因为直接把敏感资料用 ENV 写在 Dockerfile 里会让骇客轻易拿到(只要拿到 image 就可以了),所以绝对不要想不开把资料库或任何的帐号密码写在里面,ENV 顶多用来设定时区或是 NODE_ENV 这种被看光也不会出事的变数就好,不然哪天资料被偷走真的会哭出来

FROM node:14

ENV TZ=Asia/Taipei
ENV NODE_ENV=production

# Very Bad
ENV PG_HOST=test.postgresql.com
ENV PG_USER=thisIsmyUserName
ENV PG_PASS=mySecretPa55w0rd
ENV PG_DBNAME=projectName

COPY . .
RUN npm install
CMD ["node", "index.js"]

如果说 ENV 不能放敏感资料,那这些资料究竟要怎麽被加进环境变数呢?

答案就是在 docker run 时加上 --env 或是 --env-file 把环境变数塞进去;如果是用 docker-compose 的话,则是把那些资料写进 docker-compose.yml 的 environment 里面这样 container 启动时就会读到这些变数,而且即便 image 被偷走也不用担心资料外泄

小结

今天简单介绍了三个写 Dockerfile 时该注意的地方,但因为除了这几个之外其实还有很多,所以明天会再补充几个

如果对於今天的内容有什麽问题都欢迎在下方刘言提问,没问题的话那就明天见罗~


<<:  [Day26] 重设密码API – views

>>:  Day 27 : Python - 什麽是列表推导式?又该如何将它和if、if-else一起做使用?

Kubernetes 超入门

Kubernetes 超入门 Kubernetes 是一种让使用者管理Cluster 的一种工具,能...

Day18 - (补上昨天程序码) + BBT介绍

大家好,我是长风青云。早起跟朋友约、下午无缝接轨去帮弟弟搬宿、晚上一回到家就开始做ppt和发片。累瘫...

在Excel中输入 AAAA……

当您在Excel中直接输入AAAA,依旧是4个A,而喵喵酱我在Excel表格输入则是这个样子滴: 1...

[Day-01] - Learn Spring Framework In One Month. ​

本文章「Learn Spring Framework In One Month」目的在提供读者可快速...

Day 12 Classify images with the Custom Vision service

Some potential uses - Product identification, disa...