三个实用的Docker 密钥管理案例

2024/10/15 21:03:35

本文主要是介绍三个实用的Docker 密钥管理案例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

如在先前的文章中提到的,Docker secrets 是一种安全地管理 Docker 化环境中敏感信息的方法。您可能已经知道如何在 compose 文件中使用 secrets,以及如何使用 docker secret 命令来管理它们。

作为上一篇文章的后续,我们将探讨 Docker secrets 的三个实用案例。我们将展示如何在 Dockerfile 中使用 Docker 密钥,如何使用 Docker 密钥管理 WordPress 密钥,以及如何回滚一个密钥。通过这些实际示例,你将更好地理解如何在实际环境中使用 Docker 密钥。

前提条件

要充分理解本文中的实际示例,您应该对 Docker 和 Docker 密钥有一些基本的认识。如果您还不太了解 Docker 密钥,可以查看之前的博客文章了解更多信息。

此外,你需要在你的机器上安装 Docker,并且最好启用 Docker Swarm。

在 Dockerfile 中使用 Docker Secrets:

在某些情况下,您可能需要将密文直接嵌入到Docker镜像中。这在需要在构建时存在密文时构建镜像时可能是必要的。在这个例子中,我们将使用Dockerfile将机密信息嵌入到Docker镜像中。

步骤 1:创建一个秘密

首先,您必须创建一个秘密凭证,并将其包含进Docker镜像。可以使用docker secret create命令创建。

在本教程中,你在主目录(如 $HOME/.aws/credentials)里有一个名为 aws_credentials 的文件,里面存储了 AWS 访问密钥。

步骤 2:新建一个 Dockerfile

在你的项目目录中创建一个Dockerfile。这个Dockerfile将定义构建Docker镜像的步骤,包括如何访问及使用敏感信息。

FROM your_base_image
# 从基础镜像开始 (chóng jīchǔ jìngxiàng kāishǐ)
# 创建一个存放凭证文件的文件夹  
RUN mkdir -p /run/secrets  
# 将凭证文件复制到容器中  
COPY $HOME/.aws/credentials /run/secrets/aws_credentials  
# 在构建过程中使用凭证  
RUN --mount=type=secret,id=mytoken  
TOKEN=$(cat /run/secrets/aws_credentials)  
# 在此处添加你的构建命令

your_base_image 替换为你为 Docker 镜像所用的基础镜像。

此Dockerfile创建一个用于存放密钥文件的目录,将密钥文件复制到容器中,然后在构建过程中使用该密钥文件。--mount=type=secret,id=mytoken标志可以让您将密钥文件安全传递给构建过程。

在实际情况中,你需要把 # Your build commands here 替换成用来构建你自己的 Docker 镜像的特定命令。

注意:如前文所述,不建议通过像Git这样的版本控制系统共享秘密。在这个例子中,假设这个秘密文件被存储在您本地的电脑上,因此不会被分享给其他人。

步骤 3 构建你的 Docker 图像

现在,记得要用 docker build 命令构建 Docker 镜像。记得要用 --secret 标志将秘密传递给构建流程。

    docker build --secret id=mytoken . # 使用 --secret 选项设置密钥 id 为 mytoken

此命令将在构建您的Docker镜像时,安全地传递密文到构建过程。

步骤 4:在应用中使用秘密

你现在可以根据需要使用该密钥。例如,如果你的应用程序使用访问密钥(access key)与 AWS 服务进行交互,可以通过 Dockerfile 中设置的 TOKEN 环境变量来访问它。

注意哦: 记得将 mytoken 替换为有意义的标识符,用于您的密钥。例如本例中的 aws_credentials 文件应被安全存储,并且只能由授权用户访问,确保安全。

管理 WordPress 里的秘密设置

WordPress 是一个非常流行的内容管理系统,通常需要安全地管理比如数据库密码这样的敏感信息。

在这个示例中,我们将利用 Docker secrets 来管理敏感凭证,如数据库密码,创建单个节点的 MySQL 和 WordPress 服务。我们将为 WordPress 设置 MySQL 数据库,并配置 WordPress 连接到 MySQL。

概要

下面是一个概要

这个教程可能会有点复杂,所以咱们一步一步来。

  1. 生成随机的字母数字密码用于MySQL的root用户和WordPress数据库。
  2. 为MySQL和WordPress创建Docker密钥(secrets)。
  3. 使用Docker密钥配置MySQL服务。
  4. 配置WordPress服务以使用带有Docker密钥的MySQL数据库。
  5. 验证服务是否运行并测试WordPress的功能。
步骤 1:生成 Docker 秘钥信息

为 MySQL root 和 WordPress 网站的数据库生成一些随机密码:

    # 生成 MySQL root 用户的密码  
    openssl rand -base64 20 | docker secret create mysql_root_password -
