Day 17:Docker 的机敏资料管理

记得在第十五天的时候我有提过,目前 NOJ 有其中一个问题是我们会把一些机敏资料,像是 JWT 使用的 secret、沙盒的 token 等等放在 docker compose 的设定档里面,导致了我们没办法将这些 config 公开,因此导致管理困难,虽然还有一部分是根本没有写这些设定的文件啦...那又是另外要处理的问题了。

接下来就稍微介绍一下有关在 docker 里面如何管理这些机敏资料吧。

环境变数

首先第一个做法是环境变数,不管是不是使用容器部署服务,这其实都是一个常见的设定手法。以 docker compose 来说,有两种方式可以设定容器的环境变数。

  • environment文件):
    这个 section 可以透过 array 或是 map 来直接设定容器内的环境变数。所以在这种情况下,我们的设定会被直接写在 docker-compose.yml 里面,但若是透过 docker compose 的变数替换,则可以不需在里面直接明文写入这些设定,不过问题会变成 host 上面的环境变数要怎麽设定。
  • env_file文件):
    这个 section 可以指定一些档案,并且从里面去读取环境变数,然後把它们注入到容器内。使用这种方式的话,就可以避免把设定直接写进 docker-compose.yml 里面,相对於 environment 应该算是更适合储存这些机敏资讯的选项,不过需要注意不要不小心提交这些档案进版控。

docker secret

docker 还提供了另一种管理设定的方式,称之为 secret,也是可以透过基於档案的方式,把设定注入到容器里面。那麽他跟 env_file 这个 docker compose 里面的 section 有什麽差别呢,就我目前查到的主要有两点。

  • 设定後无法检视:
    这边指的是透过 docker secret create 这个命令去创建的 secret,之後使用 docker secret inspect 检视 secret 资讯的时候,并不会将当初设定的值显示给使用者。不过需要注意的是,透过这种方式创建 secret 只有在 docker swarm mode 支援。
    若是使用 docker compose 在本机部署的话,可以使用基於档案的 secret 把设定的内容挂载进容器内。
  • 会加密:
    根据官方文件的说明,docker 在管理 secret 时不管是传输还是储存时都会加密,然而在传输其他资料的时候并不一定。

综上所述,secret 应该是比起环境变数更加安全的选项,不过若是选择透环境变数设定容器的话,也是可以设计成支援透过 secret 去设定服务(从指定路径读取档案内容,因为 docker 的 secret 会被挂载到 /run/secrets 这个资料夹底下),我想在需要扩展的时候会更好。像是有些 image(例如 MySQL)可能会有像是 PASSWORDPASSWORD__FILE 这样两个环境变数都可以去设定 PASSWORD 的,只是带 FILE 後缀的是从档案读。

volume

还有一种常见的做法是透过 volume 挂档案进去容器,例如说服务可能需要一个叫做 config.json 的档案去设定,那就可以把这个档案透过 volume 挂进去。

小结

今天统整了几种管理机敏资料的方式,除了上述几种之外,也有像是 Vault 这种专门的服务,不过以我的例子来说应该是不需要用到这种复杂的东西,先使用 env file 把那些设定从 docker-compose.yml 里面分出来就好。

另外,我觉得 docker 官方文件有关安全性的部分(这里)值得一读,至少在我当初不熟悉 docker 时从里面了解到不少设计上需要注意的部分。

参考资料


<<:  Day 16 - 用 useReducer 取代 Redux !?

>>:  那些被忽略但很好用的 Web API / MessageChannel

EP01 - 开始建置流程之前

英国面包、法国面包、德国面包通通都有, 就是没有属於日本的面包既然如此今後只好自己创造, 这故事就...

小菜鸡学程序!用 Golang 来跟世界说 Hello 吧!

这系列文章会用 Golang 来做说明,希望可以用比较简单、直白的方式来说明一些程序的概念,让没有基...

操作授权 (Authorization to Operate:ATO)

-NIST SDLC 和 RMF RMF:授权系统( Authorize System) 授权是授...

html 输入框

今天来写一个输入框,以下是html内的程序码 <input type="text&q...