【发布时间】:2020-04-24 10:26:36
【问题描述】:
我们正在尝试在我们的一个应用程序中添加 Always encrypted,我们希望它与我们的 CI 流一起工作。
我们将 DACPAC 部署与 Azure Devops 结合使用。 到目前为止一切正常,但我们面临着始终加密的挑战......
每个 SQL 环境都需要在 Azure Key Vault 中具有不同的密钥。 我们发现自动执行此操作的方法是使用 SSDT 变量 (ref)
CREATE COLUMN MASTER KEY [ResponseKey] WITH (
KEY_STORE_PROVIDER_NAME = N'AZURE_KEY_VAULT',
KEY_PATH = N'[$(OurVariableName)]' );
当我们的 DB 和 DACPAC 之间的比较完成时,脚本总是包含键的 Drop + Create,即使键的值是相同的。我们尝试输出生成的脚本,我们的 Azure Key Vault 中的键值位于脚本的变量部分。 就好像,比较不适用于变量。
有人做过这个吗?
另外,当我们添加一个新的加密列时,生成的脚本总是失败,说明表中已经有数据。这似乎与this link相反
【问题讨论】:
-
据我所知,KEY_PATH 的值是 azure key vault key id,为什么不在你的声明中使用它呢? (docs.microsoft.com/en-us/sql/t-sql/statements/…) 对于您的第二个问题,您能否更新更多关于表中已有数据的信息?您要创建的数据是否已经存在?您是否使用了 CREATE COLUMN ENCRYPTION KEY key_name WITH VALUES 之类的语句?
-
是的,KEY_PATH 的值是密钥库 ID。这个值会根据我部署到的环境而变化。当我部署到 dev 时,我希望使用我的 dev Vault。鉴于每个环境的 DACPAC 都是相同的,我必须在部署时使用变量来注入正确的值。对于我的第二个问题,生成脚本的相关部分是这样的(对不起,它是法语......):
-
IF EXISTS (SELECT TOP 1 1 FROM [dbo].[FormResponse]) RAISERROR (N'Des lignes ont été détectées dans la table. La mise à jour du schéma pour modifier le chiffrement de Colonne ''arrête, car elle nécessite la migration de données vers le client et leur chargement sur le serverur.', 16, 127) WITH NOWAIT;
-
CREATE TABLE [dbo].[FormResponse] ([Response] NVARCHAR (MAX) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [ReponseColumnKey], ALGORITHM = N'AEAD_AES_256_CBC_HMAC_SHA_256', ENCRYPTION_TYPE = DETERMINISTIC) NULL, . ..)
-
完全...部署到 Dev => 使用 dev vault,部署到 Prod => 使用 prod vault。此原理与 CREATE COLUMN ENCRYPTION KEY 语句相同(但它不是 URL)
标签: sql-server azure-devops continuous-integration dacpac always-encrypted