Docker Swarm 进阶:安全管理 Docker Secr
► 前言介绍
在 Docker Swarm 服务中, Secret 是一种 BLOB(二进制大对象) 数据, 就像密码、SSH 私钥、 SSL 证书或那些不应该未加密就直接存储在 Dockerfile 或应用程序代码中的数据。在 Docker 1.13 及更高版本中,可以使用 Docker Secrets 集中管理这些数据,并将其安全地传输给需要访问的容器。 一个给定的 Secret 只能被那些已被授予明确访问权限的服务使用,并且只能在这些服务任务正在运行的情况下。
不想在镜像或代码中管理的任何敏感数据,都可以使用 Secret 来管理,比如:
- 用户名和密码
- TLS certificates and keys
- SSH keys
- 其他重要数据:比如数据库名、内部服务器信息
- 通用的字符串或二进制内容 (最大可达 500 Kb)
提醒: Docker Secret 仅对 Swarm 服务有效,对独立的容器是无用的。如需使用,可以启动 1 个副本的服务来使用 Docker Secret。
另一个使用 Secert 的用例是在容器和一组证书之间提供一个抽象层。考虑一种场景:有开发、测试和生产三套环境,同一个应用程序在不同的环境中都可以拥有不同的凭证,并且以相同的 Secret Name 存储在开发、测试和生产集群中。这样容器只需要知道 Secret Name,就可以在不同的环境中正常工作。
当然,你也可以使用 Docker Secret 管理非敏感数据,比如配置文件。但是,非敏感数据还是建议使用 Docker Config 来管理。
► Docker Secret 基本操作
友情提示:“ 需 Swarm Manager 权限才能操作 !”
1、创建 Secret
用法
docker secret create [参数] SECRET [file|-]
参数
简写 | 参数 | 默认值 | 描述 |
---|---|---|---|
-d | --driver | Secret 驱动 | |
-l | --label | 配置标签 |
2、Secret 列表
用法
docker secret ls [参数]
参数
简写 | 参数 | 默认值 | 描述 |
---|---|---|---|
-f | --filter | 按条件过滤输出 | |
--format | GO 模板转化 | ||
-q | --quiet | 仅展示 ID |
3、Secret 详情
用法
docker secret inspect [参数] SECRET [SECRET...]
参数
简写 | 参数 | 默认值 | 描述 |
---|---|---|---|
-f | --format | GO 模板转化 | |
--pretty | 以人性化的格式打印信息 |
4、Secret 删除
用法
docker secret rm SECRET [SECRET...]
► Swarm 对 Secret 的管理
► 构建支持 Docker Secret 的镜像
如果你开发的容器可以作为服务进行部署,并需要敏感数据(如凭证)作为环境变量,则考虑调整镜像以便充分利用 Docker Secret。
一种方法是确保在创建容器时传递给镜像的每个参数也可以从文件中读取。
提醒:Docker Secret 不直接设置环境变量。这是一个有意识的决定,因为环境变量可能会无意中在容器之间泄漏(例如使用
--link
)
► 示例:安全构建 Wordpress 服务
1、创建文件 password.txt
,里面存入 Mysql 的 root 密码
touch password.txt
echo "myPassword" > password.txt
2、创建文件 wordpress.yml,用于启动 mysql 和 wordpress 服务,内容:
version: '3.3'
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
MYSQL_DATABASE: wordpress
secrets:
- db_password
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: password.txt
3、启动 wordpress 服务
docker stack deploy -c wordpress.yml wordpress
4、访问 wordpress