Azure Sql列级加密错误-无法使用密钥存储提供程序解密列加密密钥:'AZURE_KEY_VAULT'

时间:2020-10-09 16:43:34

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

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

EF配置参考

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

我需要使用托管身份来访问KeyVault形式的加密万能钥匙。以下是使用Microsoft.Azure.Services.AppAuthentication库访问KeyVault初始化KeyVault Provider并获取令牌令牌的代码。

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应用并启用了身份。我使用此系统生成的ObjectId来添加KeyVault访问策略,以允许Api访问KeyVault。 我已经提供了诸如get,wrapKey,unwrapKey,sign,verify,list之类的键所需的权限

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

看起来像生成的令牌一样,我无法访问KeyVault。我想念什么吗?请帮忙。

Microsoft.EntityFrameworkCore.DbUpdateException HResult = 0x80131500 Message =更新条目时发生错误。有关详细信息,请参见内部异常。 源= Microsoft.EntityFrameworkCore.Relational 堆栈跟踪: 在Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection连接) 在Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable 1 commandBatches, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList 1个条目)处 在Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList 1 entriesToSave) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(DbContext _, Boolean acceptAllChangesOnSuccess) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func 3操作,Func`3 verifySucceeded) 在Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess) 在Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess) 在Microsoft.EntityFrameworkCore.DbContext.SaveChanges() 位于D:\ Data \ Projects \ DbEncryptionApi \ DbEncryptionApi \ Controllers \ MedicalController.cs:Db中的DbEncryptionApi.Controllers.MedicalController.SavePatientRecord(PatientDto患者) 在Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target,Object []参数) 在Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper映射器,ObjectMethodExecutor执行器,对象控制器,Object []参数)处 在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:操作返回了无效的状态码“未经授权”

1 个答案:

答案 0 :(得分:0)

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

我建议您检查数据库中列加密的设置-作为第一步,也许使用向导来验证KeyVault的设置。