在 Azure Arc 所啟用的 SQL 受控執行個體上啟用透明資料加密 (預覽)
本文內容
本文說明如何在 Azure Arc 所啟用的 SQL 受控執行個體上啟用和停用待用透明資料加密 (TDE)。在本文中,受控執行個體 一詞是指 Azure Arc 所啟用的 SQL 受控執行個體的部署,且啟用/停用 TDE 會套用至在受控執行個體上執行的所有資料庫。
如需 TDE 的詳細資訊,請參閱透明資料加密 。
開啟 TDE 功能會執行下列動作:
所有現有的資料庫現在都會自動加密。
所有新建立的資料庫都會自動加密。
必要條件
在繼續進行本文之前,您必須建立 Azure Arc 所啟用的 SQL 受控執行個體資源,並連線到該資源。
限制
當您啟用自動 TDE 時會套用下列限制:
建立已啟用 TDE (Azure CLI) 的受控執行個體
下列範例會建立已啟用 TDE 之具有一個複本的 Azure Arc 所啟用的 SQL 受控執行個體:
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
。 下列範例會從受控執行個體備份憑證:
注意
如果 kubectl cp
命令是從 Windows 執行,當使用絕對 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。
注意
如果 kubectl cp
命令是從 Windows 執行,當使用絕對 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"
相關內容
透明資料加密