【问题标题】:CI with a SQL Always Encrypted column带有 SQL Always Encrypted 列的 CI
【发布时间】: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


【解决方案1】:

经过几天的研究,似乎不可能使用变量来更改键的值,以便在我们的每个环境中部署我们的 DACPAC。 (或者我们还没有找到方法!)。

我们使用的解决方法是在每个环境中通过脚本部署密钥和加密列(在每个环境中使用不同的密钥),然后我们修改 DACPAC 以匹配手动完成的操作。

我们在 XML 发布配置文件中添加了两个选项:

 <ExcludeColumnEncryptionKeys>True</ExcludeColumnEncryptionKeys>
 <ExcludeColumnMasterKeys>True</ExcludeColumnMasterKeys>

当我们在 CI 流中部署时,不会比较密钥,即使它们不同,也不会对结构进行任何更改。

能够使用变量而不是手动操作会很好,但这似乎就是这样!

CI + 始终加密不要一起使用!

【讨论】:

  • 我也刚刚开始研究这个问题。目前我的团队提出的唯一想法(尚未测试)是在 DACPAC 部署步骤之前在服务器上进行编程文件修改,而不是依赖它由变量自动完成
  • 天啊——我也被困在这上面了,很高兴它让我发疯了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
相关资源
最近更新 更多