适用于:Linux 上的 SQL Server
本文提供了一个示例,说明如何在包含的可用性组 (AG) 中为 Linux 上运行的 SQL Server 准备计算机密钥。
包含的 AG 是指可用性组,可支持:
在 AG 级别以及实例级别管理元数据对象(用户、登录、权限、SQL Server 代理作业等)。
AG 中的专用包含系统数据库。
本文中的示例针对 Linux 容器中的 SQL Server,但也可以在物理计算机、虚拟机上运行和基于 Kubernetes 的部署中运行的 Linux 上的 SQL Server 采用相同的步骤。
注意
这些说明应仅用于“包含的可用性组”。 在所有副本中使用公用计算机密钥配置包含的 AG 时,请先确保没有存在的加密层次结构(例如透明数据加密、列级加密或任何其他需要密钥管理的安全相关功能)。 更改计算机密钥可能会破坏加密并导致数据丢失。 配置后,出于安全考虑,请避免创建或修改加密层次结构。
计算机密钥概述
在 Linux 上的 SQL Server 中,计算机密钥在保护通信和数据方面发挥着重要作用。 下表介绍了其主要功能。
| 函数 | 说明 |
|---|---|
| 加密和解密 | 计算机密钥用于加密和解密 AG 中的节点间交换的数据 |
| 身份验证 | 有助于验证 AG 中主要副本和次要副本之间的通信 |
| 安全性 | 必须保护计算机密钥和关联的证书,防止未经授权的访问 |
在 Linux 上使用 SQL Server 2022 (16.x) 和包含的 AG 时,必须在 SQL Server 副本之间同步计算机密钥。 此过程允许包含的 master 数据库中的服务主密钥 (SMK) 用于解密和加密操作。
在独立主机上准备 SQL Server 容器,以运行自定义计算机密钥
以下说明演示了生成新计算机密钥(格式为 base64)的示例。
使用以下脚本通过 OpenSSL 生成计算机密钥文件(到名为
machine-key.bin的文件中)。openssl rand -out machine-key.bin 44 printf '\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | dd of=machine-key.bin bs=1 seek=0 count=12 conv=notrunc cat machine-key.bin | base64之前的脚本会执行这些步骤:
- 创建一个名为
machine-key.bin的 44 字节二进制文件,其中包含随机数据。 - 使用固定标头覆盖前 12 个字节。 这一状况可能会在将来发生变化。
- 以
machine-key.bin格式编码base64,并将其打印到控制台。
- 创建一个名为
将文件装载到 SQL Server 容器的计算机密钥来运行容器。
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=yourpassword" -p 14331:1433 --name sqlcontainer --hostname sqlcontainer -v ~/machine-key.bin:/var/opt/mssql/secrets/machine-key -d mcr.microsoft.com/mssql/server:2022-latest验证主机上的
machine-key.bin是否与上一步中部署的 SQL Server 容器使用的machine-key.bin相同。cat machine-key.bin | base64下面是示例输出:
AQAAAAAAAAAAAAAA//////////////////////////////////////////8=在容器中验证密钥。 首先,连接到容器中的交互式终端。
docker exec -it sqlcontainer "bash"然后,验证密钥。
cat machine-key | base64下面是示例输出:
AQAAAAAAAAAAAAAA//////////////////////////////////////////8=
可以在所有 SQL Server 容器部署中使用相同的步骤,这些部署将在包含的 AG 中用作副本。 必须使用相同的计算机密钥,不要为每个 SQL Server 容器部署生成不同的计算机密钥。