【问题标题】:Azure Sql Column Level Encryption Error - Failed to decrypt a column encryption key using key store provider: 'AZURE_KEY_VAULT'Azure Sql 列级加密错误 - 无法使用密钥存储提供程序解密列加密密钥:“AZURE_KEY_VAULT”
【发布时间】:2021-01-24 18:37:36
【问题描述】:

我正在使用 API 的 POC 来在 SQL 数据库中存储/检索一些敏感信息。 API 使用 EF 核心进行数据库操作。我已使用 Azure KeyVault 提供程序配置列级加密。 正在 KeyVault 中生成主密钥。

EF 配置参考

https://entityframeworkcore.com/knowledge-base/60420382/ef-core-decryption-of-sql-column-level-encryption

我需要使用托管身份从 KeyVault 访问加密 MasterKey。下面是初始化 KeyVault Provider 并使用 Microsoft.Azure.Services.AppAuthentication 库获取令牌令牌以访问 KeyVault 的代码。

private static void InitializeAzureKeyVaultProvider()
    {
        SqlColumnEncryptionAzureKeyVaultProvider azureKeyVaultProvider =
          new SqlColumnEncryptionAzureKeyVaultProvider(GetToken);

        Dictionary<string, SqlColumnEncryptionKeyStoreProvider> providers =
          new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>();

        providers.Add(SqlColumnEncryptionAzureKeyVaultProvider.ProviderName, azureKeyVaultProvider);
        SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers);
    }

    private static async Task<string> GetToken(string authority, string resource, string scope)
    {
        var azureServiceTokenProvider = new AzureServiceTokenProvider();
        string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/").ConfigureAwait(false);
        return accessToken;
    }

访问令牌正在成功生成。

除了主密钥之外,我还将连接字符串存储在 KeyVault 中,并使用托管标识配置了 KeyVault 提供程序以从 KeyVault 检索连接字符串。

https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-3.1

我在 Azure 中部署了 Api 应用并启用了 Identity。我使用这个系统生成的 ObjectId 来添加 KeyVault 访问策略以允许 Api 访问 KeyVault。 我已经为 get、wrapKey、unwrapKey、sign、verify、list 等键提供了所需的权限

现在我可以访问连接字符串并能够连接到数据库。但是当我尝试将记录保存在数据库中时,我遇到了错误。

看起来使用生成的令牌我无法访问 KeyVault。我错过了什么吗?请帮忙。

Microsoft.EntityFrameworkCore.DbUpdateException H结果=0x80131500 Message=更新条目时发生错误。有关详细信息,请参阅内部异常。 源=Microsoft.EntityFrameworkCore.Relational 堆栈跟踪: 在 Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection 连接) 在 Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable1 commandBatches, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList1 个条目) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList1 entriesToSave) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(DbContext _, Boolean acceptAllChangesOnSuccess) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func3 操作,Func`3 verifySucceeded) 在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(布尔型 acceptAllChangesOnSuccess) 在 Microsoft.EntityFrameworkCore.DbContext.SaveChanges(布尔型 acceptAllChangesOnSuccess) 在 Microsoft.EntityFrameworkCore.DbContext.SaveChanges() 在 D:\Data\Projects\DbEncryptionApi\DbEncryptionApi\Controllers\MedicalController.cs:line 34 中的 DbEncryptionApi.Controllers.MedicalController.SavePatientRecord(PatientDto patient) 在 Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(对象目标,对象 [] 参数) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper 映射器,ObjectMethodExecutor 执行器,对象控制器,对象 [] 参数) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync() 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(状态&下一个,范围&范围,对象&状态,布尔& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()

此异常最初是在此调用堆栈中引发的: [外部代码]

内部异常 1: SqlException:无法使用密钥存储提供程序解密列加密密钥:“AZURE_KEY_VAULT”。验证数据库中列加密密钥及其列主密钥的属性。加密列加密密钥的最后 10 个字节为:'C6-C8-F6-58-A0-DE-6F-68-73-9F'。 发生一个或多个错误。 (操作返回无效状态码“未授权”)

内部异常 2: KeyVaultErrorException:操作返回了无效的状态代码“未授权”

【问题讨论】:

    标签: sql-server encryption azure-keyvault azure-managed-identity always-encrypted


    【解决方案1】:

    从错误看来,您可能没有正确配置列加密密钥并将其链接到 KeyVault 中的主密钥。

    我建议您查看数据库中列加密的设置 - 第一步可能是使用向导验证 KeyVault 的设置。

    【讨论】:

    • I deployed the Api App in Azure and enabled the Identity.
    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2022-07-23
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多