首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用密钥库时没有配置XML加密器

使用密钥库时没有配置XML加密器
EN

Stack Overflow用户
提问于 2019-12-14 01:38:10
回答 2查看 8.2K关注 0票数 4

我有一个netcoreapp2.2容器应用程序,它使用azure密钥库来存储密钥,并使用:

代码语言:javascript
运行
复制
app.UseAuthentication(); 

代码语言:javascript
运行
复制
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

我正在App下的托管linux环境中构建/运行一个坞映像。我正在使用蔚蓝容器注册表和dev管道线来维护我的应用程序。Azure控制部署过程和"docker“命令。

我的应用程序工作得很好,但是在我看到的容器日志中:

代码语言:javascript
运行
复制
2019-12-13T17:18:12.207394900Z [40m[1m[33mwarn[39m[22m[49m: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
2019-12-13T17:18:12.207436700Z       No XML encryptor configured. Key {...} may be persisted to storage in unencrypted form.
...
2019-12-13T17:18:14.540484659Z Application started. Press Ctrl+C to shut down.

我意识到在这方面还有很多其他的帖子暗示着使用其他的存储机制,但是我使用密钥库来存储我的敏感数据。JWT全部由密钥库处理。我有一些应用程序设置,可以控制DEV/QA/PROD的静态变量,但它们根本不是敏感数据。

我也不知道内存中存储的是什么密钥,因为我的所有敏感键都完全在应用程序之外,并由以下程序调用:

代码语言:javascript
运行
复制
var azureServiceTokenProvider = new AzureServiceTokenProvider();
                var keyVaultClient = new KeyVaultClient(
                    new KeyVaultClient.AuthenticationCallback(
                        azureServiceTokenProvider.KeyVaultTokenCallback));

                config.AddAzureKeyVault(
                    $"https://{builtConfig["MY_KEY_VAULT_ID"]}.vault.azure.net/",
                    keyVaultClient,
                    new DefaultKeyVaultSecretManager());

我很难理解为什么要抛出这个警告,也很难理解我是否应该采取更多的措施来减轻这个问题。我个人没有看到副作用,应用程序重新启动似乎没有任何影响,因为我使用的是无记名令牌和其他问题,如令牌过期,密码重置等是不适用的。

因此,我不得不问,我是否还可以采取其他措施来避免这一警告?我是否需要确保rest机制中有一个更好的数据,用于我的linux环境中的任何配置设置?我能安全地忽略这个警告吗?

EN

回答 2

Stack Overflow用户

发布于 2019-12-17 15:11:22

我花了一段时间才找到一种适合我的应用程序需求的方法,但我想澄清一下其他一些对我来说没有意义的堆栈答案,以及我是如何最终理解这个问题的。

由于我已经在使用密钥库,所以我混淆了.net核心是如何工作的。我没有意识到config.AddAzureKeyVault()与.net核心如何决定将数据存储在应用程序服务中无关。

当您看到此警告时:

代码语言:javascript
运行
复制
No XML encryptor configured. Key {GUID} may be persisted to storage in unencrypted form.

设置什么GUID并不重要:这串数据没有被加密存储在rest中。

在我的风险分析中,任何没有在静止状态下加密的信息都是个坏主意,因为它可能意味着在将来的任何时候,某种敏感数据都可能泄漏,然后暴露给攻击者。最后,我选择将静止的数据归类为敏感的数据,并在潜在的攻击面谨慎的情况下错误地进行分类。

我一直在努力用清楚和简明的方式来解释这一点,很难用几句话来概括。这就是我学到的。

在这种情况下,

  • 访问控制(IAM)是您的朋友,因为您可以为应用程序声明分配的系统标识,并使用基于角色的访问控制。在我的例子中,我使用我的应用程序标识来使用RBAC控制对密钥库和天蓝色存储的访问。这使得在没有SAS令牌或访问密钥的情况下获得访问变得更加容易。
  • Azure存储将是您正在创建的文件的最终目的地,但它将是控制加密密钥的金库。我在密钥库中创建了一个RSA密钥,该密钥加密了抛出原始错误的XML文件。
  • 是我脑子里犯的一个错误,我想要两个把加密的XML写到密钥库中。然而,这并不是微软描述的用例。有两种机制: PersistKeysTo和ProtectKeysWith。当我从我那厚厚的头脑中得到这一点时,这一切都是有意义的。--

我使用以下方法删除警告并在rest中创建加密数据:

代码语言:javascript
运行
复制
services.AddDataProtection()
    // Create a CloudBlockBlob with AzureServiceTokenProvider
    .PersistKeysToAzureBlobStorage(...)
    // Create a KeyVaultClient with AzureServiceTokenProvider
    // And point to the RSA key by id
    .ProtectKeysWithAzureKeyVault(...);

我已经使用RBAC作为我的应用程序的密钥库(具有包装/解封权限),但我也将添加到存储帐户中。

如何创建blob取决于您自己,但其中一个问题是同步创建访问令牌:

代码语言:javascript
运行
复制
    // GetStorageAccessToken()
    var token = new AzureServiceTokenProvider();
    return token.GetAccessTokenAsync("https://storage.azure.com/")
        .GetAwaiter()
        .GetResult();

然后我从一个方法调用它:

代码语言:javascript
运行
复制
    var uri = new Uri($"https://{storageAccount}.blob.core.windows.net/{containerName}/{blobName}");
    //Credentials.
    var tokenCredential = new TokenCredential(GetStorageAccessToken());
    var storageCredentials = new StorageCredentials(tokenCredential);
    return new CloudBlockBlob(uri, storageCredentials);

在克服了这一障碍之后,加密就直接向前推进了。密钥库ID是您正在使用的加密密钥的位置。

代码语言:javascript
运行
复制
https://mykeyvaultname.vault.azure.net/keys/my-key-name/{VersionGuid}

而创建客户端是

代码语言:javascript
运行
复制
var token = new AzureServiceTokenProvider();
var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(token.KeyVaultTokenCallback));

services.AddDataProtection()
    .ProtectKeysWithAzureKeyVault(client, keyVaultId);

我还必须赞扬这个博客:https://joonasw.net/view/using-azure-key-vault-and-azure-storage-for-asp-net-core-data-protection-keys,因为它为我指明了正确的方向。

https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/default-settings?view=aspnetcore-2.2这也指出了密钥没有加密的原因。

https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles -用于应用程序的RBAC

https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1最初令人困惑,但对于如何在生产中授予访问权限和限制访问有很好的警告。

票数 5
EN

Stack Overflow用户

发布于 2020-06-19 02:10:52

您可能必须将数据保护策略配置为使用CryptographicAlogrithms,如下所示:

代码语言:javascript
运行
复制
 .UseCryptographicAlgorithms(new AuthenticatedEncryptorConfiguration()
                {
                    EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
                    ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
                });

另外,下面是一些关于数据保护策略的警告。

ASP.Net核心DataProtection将密钥存储在主目录(/root/..aspnet/DataProtection)中,因此当容器重新启动键丢失时,可能会导致服务崩溃。

这个问题可以通过持久化

  • 持久化密钥位于持久位置(卷),并将该卷装入停靠容器
  • 持久化密钥到外部密钥存储区,如Azure或Redis

有关ASP.NET DataProtection的更多详细信息:

https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1

https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/introduction?view=aspnetcore-3.1

使用以下命令将外部卷(C:/temp)挂载到停靠容器卷(/root/..aspnet/DataProtection-Keys)

代码语言:javascript
运行
复制
docker run -d -v /c/temp-keys:/root/.aspnet/DataProtection-Keys container-name

此外,您还需要更新Starup.cs - ConfigureServices以配置DataProtection策略。

代码语言:javascript
运行
复制
services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(@"C:\temp-keys\"))
                .UseCryptographicAlgorithms(new AuthenticatedEncryptorConfiguration()
                {
                    EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
                    ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
                });
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59331645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档