2016-10-20 23 views
5

デーモンサービスで使用されるサービスアカウントのユーザー名とパスワードを保存するアプリケーションに取り組んでいます。Azure Key Vaultを使用してユーザー名とパスワードを保存する

アイデアは、アプリケーション管理者にサービスアカウントの資格情報を入力して後で安全な場所に保存できるダッシュボードを提供することです。

Azure Vaultのような安全な場所に保管し、必要に応じてそこから入手すると思います。ただし、鍵と秘密はAzure Vaultのエンティティとは異なります。私はどこかの組み合わせでそれらを保存することはできません。

誰も以前に行ったことはありますか? Azureに資格情報を保存するための良い方法がありますか?

あなたはAzureのブロブストレージが残り(封筒法)でデータを暗号化するために使用する技術を使用することができます
+0

あなたが話している「サービスアカウント」は、ユーザーのAzureサブスクリプションを管理するためのものですか? –

+0

Nope @GauravMantriこれらはDynamics CRMサービスアカウントの資格情報になります。このアカウントは、デーモンアプリを使用してDynamics CRMのエンティティを更新するために使用されます。あなたのブログに従ってください;-) –

+0

サービスアカウントのユーザ名とパスワードはadminによって入力されるため、Azure鍵保管庫に再び追加する価値は何ですか? –

答えて

4

:彼らはのために安全であるよう https://docs.microsoft.com/en-us/azure/storage/storage-client-side-encryption

KeyVaultは/アンラップをラップする能力を持っている(暗号化/復号化)対称鍵を暗号化されたデータと一緒に保存してください。初期化ベクトル(IV)のデータを暗号化RNGCryptoServiceProvider

  • を使用して

    1. Generaete AESキー(256ビット、CBCモード)(資格情報)
    2. 割引:ここ

      は、一般的な手順です。後で解読したいときに検索のために暗号文のバイト配列に連結するだけで済みます.IVは保護する必要がありません。

    3. Key in Keyを使用して、生成されたAES対称鍵をラップ(暗号化)します。
    4. Wraped AES Key、IV、CipherText、およびKey Version(KeyVaultのURIの末尾にあるGUID)を格納します。
    5. Azure ADで作成されたアプリケーション登録に、KeyVaultでのラップ/アンラップ権限を付与していることを確認してください。 GetToken()でクライアントID /アプリケーションID +キーまたはpfxを使用してAzureに認証します。

    あなたはこれらのnugetのパッケージが必要になります:

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

    は、あなたがKeyResolverを持っていたら、あなたはIKEYがあなたのAESのラップを解除/ラップするために取得することができます

    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; 
        } 
    } 
    

    KeyVaultKeyResolver

    へのREFを取得します。以下のように対称キーを使用してください。

    ラップ/暗号化AESキー

    鍵IDをキーVaultとaesKeyからURIは[]暗号化するために、あなたの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(); 
    

    バイトが[]タプルの対称鍵との暗号化されたバイトが含まれています使用されるアルゴリズムの名前。これらを暗号文でメタデータとして保存します。同じキー(鍵のバージョン事項)を使用して

    アンラップ/復号化AESキー

    コール、algoNameは、キー(例えば、「RSA-OAEP」)をラップするために使用されるアルゴリズムの名前です。

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

    その他の詳細については、キーのバックアップ/復元とキーローテーションがあります。

  • 関連する問題