2016-10-20 2 views
5

Ich arbeite an einer App, in der ich den Benutzernamen und das Passwort für das Dienstkonto speichern möchte, das von einem Daemon-Dienst verwendet wird.Verwenden von Azure Key Vault zum Speichern von Benutzername und Passwort

Die Idee besteht darin, dem Anwendungsadministrator ein Dashboard zur Verfügung zu stellen, in dem er Anmeldeinformationen für das Dienstkonto eingeben kann und später an einem sicheren Ort gespeichert werden kann.

Ich kann daran denken, es an einem sicheren Ort wie Azure Vault zu speichern und es von dort zu holen, wann immer es erforderlich ist. Schlüssel und Geheimnis sind jedoch unterschiedliche Entitäten in Azure Vault. Ich kann sie nicht irgendwo als eine Kombination speichern.

Hat jemand das schon mal gemacht? Oder gibt es eine bessere Alternative zum Speichern von Anmeldeinformationen in Azure?

+0

Nur neugierig, ist das 'Dienstkonto', über das Sie sprechen, für das Verwalten des Azure-Abonnements des Benutzers in ihrem Namen? –

+0

Nein @GauravMantri. Dies sind die Anmeldeinformationen für das Dynamics CRM-Dienstkonto. Das Konto wird verwendet, um Entitäten in Dynamics CRM über eine Daemon-App zu aktualisieren. Btw, Gute Arbeit dort auf Blogs und Artikeln, ich folge deinen Blogs ;-) –

+0

Benutzername und Passwort des Dienstkontos werden vom Administrator eingegeben, was bringt es also, sie wieder in azurblauen Schlüsseltresor einzutragen? –

Antwort

4

Sie die Technik verwenden, die Azure BLOB-Speicher verwendet, um Daten in Ruhe verschlüsselt (envelope-Methode): https://docs.microsoft.com/en-us/azure/storage/storage-client-side-encryption

KeyVault hat die Fähigkeit zu Wrap/Unwrap (Verschlüsselung/Entschlüsselung) symmetrische Schlüssel, so dass sie sicher sind für Sie zusammen mit Ihren verschlüsselten Daten speichern.

Hier sind die allgemeinen Schritte:

  1. Generaete ein AES-Schlüssel (256 Bit, CBC-Modus) RNGCryptoServiceProvider
  2. verschlüsseln die Daten (Credentials)
  3. Speichern der Initialisierungsvektor (IV) verwendet wird. Sie können es einfach zum Ciphertext-Byte-Array übertragen, um es später zu entschlüsseln, wenn Sie es entschlüsseln wollen - IV muss nicht geschützt werden.
  4. Den generierten symmetrischen AES-Schlüssel mithilfe des Schlüssels in KeyVault umschließen (verschlüsseln).
  5. Gespeicherte AES-Schlüssel, IV, CipherText und Schlüsselversion (GUID am Ende des URI in KeyVault) speichern.
  6. Stellen Sie sicher, dass Sie die Wrap/Unwrap-Berechtigungen in KeyVault der in Azure AD erstellten Anwendungsregistrierung gewähren. Verwenden Sie die Client-ID/Anwendungs-ID + Schlüssel oder pfx, um Azure in GetToken() zu authentifizieren.

Sie werden diese nuget Pakete müssen:

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

ein ref Holen zu 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; 
    } 
} 

Sobald Sie KeyResolver haben, können Sie ein IKey erhalten Wrap/Unwrap Ihre AES symmetrischer Schlüssel wie folgt ...

Wrap/Encrypt AES Schlüssel

Die Schlüssel-ID ist die URI von Key Vault und aesKey ist die byte [] Ihren Schlüssels AES zu verschlüsseln:

// 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(); 

Das byte [] in dem Tuple das verschlüsselte Bytes des symmetrischen Schlüssels enthält und die Name des verwendeten Algorithmus. Speichern Sie diese als Metadaten mit Ihrem Geheimtext.

Abwickelwerkzeug/Entschlüsseln AES-Schlüssel

Rufen Sie den gleichen Schlüssel (Key Version Angelegenheiten) verwendet wird, ist algoName der Name des Algorithmus verwendet, um den Schlüssel zu umwickeln (zum Beispiel "RSA-OAEP").

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

Weitere Details, über die Sie nachdenken sollten, sind die Schlüsselsicherung/-wiederherstellung und Schlüsselrotation.

Verwandte Themen