生成一个随机的MySQL root用户的密码,并将其存储为一个Docker密钥。
    # 生成WordPress数据库密码的一个命令是这样的:  
    openssl rand -base64 20 | docker secret create mysql_password -
    # 该命令使用openssl生成一个随机的Base64编码字符串,并将其设置为Docker秘密mysql_password。

你现在应该已经创建了两个 Docker secrets 文件,它们看起来像这样:输出类似于:

uxm1a4sjjsg7enq2m1dtmvnon  
5judi7jm6d02xs99lj8061wul

注:以上为随机生成的字符序列,无需翻译或解释。
步骤 2:启动 MySQL 服务

使用 Docker 的 secrets 创建一个 MySQL 服务:

    docker network create -d overlay mysql_private
    # 创建一个名为mysql_private的overlay网络 (Create an overlay network named mysql_private)
docker service create \  
    --name mysql \  
    --replicas 1 \  
    --network mysql_private  --使用网络 mysql_private \
    --mount type=volume,source=mydata,destination=/var/lib/mysql  --挂载类型为 volume, 源为 mydata, 目标为 /var/lib/mysql \
    --secret source=mysql_root_password,target=mysql_root_password \  
    --secret source=mysql_password,target=mysql_password \  
    -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password"  # 设置 MYSQL_ROOT_PASSWORD_FILE 环境变量为指定路径 \
    -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password"  # 设置 MYSQL_PASSWORD_FILE 环境变量为指定路径 \
    -e MYSQL_USER="wordpress"  # 设置 MYSQL_USER 环境变量为 wordpress \
    -e MYSQL_DATABASE="wordpress"  # 设置 MYSQL_DATABASE 环境变量为 wordpress \
    mysql:latest  # 使用最新的 mysql 镜像

请提供具体的英文文本以供翻译。

v87xhur2iqhwhvmql11345l7k  
总进度:1 项   
1/1: 运行   [==================================================>]   
验证中:服务已稳定

此命令创建一个带有指定密钥信息和环境变量的MySQL服务。该MySQL服务将连接到mysql_private overlay网络。

第三步:搭建 WordPress 站点

搭建一个WordPress服务,使用Docker密钥连接到MySQL数据库:

    docker service create \  
        --name wordpress \  
        --replicas 1 \  
        --network mysql_private \  
        --publish published=30000,target=80 \  
        --mount type=volume,source=wpdata,destination=/var/www/html \  
        --secret source=mysql_password,target=wp_db_password \  
        -e WORDPRESS_DB_USER="wordpress" \  
        -e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" \  
        -e WORDPRESS_DB_HOST="mysql:3306" \  
        -e WORDPRESS_DB_NAME="wordpress" \  
        wordpress:latest

你应该看到类似这样的输出:

    whoumrpbcry3exply4fl9euue  
    总体进度:1/1 任务已完成
    1/1: 运行   [==================================================>]   
    验证:服务已就绪

此命令创建了一个使用Docker secrets连接到MySQL的WordPress服务实例,该服务在端口30000上可访问。

第四步:验证并测试

最后,检查服务是否在运行,并测试一下 WordPress 的功能。

docker service ls
    # 测试一下 WordPress  
    docker service ps wordpress

你的结果应该类似于——

    ID             名称          镜像              节点             期望状态   当前状态                      错误信息     绑定的端口  
    q2qzd1d2hup1   wordpress.1   wordpress:latest   docker-desktop   运行中       已运行 2 分钟了

访问 http://localhost:30000/ 从任何 swarm 节点上,通过网页向导来设置 WordPress。确认 WordPress 可以正常运行,并且其状态能够保存在服务重启之后。

注意哦: 运行服务需要一个正在运行的Docker Swarm。如果你用的是Docker Desktop,可以通过docker swarm init启用Swarm模式。

旋转回的秘密

旋转一个密钥意味着改变其值而不干扰使用它的服务。这是重要的安全措施,旨在阻止未经授权获取敏感信息。

本教程将展示如何在Docker中更换密钥。我们将基于之前的用例,创建一个带有新MySQL密码的新密钥,更新MySQL和WordPress服务使其使用新密钥,最后移除旧密钥。

第一步:创建一个新的秘密

创建一个新密码,并将其保存为名为 mysql_password_v2 的密钥。

使用openssl生成一个20字节的base64随机字符串,然后用docker secret创建一个名为mysql_password_v2的秘密。

openssl rand -base64 20 | docker secret create mysql_password_v2 -
vwqvnkm1gploicqk2g32vwpf2
更新服务步骤 2

更新 MySQL 服务,使其能够访问旧密令和新密令。移除旧密令并添加新密令。

docker 服务更新 \  
    --secret-rm mysql_password mysql \  
