我有一个netcoreapp2.2容器应用程序,它使用azure密钥库来存储密钥,并使用:
app.UseAuthentication();
和
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
我正在App下的托管linux环境中构建/运行一个坞映像。我正在使用蔚蓝容器注册表和dev管道线来维护我的应用程序。Azure控制部署过程和"docker“命令。
我的应用程序工作得很好,但是在我看到的容器日志中:
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的静态变量,但它们根本不是敏感数据。
我也不知道内存中存储的是什么密钥,因为我的所有敏感键都完全在应用程序之外,并由以下程序调用:
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环境中的任何配置设置?我能安全地忽略这个警告吗?
发布于 2019-12-17 15:11:22
我花了一段时间才找到一种适合我的应用程序需求的方法,但我想澄清一下其他一些对我来说没有意义的堆栈答案,以及我是如何最终理解这个问题的。
由于我已经在使用密钥库,所以我混淆了.net核心是如何工作的。我没有意识到config.AddAzureKeyVault()与.net核心如何决定将数据存储在应用程序服务中无关。
当您看到此警告时:
No XML encryptor configured. Key {GUID} may be persisted to storage in unencrypted form.
设置什么GUID并不重要:这串数据没有被加密存储在rest中。
在我的风险分析中,任何没有在静止状态下加密的信息都是个坏主意,因为它可能意味着在将来的任何时候,某种敏感数据都可能泄漏,然后暴露给攻击者。最后,我选择将静止的数据归类为敏感的数据,并在潜在的攻击面谨慎的情况下错误地进行分类。
我一直在努力用清楚和简明的方式来解释这一点,很难用几句话来概括。这就是我学到的。
在这种情况下,
我使用以下方法删除警告并在rest中创建加密数据:
services.AddDataProtection()
// Create a CloudBlockBlob with AzureServiceTokenProvider
.PersistKeysToAzureBlobStorage(...)
// Create a KeyVaultClient with AzureServiceTokenProvider
// And point to the RSA key by id
.ProtectKeysWithAzureKeyVault(...);
我已经使用RBAC作为我的应用程序的密钥库(具有包装/解封权限),但我也将添加到存储帐户中。
如何创建blob取决于您自己,但其中一个问题是同步创建访问令牌:
// GetStorageAccessToken()
var token = new AzureServiceTokenProvider();
return token.GetAccessTokenAsync("https://storage.azure.com/")
.GetAwaiter()
.GetResult();
然后我从一个方法调用它:
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是您正在使用的加密密钥的位置。
https://mykeyvaultname.vault.azure.net/keys/my-key-name/{VersionGuid}
而创建客户端是
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最初令人困惑,但对于如何在生产中授予访问权限和限制访问有很好的警告。
发布于 2020-06-19 02:10:52
您可能必须将数据保护策略配置为使用CryptographicAlogrithms,如下所示:
.UseCryptographicAlgorithms(new AuthenticatedEncryptorConfiguration()
{
EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
});
另外,下面是一些关于数据保护策略的警告。
ASP.Net核心DataProtection将密钥存储在主目录(/root/..aspnet/DataProtection)中,因此当容器重新启动键丢失时,可能会导致服务崩溃。
这个问题可以通过持久化
。
有关ASP.NET DataProtection的更多详细信息:
使用以下命令将外部卷(C:/temp)挂载到停靠容器卷(/root/..aspnet/DataProtection-Keys)
docker run -d -v /c/temp-keys:/root/.aspnet/DataProtection-Keys container-name
此外,您还需要更新Starup.cs - ConfigureServices以配置DataProtection策略。
services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(@"C:\temp-keys\"))
.UseCryptographicAlgorithms(new AuthenticatedEncryptorConfiguration()
{
EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
});
https://stackoverflow.com/questions/59331645
复制相似问题