Azure KeyVault から接続文字列を取得するにはどうすればいいですか? 質問する

Azure KeyVault から接続文字列を取得するにはどうすればいいですか? 質問する

仮想の Web サイトは現在、以下を使用して接続しています。

public SqlConnection CreateConnection()
{
   DbConnection connection = new SqlConnection();
   connection.ConnectionString = GetConnectionString();
   connection.Open();

   return connection;
}

魔法の接続文字列が保存される場所web.config:

String GetConnectionString()
{
   //Get the connection string info from web.config
   ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["db"];

   if (cs == null)
      throw new Exception("Could not locate DB connection string");

   return cs.ConnectionString;
}

ここで、接続文字列を web.config ファイルから Azure KeyVault に移動したいと思います。Azure Key Vault から何かを取得するにはどうすればよいでしょうか?

String GetConnectionString()
{
   //Get the connection string info from Azure KeyVault
   String connectionString = GetAzureSecret("dbConnectionString");

   if (String.IsNullOrWhitespace(connectionString)
      throw new Exception.Create("Could not connection string of Azure Key Vault");

   return connectionString;
}

ただし、私は使いやすいAzure APIを作成しました。実際のアピ?

未検証の試み

string GetAzureSecret(string key)
{
    KeyVaultClient vault = new KeyVaultClient();
    vault.OnAuthenticate += VaultClientAuthenticate;

    var sec = await vault.GetSecretAsync(Key);
    return sec.Value;
}

public static async Task<string> VaultClientAuthenticate(string authority, string resource, string scope)
{
   String clientID = "8675209";
   String clientSecret = "correct battery horse pencil";

   var authContext = new AuthenticationContext(authority);
   ClientCredential clientCred = new ClientCredential(clientID, clientSecret);
   AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCred);

   if (result == null)
      throw new Exception("Could not acquire token");

   return result.AccessToken;
}

ボーナス読書

ベストアンサー1

2020年8月の更新

Key Vault 参照を介して、カスタム コードを一切使用せずに App Service から Key Vault を呼び出す、簡単な手順が実現しました。https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references

Key Vault から値を入力するアプリ設定の例:

@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931)

バージョン識別子が必要ない場合:

@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)

Key Vault 参照を使用できるようにするには、まず App Service インスタンスと Key Vault の間にマネージド ID を設定する必要があります。

Key Vault には何の反感もありません (素晴らしい製品だと思います!) が、過剰に設計されているように思えてなりません。

私は単に内蔵のアプリケーションの設定Azure App Serviceの機能:

接続文字列

.NETアプリの場合、これらの接続文字列は実行時に.NET構成のconnectionStrings設定に挿入されます。キーがリンクされたデータベース名と等しい既存のエントリを上書きします。

Web アプリ → アプリケーション設定 → 接続文字列 → 接続文字列を追加して名前を付けますdb

String GetConnectionString()
{
   // Get the Connection String from Application Settings (App Service) 
   // with graceful fallback to web.config
   string cs = WebConfigurationManager.ConnectionStrings["db"].ConnectionString;

   if (cs == null)
      throw new Exception("Could not locate DB connection string");

   return cs;
}

WebConfigurationManager と ConfigurationManager の違いは何ですか?

2018年5月の更新:

以来マネージドサービスアイデンティティが実現したため、アクセス トークンを取得する際に、Key Vault にアクセスするためにサービス内にシークレット (サービス プリンシパルの資格情報) を保存する必要がなくなり、はるかに優れた提案となりました。この回答に少しスパイスを加えるために、Node.js のサンプルを次に示します。

// Get an access token from Managed Service Identity
// on an Azure IaaS VM
async function getAccessTokenWithMSI() {
  let msi = await axios.get('http://169.254.169.254/metadata/identity/oauth2/token',
    {
      params: {
        'api-version': '2018-02-01',
        'resource': 'https://vault.azure.net'
      },
      headers: {
        'Metadata': 'true'
      },
      timeout: 2000
    });

  return msi.data.access_token;
}

その後:

// Get a secret from Key Vault
async function getSecret(accessToken, secretUrl) {
  let response;
  try {
    response = await axios.get(secretUrl,
      {
         params: { 'api-version': '2016-10-01' },
         headers: { 'Authorization': `Bearer ${accessToken}` },
         timeout: 3000
      });
  }
  catch (e) {
    console.log('\nError calling Key Vault:,
        e.response.status, e.response.statusText, e.response.data);
  }
  console.log('\nGet Secret response from Key Vault: ',
      JSON.stringify(response.data, null, 4));

  return response.data;
}

おすすめ記事