2016-10-20 11 views
5

Я работаю над приложением, где я хочу сохранить имя пользователя и пароль для учетной записи службы, которая будет использоваться службой демона.Использование хранилища ключей Azure для хранения имени пользователя и пароля

Идея состоит в том, чтобы предоставить администратору приложения панель мониторинга, где он может вводить учетные данные для учетной записи службы, а затем ее можно хранить где-то в безопасности.

Я могу подумать о том, чтобы хранить его в надежном месте, например, в Лазурном Убежище и получить его там, где требуется. Однако ключ и секрет - разные объекты в Azure Vault. Я не могу хранить их где-то в комбинации.

Кто-нибудь сделал это раньше? Или есть лучшая альтернатива для хранения учетных данных в Azure?

+0

Любопытно, что «учетная запись службы», о которой вы говорите, предназначена для управления подпиской Azure от их имени? –

+0

Nope @GauravMantri. Это будут учетные данные для учетной записи службы Dynamics CRM. Учетная запись будет использоваться для обновления объектов в Dynamics CRM через приложение-демон. Кстати, хорошая работа там в блогах и статьях, я слежу за вашими блогами ;-) –

+0

Имя учетной записи пользователя и пароль будут введены администратором, так что же нужно добавить их снова в хранилище ключей в лазурном ключе? –

ответ

4

Вы можете использовать метод, который использует для хранения Azure Blob для шифрования данных в состоянии покоя (метод огибающего): https://docs.microsoft.com/en-us/azure/storage/storage-client-side-encryption

KeyVault имеет возможность Wrap/Unwrap (шифрование/дешифрование) симметричные ключи, чтобы они являются безопасными для вы должны хранить вместе с вашими зашифрованными данными.

Вот общие шаги:

  1. Generaete ключ AES (256 бит, режим CBC) с помощью RNGCryptoServiceProvider
  2. шифровать данные (учетные данные)
  3. Сохраните вектор инициализации (IV). Вы можете просто конкатенировать его с байтовым массивом зашифрованного текста для последующего поиска, когда вы хотите расшифровать - IV не нуждается в защите.
  4. Оберните (зашифруйте) генетический симметричный ключ AES с помощью клавиши KeyVault.
  5. Магазин Wraped AES Key, IV, CipherText и Key Version (GUID в конце URI в KeyVault).
  6. Убедитесь, что вы предоставили разрешения Wrap/Unwrap в KeyVault для регистрации приложений, созданных в Azure AD. Используйте идентификатор клиента/идентификатор приложения + ключ или pfx для авторизации до Azure в GetToken().

Вам нужны эти NuGet пакеты:

Install-Package Microsoft.Azure.KeyVault 
Install-Package Microsoft.Azure.KeyVault.Extensions 
Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.16.204221202 

Получить реф в KeyVaultKeyResolver

KeyVaultKeyResolver cloudResolver = new KeyVaultKeyResolver(Utils.GetToken); 

// Example GetToken implementation 
public class Utils { 
    // Retrive JWT token to be used for KeyVault access. 
    internal async static Task<string> GetToken(string authority, string resource, string scope) 
    { 
     var authContext = new AuthenticationContext(authority); 
     // Could use pfx instead 
     ClientCredential clientCred = new ClientCredential(
      ConfigurationManager.AppSettings["clientId"], 
      ConfigurationManager.AppSettings["clientSecret"]); 

     AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCred); 

     if (result == null) 
      throw new InvalidOperationException("Failed to obtain the JWT token."); 

     return result.AccessToken; 
    } 
} 

После того как вы есть KeyResolver, вы можете получить Айки обернуть/Берем ваш AES симметричный ключ следующим образом:

Wrap/Encrypt AES Key

идентификатор ключа является URI от Key Vault и aesKey является байт [] вашего ключа AES для шифрования:

// Resolve an IKey by Key ID from URI in KeyVault 
var keyEncryptionKey = cloudResolver.ResolveKeyAsync(keyId, CancellationToken.None).GetAwaiter().GetResult(); 

// Take our gen'ed AES Key and wrap (encrypt) it. 
Tuple<byte[], string> wrappedKey = keyEncryptionKey.WrapKeyAsync(aeskey, null /* algorithm */, CancellationToken.None).GetAwaiter().GetResult(); 

байт [] в кортеже содержит зашифрованные байты симметричного ключа и имя используемого алгоритма. Сохраните их как метаданные с вашим зашифрованным текстом.

Unwrap/дешифрования AES ключ

вызова, используя тот же ключ (ключевые дела, версия), algoName это название алгоритма, используемого для обертывания ключа (например, "RSA-OAEP").

// Retrieve the IKey by Key ID 
// Unwrap Key 
byte[] aesKey = rsa.UnwrapKeyAsync(wrappedKeyBytes, algoName, CancellationToken.None).GetAwaiter().GetResult(); 

Другие сведения, которые следует учитывать, это резервное копирование/восстановление ключей и поворот ключа.