source

Azure KeyVault에서 연결 문자열을 가져오는 방법은 무엇입니까?

ittop 2023. 5. 27. 11:59
반응형

Azure KeyVault에서 연결 문자열을 가져오는 방법은 무엇입니까?

가상의 웹 사이트는 현재 다음을 사용하여 연결됩니다.

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 키 저장소에서 무엇이든 검색하려면 어떻게 해야 합니까?

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를 만든 것을 제외하고는.실제 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;
}

보너스 판독치

2020년 8월 업데이트

이제 키 볼트 참조를 통해 사용자 지정 코드가 없는 앱 서비스에서 키 볼트를 호출하는 낮은 형식의 방법이 있습니다.https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references

키 볼트의 값을 채우는 앱 설정 예제:

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

버전 식별자를 원하지 않는 경우:

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

키 볼트 참조를 사용하려면 먼저 앱 서비스 인스턴스와 키 볼트 간에 관리 ID를 설정해야 합니다.

저는 Key Vault(훌륭한 제품이라고 생각합니다!)에 반대하는 것은 없지만, 저는 당신이 이것을 너무 과장하고 있다고 생각하지 않을 수 없습니다.

Azure App Service에 내장된 애플리케이션 설정 기능을 사용하기만 하면 됩니다.

연결 문자열

.NET 앱의 경우 이러한 연결 문자열이 런타임에 .NET 구성 연결 문자열 설정에 주입되어 키가 연결된 데이터베이스 이름과 동일한 기존 항목을 재정의합니다.

App Settings → Strings → 을 추가하고 을 지정합니다. 응 → 그 연 → 연 문 → 결 문 열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;
}

Web Configuration Manager와 Configuration Manager의 차이점은 무엇입니까?

2018년 5월 업데이트:

Managed Service Identity가 보편화되었기 때문에 액세스 토큰을 획득하는 데 더 이상 서비스에 저장된 비밀(서비스 주체 자격 증명)이 필요하지 않습니다. 이는 훨씬 더 나은 제안입니다.다음은 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;
}

실제 api는 무엇입니까?

GetSecret API를 사용하여 가치를 얻을 수 있습니다.

준비:

레지스트리 Azure Active Directory 응용 프로그램 및 역할 할당

단계:

1. Azure 포털에서 KeyVault를 생성하고 암호를 추가합니다.

여기에 이미지 설명 입력

2. 액세스 정책 구성

여기에 이미지 설명 입력

3. 액세스 토큰 가져오기

 var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
            ClientCredential clientCredential = new ClientCredential(appId, secretKey);
            var tokenResponse =await context.AcquireTokenAsync("https://vault.azure.net", clientCredential);
            var accessToken = tokenResponse.AccessToken;
            return accessToken;

참고: Keyvault의 리소스는 다음과 같습니다.https://vault.azure.net

4. Fiddler를 사용한 테스트

여기에 이미지 설명 입력

SDK를 사용하면 다음과 같이 쉽게 할 수 있습니다.

1. 콘솔 프로젝트와 Utils.cs 파일을 만듭니다.

public static string EncryptSecret { get; set; }
        static string appId = "Application ID";
        static string secretKey = "Secert key";
        static string tenantId = "TenantId";

        public static async Task<string> GetAccessToken(string azureTenantId,string azureAppId,string azureSecretKey)
        {

            var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
            ClientCredential clientCredential = new ClientCredential(appId, secretKey);
            var tokenResponse =await context.AcquireTokenAsync("https://vault.azure.net", clientCredential);
            var accessToken = tokenResponse.AccessToken;
            return accessToken;
        }

2. 메인 기능에 아래의 follow code를 추가하여 테스트합니다.

여기에 이미지 설명 입력

packages.config 파일

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Hyak.Common" version="1.0.2" targetFramework="net452" />
  <package id="Microsoft.Azure.Common" version="2.0.4" targetFramework="net452" />
  <package id="Microsoft.Azure.Common.Dependencies" version="1.0.0" targetFramework="net452" />
  <package id="Microsoft.Azure.KeyVault" version="1.0.0" targetFramework="net452" />
  <package id="Microsoft.Bcl" version="1.1.9" targetFramework="net452" />
  <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net452" />
  <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net452" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.13.9" targetFramework="net452" />
  <package id="Microsoft.Net.Http" version="2.2.22" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" />
</packages>

또한 CtrlDot에 언급된 문서에서 더 많은 정보를 얻을 수 있습니다.

.net Core의 경우 이미 Azure Key Vault가 설치되어 있습니다.이제는 아주 쉽습니다.연결 문자열이 appsettings.json에 있다고 가정합니다.

{
   "ConnectionStrings": {
      "MyDatabase": "server=127.0.0.1;port=5678;database=mydb;user=FullMontyBurns;password=hunter2"
   } 
}

설정 작업을 수행할 때는Startup.cs:

string connectionString = configuration.GetConnectionString("MyDatabase");

Azure Key Vault에서 다음과 같은 암호를 생성합니다.

  • 이름: ConnectionStrings--MyDatabase
  • 값: server=127.0.0.1;port=5678;database=mydb;user=FullMontyBurns;password=hunter2

여기에 이미지 설명 입력

IConfiguration.GetConnectionString("MyDatabase")이제 키 볼트에서 값을 가져옵니다.

다른 사람들은 이미 웹 앱 또는 Azure Function과 통합하는 방법에 대한 컨텍스트와 함께 훌륭한 답변을 제공했지만, 여기에 Key Vault Secrets SDK를 시작하기 위한 결정적인 참고 자료가 있습니다.

.그물

자바

자바스크립트

파이썬

언급URL : https://stackoverflow.com/questions/43722030/how-to-get-connection-string-out-of-azure-keyvault

반응형