你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在由 Azure Arc 启用的 SQL 托管实例中启用透明数据加密(预览)

本文介绍如何在由 Azure Arc 启用的 SQL 托管实例中启用和禁用透明数据加密(静态数据加密)。本文中的“托管实例”一词是指对 Azure Arc 启用的 SQL 托管实例的部署,启用/禁用 TDE 将应用于托管实例上运行的所有数据库。

有关 TDE 的详细信息,请参阅透明数据加密

启用 TDE 功能时将执行以下操作:

  • 所有现有数据库现在将自动进行加密。
  • 所有新创建的数据库将自动进行加密。

注意

作为预览版功能,本文中介绍的技术受制于 Microsoft Azure 预览版补充使用条款

发行说明中提供了最近的更新。

先决条件

在继续阅读本文之前,必须创建由 Azure Arc 启用的 SQL 托管实例并连接到该实例。

限制

启用自动 TDE 时存在以下限制:

  • 仅支持常规用途层。
  • 不支持故障转移组。

创建 TDE 的托管实例并启用 TDE (Azure CLI)

以下示例创建由 Azure Arc 启用的 SQL 托管实例,其中包含一个副本并启用了 TDE:

az sql mi-arc create --name sqlmi-tde --k8s-namespace arc --tde-mode ServiceManaged --use-k8s

在托管实例上启用 TDE

在已启用 Arc 的 SQL 托管实例上启用 TDE 时,数据服务会自动执行以下任务:

  1. master 数据库中添加服务托管数据库主密钥。
  2. 添加服务托管证书保护程序。
  3. 在托管实例上的所有数据库上添加关联的数据库加密密钥 (DEK)。
  4. 对托管实例上的所有数据库启用加密。

可以通过以下两种模式之一设置由 Azure Arc 启用的 SQL 托管实例的 TDE:

  • 服务托管
  • 由客户管理

在服务托管模式下,TDE 要求托管实例使用服务托管数据库主密钥和服务托管服务器证书。 启用服务托管 TDE 时,会自动创建这些凭据。

在客户托管模式下,TDE 使用服务托管数据库主密钥,并使用为服务器证书提供的密钥。 配置客户托管模式:

  1. 创建证书。
  2. 将证书存储为与实例相同的 Kubernetes 命名空间中的机密。

启用

以下部分介绍如何在服务托管模式下启用 TDE。

要在服务托管模式下启用 TDE,请运行以下命令:

az sql mi-arc update --tde-mode ServiceManaged

在托管实例上禁用 TDE

在已启用 Arc 的 SQL 托管实例上禁用 TDE 时,数据服务会自动执行以下任务:

  1. 对托管实例上的所有数据库禁用加密。
  2. 删除托管实例上所有数据库的关联 DEK。
  3. 删除服务托管证书保护程序。
  4. 删除 master 数据库中的服务托管数据库主密钥。

要禁用 TDE:

az sql mi-arc update --tde-mode Disabled

备份 TDE 凭据

从托管实例备份凭据时,凭据将存储在容器中。 若要将凭据存储在永久性卷上,请在容器中指定装载路径。 例如 var/opt/mssql/data。 以下示例从托管实例备份证书:

注意

如果从 Windows 运行 kubectl cp 命令,则使用绝对 Windows 路径时,该命令可能会失败。 使用相对路径或下面指定的命令。

  1. 将证书从容器备份到 /var/opt/mssql/data

    USE master;
    GO
    
    BACKUP CERTIFICATE <cert-name> TO FILE = '<cert-path>'
    WITH PRIVATE KEY ( FILE = '<private-key-path>',
    ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>');
    

    示例:

    USE master;
    GO
    
    BACKUP CERTIFICATE MyServerCert TO FILE = '/var/opt/mssql/data/servercert.crt'
    WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/servercert.key',
    ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>');
    
  2. 将证书从容器复制到文件系统。

    kubectl exec -n <namespace> -c arc-sqlmi <pod-name> -- cat <pod-certificate-path> > <local-certificate-path>
    

    示例:

    kubectl exec -n arc-ns -c arc-sqlmi sql-0 -- cat /var/opt/mssql/data/servercert.crt > $HOME\sqlcerts\servercert.crt
    

  1. 将私钥从容器复制到文件系统。

     kubectl exec -n <namespace> -c arc-sqlmi <pod-name> -- cat <pod-private-key-path> > <local-private-key-path>
    

    示例:

    kubectl exec -n arc-ns -c arc-sqlmi sql-0 -- cat /var/opt/mssql/data/servercert.key > $HOME\sqlcerts\servercert.key
    

  1. 从容器中删除证书和私钥。

    kubectl exec -it --namespace <namespace> --container arc-sqlmi <pod-name> -- bash -c "rm <certificate-path> <private-key-path>
    

    示例:

    kubectl exec -it --namespace arc-ns --container arc-sqlmi sql-0 -- bash -c "rm /var/opt/mssql/data/servercert.crt /var/opt/mssql/data/servercert.key"
    

将 TDE 凭据还原到托管实例

与上述操作类似,还原凭据的方法是先将凭据复制到容器中,然后运行相应的 T-SQL。

注意

如果从 Windows 运行 kubectl cp 命令,则使用绝对 Windows 路径时,该命令可能会失败。 使用相对路径或下面指定的命令。 要还原在启用 TDE 之前执行的数据库备份,需要在 SQL 托管实例上禁用 TDE,还原数据库备份并再次启用 TDE。

  1. 将证书从文件系统复制到容器。

    type <local-certificate-path> | kubectl exec -i -n <namespace> -c arc-sqlmi <pod-name> -- tee <pod-certificate-path>
    

    示例:

    type $HOME\sqlcerts\servercert.crt | kubectl exec -i -n arc-ns -c arc-sqlmi sql-0 -- tee /var/opt/mssql/data/servercert.crt
    

  1. 将私钥从文件系统复制到容器。

    type <local-private-key-path> | kubectl exec -i -n <namespace> -c arc-sqlmi <pod-name> -- tee <pod-private-key-path>
    

    示例:

    type $HOME\sqlcerts\servercert.key | kubectl exec -i -n arc-ns -c arc-sqlmi sql-0 -- tee /var/opt/mssql/data/servercert.key
    
  2. 使用文件路径从 /var/opt/mssql/data 创建证书。

    USE master;
    GO
    
    CREATE CERTIFICATE <certicate-name>
    FROM FILE = '<certificate-path>'
    WITH PRIVATE KEY ( FILE = '<private-key-path>',
        DECRYPTION BY PASSWORD = '<UseStrongPasswordHere>' );
    

    示例:

    USE master;
    GO
    
    CREATE CERTIFICATE MyServerCertRestored
    FROM FILE = '/var/opt/mssql/data/servercert.crt'
    WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/servercert.key',
        DECRYPTION BY PASSWORD = '<UseStrongPasswordHere>' );
    
  3. 从容器中删除证书和私钥。

    kubectl exec -it --namespace <namespace> --container arc-sqlmi <pod-name> -- bash -c "rm <certificate-path> <private-key-path>
    

    示例:

    kubectl exec -it --namespace arc-ns --container arc-sqlmi sql-0 -- bash -c "rm /var/opt/mssql/data/servercert.crt /var/opt/mssql/data/servercert.key"
    

透明数据加密