为 Linux 和容器上包含的可用性组准备计算机密钥

适用于: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)的示例。

  1. 使用以下脚本通过 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
    

    之前的脚本会执行这些步骤:

    1. 创建一个名为 machine-key.bin 的 44 字节二进制文件,其中包含随机数据。
    2. 使用固定标头覆盖前 12 个字节。 这一状况可能会在将来发生变化。
    3. machine-key.bin 格式编码 base64,并将其打印到控制台。
  2. 将文件装载到 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
    
  3. 验证主机上的 machine-key.bin 是否与上一步中部署的 SQL Server 容器使用的 machine-key.bin 相同。

    cat machine-key.bin | base64
    

    下面是示例输出:

    AQAAAAAAAAAAAAAA//////////////////////////////////////////8=
    
  4. 在容器中验证密钥。 首先,连接到容器中的交互式终端。

    docker exec -it sqlcontainer "bash"
    

    然后,验证密钥。

    cat machine-key | base64
    

    下面是示例输出:

    AQAAAAAAAAAAAAAA//////////////////////////////////////////8=
    

可以在所有 SQL Server 容器部署中使用相同的步骤,这些部署将在包含的 AG 中用作副本。 必须使用相同的计算机密钥,不要为每个 SQL Server 容器部署生成不同的计算机密钥。