(移除名为 mysql_password 的密钥并更新服务 mysql)
    docker service update \; # 更新docker服务以添加新的密钥配置
    --密钥配置添加 source=mysql_password,target=old_mysql_password \; # 源密钥:mysql_password 目标密钥:old_mysql_password
    --密钥配置添加 source=mysql_password_v2,target=mysql_password \; # 源密钥:mysql_password_v2 目标密钥:mysql_password
    mysql # 更新mysql服务

你可以看到类似这样的输出:

    mysql  
    总进度:1/1 任务   
    1/1: 运行 [==================================================>]   
    验证:等待 5 秒验证任务是否稳定...   
    服务更新暂停:任务 f98yfogvf606ddrdc0z3b1paf 失败或提前终止,更新暂停
    mysql  
    总进度: 1 个任务中的第 1 个  
    1/1: 运行   [==================================================>]   
    验证: 服务已就绪

此命令将 MySQL 服务更新为使用新密钥,同时为了兼容旧版本保留了旧密钥。

步骤 3:MySQL 密码更改

使用 mysqladmin 命令行工具更改 WordPress 用户的 MySQL 密码。此命令从密钥文件中读取旧密码和新密码如下:

mysqladmin -u wp_user -p`cat old_password_file` password `cat new_password_file`

其中,mysqladmin 命令使用 -u 选项指定用户名,并通过反引号中的命令读取旧密码文件和新密码文件内容。

docker 容器执行 $(docker ps --filter name=mysql -q) \  
    bash -c 'mysqladmin --user=wordpress --password="$(< /run/secrets/old_mysql_password)" password "$(< /run/secrets/mysql_password)"'

解释:此命令用于执行 Docker 容器中的 bash 脚本,该脚本会更改 MySQL 数据库的密码。docker container exec 命令用于在指定的 Docker 容器中执行命令,bash -c 表示执行 Bash 脚本中的命令,mysqladmin 是用于管理 MySQL 数据库的命令,其中 --user--password 分别用于指定用户名和密码。密码文件路径 /run/secrets/old_mysql_password/run/secrets/mysql_password 分别用于读取旧密码和新密码。

你应该看到类似下面的输出,例如:……

    mysqladmin: 警告:在命令行界面使用密码可能不安全。
    警告:由于密码将以明文形式发送到服务器,建议使用 SSL 连接以增强密码安全性。

该命令将MySQL中的WordPress用户的密码改为新的密码。

第 4 步:更新 WordPress

将 WordPress 服务更新为使用新密码,并发起滚动重启。

更新 docker 服务 \  
--移除密钥 mysql_password \  
--添加密钥 source=mysql_password_v2,目标密钥为 wp_db_password \  
wordpress  # 这是 WordPress 服务

你应该看到类似以下的屏幕输出:

    ```bash  
    wordpress  
    总进度:1 任务已完成 1 个   
    1/1: 运行中   [==================================================>]   
    验证:服务已就绪   
    ```此命令会更新 WordPress 服务,让它使用新密钥并移除旧密钥。
第五步:检查功能是否正常

在 WordPress 网站上,验证您是否仍然能够按预期访问和互动。确认 MySQL 密码更改没有影响 WordPress 功能。

注意:您可能想知道这一切在像 Semaphore 这样的 CI/CD 流水线中是如何运作的。为了做到这一点,您需要脚本。这样您就不再需要手动在您的机器上运行这些命令了,CI/CD 流水线会在有新代码推送或触发事件时自动执行这些脚本和命令。要尝试,请参阅此 GitHub 项目,该项目详细介绍了这一过程。

不过,Semaphore 提供了一种更简单的方法来将机密信息纳入您的项目。您可以查看这个页面创建和管理机密以了解更多信息。

第六步:撤销访问权限并进行清理

确认服务运行正常后,撤销对旧秘密的访问并清理旧秘密内容:

更新docker服务 \  
--移除密钥 mysql_password \  
mysql (这里mysql指的是服务名称)
docker secret rm mysql_password

执行上述命令可以删除名为 mysql_password 的 Docker 密钥。

你应该看到下面这样的输出 -

    ```bash  
    mysql  
    总进度:1/1 任务   
    1/1: 运行   [==================================================>]   
    验证:服务已就绪   
    mysql_password // 注意:此处为MySQL密码  

# 最后一点

在这篇文章中,我们探讨了Docker secrets的三个实用案例。我们讨论了如何利用Dockerfile将秘密整合进Docker镜像中,如何使用Docker secrets管理WordPress中的秘密,以及如何在Docker中轮换秘密。

通过这些示例,使用密文变得更加简单。现在,您可以在项目中使用 Docker 密文,以安全地管理敏感数据并提升您的 Docker 化应用的安全性能。

原发布于[_https://semaphoreci.com_](https://semaphoreci.com/blog/docker-secrets) 2024年5月29日。


这篇关于三个实用的Docker 密钥管理案例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程