你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
在由 Azure Arc 启用的 SQL 托管实例中启用透明数据加密(预览)
本文内容
本文介绍如何在由 Azure Arc 启用的 SQL 托管实例中启用和禁用透明数据加密(静态数据加密)。本文中的“托管实例”一词是指对 Azure Arc 启用的 SQL 托管实例的部署,启用/禁用 TDE 将应用于托管实例上运行的所有数据库。
有关 TDE 的详细信息,请参阅透明数据加密 。
启用 TDE 功能时将执行以下操作:
所有现有数据库现在将自动进行加密。
所有新创建的数据库将自动进行加密。
先决条件
在继续阅读本文之前,必须创建由 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 时,数据服务会自动执行以下任务:
在 master
数据库中添加服务托管数据库主密钥。
添加服务托管证书保护程序。
在托管实例上的所有数据库上添加关联的数据库加密密钥 (DEK)。
对托管实例上的所有数据库启用加密。
可以通过以下两种模式之一设置由 Azure Arc 启用的 SQL 托管实例的 TDE:
在服务托管模式下,TDE 要求托管实例使用服务托管数据库主密钥和服务托管服务器证书。 启用服务托管 TDE 时,会自动创建这些凭据。
在客户托管模式下,TDE 使用服务托管数据库主密钥,并使用为服务器证书提供的密钥。 配置客户托管模式:
创建证书。
将证书存储为与实例相同的 Kubernetes 命名空间中的机密。
启用
要在服务托管模式下启用 TDE,请运行以下命令:
az sql mi-arc update --tde-mode ServiceManaged
要在服务托管模式下启用 TDE,请运行 kubectl 修补程序以启用服务托管 TDE:
kubectl patch sqlmi <sqlmi-name> --namespace <namespace> --type merge --patch '{ "spec": { "security": { "transparentDataEncryption": { "mode": "ServiceManaged" } } } }'
示例:
kubectl patch sqlmi sqlmi-tde --namespace arc --type merge --patch '{ "spec": { "security": { "transparentDataEncryption": { "mode": "ServiceManaged" } } } }'
使用 Azure CLI 在客户托管模式下启用 TDE:
创建证书。
openssl req -x509 -newkey rsa:2048 -nodes -keyout <key-file> -days 365 -out <cert-file>
为证书创建机密。
kubectl create secret generic <tde-secret-name> --from-literal=privatekey.pem="$(cat <key-file>)" --from-literal=certificate.pem="$(cat <cert-file>) --namespace <namespace>"
更新并运行以下示例以启用客户托管 TDE:
az sql mi-arc update --tde-mode CustomerManaged --tde-protector-private-key-file <key-file> --tde-protector-public-key-file <cert-file>
在客户托管模式下启用 TDE:
创建证书。
openssl req -x509 -newkey rsa:2048 -nodes -keyout <key-file> -days 365 -out <cert-file>
为证书创建机密。
kubectl create secret generic <tde-secret-name> --from-literal=privatekey.pem="$(cat <key-file>)" --from-literal=certificate.pem="$(cat <cert-file>) --namespace <namespace>"
运行 kubectl patch ...
以启用客户托管 TDE
kubectl patch sqlmi <sqlmi-name> --namespace <namespace> --type merge --patch '{ "spec": { "security": { "transparentDataEncryption": { "mode": "CustomerManaged", "protectorSecret": "<tde-secret-name>" } } } }'
示例:
kubectl patch sqlmi sqlmi-tde --namespace arc --type merge --patch '{ "spec": { "security": { "transparentDataEncryption": { "mode": "CustomerManaged", "protectorSecret": "sqlmi-tde-protector-cert-secret" } } } }'
在托管实例上禁用 TDE
在已启用 Arc 的 SQL 托管实例上禁用 TDE 时,数据服务会自动执行以下任务:
对托管实例上的所有数据库禁用加密。
删除托管实例上所有数据库的关联 DEK。
删除服务托管证书保护程序。
删除 master
数据库中的服务托管数据库主密钥。
要禁用 TDE:
az sql mi-arc update --tde-mode Disabled
运行 kubectl 修补程序以禁用服务托管 TDE。
kubectl patch sqlmi <sqlmi-name> --namespace <namespace> --type merge --patch '{ "spec": { "security": { "transparentDataEncryption": { "mode": "Disabled" } } } }'
示例:
kubectl patch sqlmi sqlmi-tde --namespace arc --type merge --patch '{ "spec": { "security": { "transparentDataEncryption": { "mode": "Disabled" } } } }'
备份 TDE 凭据
从托管实例备份凭据时,凭据将存储在容器中。 若要将凭据存储在永久性卷上,请在容器中指定装载路径。 例如 var/opt/mssql/data
。 以下示例从托管实例备份证书:
注意
如果从 Windows 运行 kubectl cp
命令,则使用绝对 Windows 路径时,该命令可能会失败。 使用相对路径或下面指定的命令。
将证书从容器备份到 /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>');
将证书从容器复制到文件系统。
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
kubectl cp --namespace <namespace> --container arc-sqlmi <pod-name>:<pod-certificate-path> <local-certificate-path>
示例:
kubectl cp --namespace arc-ns --container arc-sqlmi sql-0:/var/opt/mssql/data/servercert.crt $HOME/sqlcerts/servercert.crt
将私钥从容器复制到文件系统。
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
kubectl cp --namespace <namespace> --container arc-sqlmi <pod-name>:<pod-private-key-path> <local-private-key-path>
示例:
kubectl cp --namespace arc-ns --container arc-sqlmi sql-0:/var/opt/mssql/data/servercert.key $HOME/sqlcerts/servercert.key
从容器中删除证书和私钥。
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。
将证书从文件系统复制到容器。
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
kubectl cp --namespace <namespace> --container arc-sqlmi <local-certificate-path> <pod-name>:<pod-certificate-path>
示例:
kubectl cp --namespace arc-ns --container arc-sqlmi $HOME/sqlcerts/servercert.crt sql-0:/var/opt/mssql/data/servercert.crt
将私钥从文件系统复制到容器。
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
kubectl cp --namespace <namespace> --container arc-sqlmi <local-private-key-path> <pod-name>:<pod-private-key-path>
示例:
kubectl cp --namespace arc-ns --container arc-sqlmi $HOME/sqlcerts/servercert.key sql-0:/var/opt/mssql/data/servercert.key
使用文件路径从 /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>' );
从容器中删除证书和私钥。
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"
相关内容
透明数据加密