Azure Key Vault를 사용하여 애플리케이션 암호 보호Use Azure Key Vault to protect application secrets

GitHub 샘플 코드GitHub Sample code

다음과 같이 민감하고 보호되어야 하는 애플리케이션 설정을 갖는 것이 일반적입니다.It's common to have application settings that are sensitive and must be protected, such as:

  • 데이터베이스 연결 문자열Database connection strings
  • 암호Passwords
  • 암호화 키Cryptographic keys

보안 모범 사례로 이 암호를 소스 제어에 저장해서는 안됩니다.As a security best practice, you should never store these secrets in source control. 소스 코드 저장소가 비공개인 경우에도 쉽게 누출될 수 있습니다.It's too easy for them to leak — even if your source code repository is private. 공용으로부터 암호를 유지하는 것 뿐만이 아닙니다.And it's not just about keeping secrets from the general public. 대규모 프로젝트에서 프로덕션 암호에 액세스할 수 있는 개발자 및 운영자를 제한할 수 있습니다.On larger projects, you might want to restrict which developers and operators can access the production secrets. (테스트 또는 개발 환경에 대한 설정은 서로 다릅니다.)(Settings for test or development environments are different.)

보다 안전한 옵션은 이러한 비밀을 Azure Key Vault에 저장하는 것입니다.A more secure option is to store these secrets in Azure Key Vault. 키 자격 증명 모음은 암호화 키 및 기타 암호를 관리하기 위한 클라우드 호스티드 서비스입니다.Key Vault is a cloud-hosted service for managing cryptographic keys and other secrets. 이 문서는 키 자격 증명 모음을 사용하여 앱에 대한 구성 설정을 저장하는 방법을 보여줍니다.This article shows how to use Key Vault to store configuration settings for your app.

Tailspin Surveys 애플리케이션에서 다음 설정은 비밀입니다.In the Tailspin Surveys application, the following settings are secret:

  • 데이터베이스 연결 문자열.The database connection string.
  • Redis 연결 문자열.The Redis connection string.
  • 웹 애플리케이션에 대한 클라이언트 암호.The client secret for the web application.

설문 조사 애플리케이션은 다음 위치에서 구성 설정을 로드합니다.The Surveys application loads configuration settings from the following places:

  • appsettings.json 파일The appsettings.json file
  • 사용자 비밀 저장소(개발 환경에만 해당, 테스트용)The user secrets store (development environment only; for testing)
  • 호스팅 환경(Azure 웹앱에서 앱 설정)The hosting environment (app settings in Azure web apps)
  • Key Vault(사용 가능한 경우)Key Vault (when enabled)

각각은 이전 것을 재정의하므로 키 자격 증명 모음에 저장된 모든 설정이 우선적으로 적용됩니다.Each of these overrides the previous one, so any settings stored in Key Vault take precedence.

참고

기본적으로 키 자격 증명 모음 구성 공급자는 사용할 수 없습니다.By default, the Key Vault configuration provider is disabled. 애플리케이션을 로컬로 실행하는 데 필요하지 않습니다.It's not needed for running the application locally. 프로덕션 배포에 사용하도록 허용합니다.You would enable it in a production deployment.

시작 시 애플리케이션은 모든 등록된 구성 공급자에서 설정을 읽고 이를 사용하여 강력한 형식의 옵션 개체를 채웁니다.At startup, the application reads settings from every registered configuration provider, and uses them to populate a strongly typed options object. 자세한 내용은 옵션 및 구성 개체 사용을 참조하세요.For more information, see Using Options and configuration objects.

설문 조사 앱에서 키 자격 증명 모음 설정Setting up Key Vault in the Surveys app

필수 조건:Prerequisites:

대략적인 단계:High-level steps:

  1. 테넌트에서 관리 사용자를 설정합니다.Set up an admin user in the tenant.
  2. 클라이언트 인증서를 설정합니다.Set up a client certificate.
  3. 키 자격 증명 모음을 만듭니다.Create a key vault.
  4. 키 자격 증명 모음에 구성 설정을 추가합니다.Add configuration settings to your key vault.
  5. 키 자격 증명 모음을 사용하는 코드의 주석 처리를 제거합니다.Uncomment the code that enables key vault.
  6. 애플리케이션의 사용자 암호를 업데이트합니다.Update the application's user secrets.

관리 사용자 설정Set up an admin user

참고

키 자격 증명 모음을 만들려면 Azure 구독을 관리할 수 있는 계정을 사용해야 합니다.To create a key vault, you must use an account which can manage your Azure subscription. 또한 키 자격 증명 모음을 읽을 수 있도록 허용하는 모든 애플리케이션을 해당 계정과 동일한 테넌트에 등록해야 합니다.Also, any application that you authorize to read from the key vault must be registered in the same tenant as that account.

이 단계에서 설문 조사 앱이 등록된 테넌트에서 사용자로 로그인한 상태에서 키 자격 증명 모음을 만들 수 있는지 확인합니다.In this step, you will make sure that you can create a key vault while signed in as a user from the tenant where the Surveys app is registered.

Surveys 애플리케이션이 등록된 Azure AD 테넌트 내에서 관리자 사용자를 만듭니다.Create an administrator user within the Azure AD tenant where the Surveys application is registered.

  1. Azure Portal에 로그인합니다.Log into the Azure portal.
  2. 애플리케이션이 등록된 Azure AD 테넌트를 선택합니다.Select the Azure AD tenant where your application is registered.
  3. 추가 서비스 > 보안 + ID > Azure Active Directory > 사용자 및 그룹 > 모든 사용자를 클릭합니다.Click More service > SECURITY + IDENTITY > Azure Active Directory > User and groups > All users.
  4. 포털의 맨 위에서 새 사용자를 클릭합니다.At the top of the portal, click New user.
  5. 필드를 채우고 해당 사용자를 전역 관리자 디렉터리 역할에 할당합니다.Fill in the fields and assign the user to the Global administrator directory role.
  6. 만들기를 클릭합니다.Click Create.

전역 관리자 사용자

이제 이 사용자를 구독 소유자로 할당합니다.Now assign this user as the subscription owner.

  1. 허브 메뉴에서 구독을 선택합니다.On the Hub menu, select Subscriptions.

    Azure Portal 허브의 스크린샷

  2. 관리자가 액세스할 구독을 선택합니다.Select the subscription that you want the administrator to access.

  3. 구독 블레이드에서 액세스 제어(IAM) 를 선택합니다.In the subscription blade, select Access control (IAM).

  4. 추가를 클릭합니다.Click Add.

  5. 역할 아래에서 소유자를 선택합니다.Under Role, select Owner.

  6. 소유자로 추가할 사용자의 메일 주소를 입력합니다.Type the email address of the user you want to add as owner.

  7. 사용자를 선택하고 저장을 클릭합니다.Select the user and click Save.

클라이언트 인증서 설정Set up a client certificate

  1. 다음과 같이 PowerShell 스크립트 /Scripts/Setup-KeyVault.ps1을 실행합니다.Run the PowerShell script /Scripts/Setup-KeyVault.ps1 as follows:

    .\Setup-KeyVault.ps1 -Subject <<subject>>
    

    Subject 매개 변수의 경우 "surveysapp"과 같은 이름을 임의로 입력합니다.For the Subject parameter, enter any name, such as "surveysapp". 스크립트는 자체 서명된 인증서를 생성하고 "현재 사용자/개인" 인증서 저장소에 저장합니다.The script generates a self-signed certificate and stores it in the "Current User/Personal" certificate store. 스크립트의 출력은 JSON 조각입니다.The output from the script is a JSON fragment. 이 값을 복사합니다.Copy this value.

  2. Azure Portal에서 포털의 오른쪽 위에 있는 사용자 계정을 선택하여 Surveys 애플리케이션이 등록된 디렉터리로 전환합니다.In the Azure portal, switch to the directory where the Surveys application is registered, by selecting your account in the top right corner of the portal.

  3. Azure Active Directory > 앱 등록 > 설문 조사를 선택합니다.Select Azure Active Directory > App Registrations > Surveys

  4. 매니페스트, 편집을 차례로 클릭합니다.Click Manifest and then Edit.

  5. 스크립트의 출력을 keyCredentials 속성에 붙여 넣습니다.Paste the output from the script into the keyCredentials property. 다음과 유사하게 나타납니다.It should look similar to the following:

    "keyCredentials": [
        {
        "type": "AsymmetricX509Cert",
        "usage": "Verify",
        "keyId": "29d4f7db-0539-455e-b708-....",
        "customKeyIdentifier": "ZEPpP/+KJe2fVDBNaPNOTDoJMac=",
        "value": "MIIDAjCCAeqgAwIBAgIQFxeRiU59eL.....
        }
    ],
    
  6. 저장을 클릭합니다.Click Save.

  7. 3-6단계를 반복하여 동일한 JSON 조각을 Web API(Surveys.WebAPI)의 애플리케이션 매니페스트에 추가합니다.Repeat steps 3-6 to add the same JSON fragment to the application manifest of the web API (Surveys.WebAPI).

  8. PowerShell 창에서 다음 명령을 실행하여 인증서의 지문을 가져옵니다.From the PowerShell window, run the following command to get the thumbprint of the certificate.

    certutil -store -user my [subject]
    

    [subject]에는 PowerShell 스크립트에서 Subject에 대해 지정한 값을 사용합니다.For [subject], use the value that you specified for Subject in the PowerShell script. 지문은 "Cert Hash(sha1)" 아래에 나열됩니다.The thumbprint is listed under "Cert Hash(sha1)". 이 값을 복사합니다.Copy this value. 나중에 지문을 사용합니다.You will use the thumbprint later.

키 자격 증명 모음 만들기Create a key vault

  1. 다음과 같이 PowerShell 스크립트 /Scripts/Setup-KeyVault.ps1을 실행합니다.Run the PowerShell script /Scripts/Setup-KeyVault.ps1 as follows:

    .\Setup-KeyVault.ps1 -KeyVaultName <<key vault name>> -ResourceGroupName <<resource group name>> -Location <<location>>
    

    자격 증명을 묻는 메시지가 나타나면 이전에 만든 Azure AD 사용자로 로그인합니다.When prompted for credentials, sign in as the Azure AD user that you created earlier. 스크립트는 해당 리소스 그룹 내에 새 리소스 그룹 및 새 키 자격 증명 모음을 만듭니다.The script creates a new resource group, and a new key vault within that resource group.

  2. 다음과 같이 Setup-KeyVault.ps1을 다시 실행합니다.Run Setup-KeyVault.ps1 again as follows:

    .\Setup-KeyVault.ps1 -KeyVaultName <<key vault name>> -ApplicationIds @("<<Surveys app id>>", "<<Surveys.WebAPI app ID>>")
    

    다음 매개 변수 값을 설정합니다.Set the following parameter values:

    * <span data-ttu-id="7acff-188">키 자격 증명 모음 이름 = 이전 단계에서 키 자격 증명 모음에 제공한 이름입니다.</span><span class="sxs-lookup"><span data-stu-id="7acff-188">key vault name = The name that you gave the key vault in the previous step.</span></span>
    * <span data-ttu-id="7acff-189">Surveys 앱 ID = Surveys 웹 애플리케이션의 애플리케이션 ID입니다.</span><span class="sxs-lookup"><span data-stu-id="7acff-189">Surveys app ID = The application ID for the Surveys web application.</span></span>
    * <span data-ttu-id="7acff-190">Surveys.WebApi 앱 ID = Surveys.WebAPI 애플리케이션의 애플리케이션 ID입니다.</span><span class="sxs-lookup"><span data-stu-id="7acff-190">Surveys.WebApi app ID = The application ID for the Surveys.WebAPI application.</span></span>
    

    예제:Example:

     .\Setup-KeyVault.ps1 -KeyVaultName tailspinkv -ApplicationIds @("f84df9d1-91cc-4603-b662-302db51f1031", "8871a4c2-2a23-4650-8b46-0625ff3928a6")
    

    이 스크립트는 웹앱 및 웹 API에 사용자 키 자격 증명 모음에서 암호를 검색할 수 있는 권한을 부여합니다.This script authorizes the web app and web API to retrieve secrets from your key vault. 이에 대한 설명은 Azure Key Vault 시작을 참조하세요.See Get started with Azure Key Vault for more information.

키 자격 증명 모음에 구성 설정 추가Add configuration settings to your key vault

  1. 다음과 같이 Setup-KeyVault.ps1을 실행합니다.Run Setup-KeyVault.ps1 as follows:

    .\Setup-KeyVault.ps1 -KeyVaultName <<key vault name> -KeyName Redis--Configuration -KeyValue "<<Redis DNS name>>.redis.cache.windows.net,password=<<Redis access key>>,ssl=true"
    

    wherewhere

    • 키 자격 증명 모음 이름 = 이전 단계에서 키 자격 증명 모음에 제공한 이름입니다.key vault name = The name that you gave the key vault in the previous step.
    • Redis DNS 이름 = Redis 캐시 인스턴스의 DNS 이름입니다.Redis DNS name = The DNS name of your Redis cache instance.
    • Redis 액세스 키 = Redis 캐시 인스턴스에 대한 액세스 키입니다.Redis access key = The access key for your Redis cache instance.
  2. 이 시점에서 키 자격 증명 모음에 암호를 성공적으로 저장했는지 여부를 테스트하는 것이 좋습니다.At this point, it's a good idea to test whether you successfully stored the secrets to key vault. 다음 PowerShell 명령을 실행합니다.Run the following PowerShell command:

    Get-AzureKeyVaultSecret <<key vault name>> Redis--Configuration | Select-Object *
    
  3. Setup-KeyVault.ps1을 다시 실행하여 데이터베이스 연결 문자열을 추가합니다.Run Setup-KeyVault.ps1 again to add the database connection string:

    .\Setup-KeyVault.ps1 -KeyVaultName <<key vault name> -KeyName Data--SurveysConnectionString -KeyValue <<DB connection string>> -ConfigName "Data:SurveysConnectionString"
    

    여기에서 <<DB connection string>> 은(는) 데이터베이스 연결 문자열의 값입니다.where <<DB connection string>> is the value of the database connection string.

    로컬 데이터베이스로 테스트하기 위해 Tailspin.Surveys.Web/appsettings.json 파일에서 연결 문자열을 복사합니다.For testing with the local database, copy the connection string from the Tailspin.Surveys.Web/appsettings.json file. 이 경우 이중 백슬래시('\\')를 단일 백슬래시로 변경해야 합니다.If you do that, make sure to change the double backslash ('\\') into a single backslash. 이중 백슬래시는 JSON 파일에서 이스케이프 문자입니다.The double backslash is an escape character in the JSON file.

    예제:Example:

    .\Setup-KeyVault.ps1 -KeyVaultName mykeyvault -KeyName Data--SurveysConnectionString -KeyValue "Server=(localdb)\MSSQLLocalDB;Database=Tailspin.SurveysDB;Trusted_Connection=True;MultipleActiveResultSets=true"
    

키 자격 증명 모음을 사용하는 코드의 주석 처리 제거Uncomment the code that enables Key Vault

  1. Tailspin.Surveys 솔루션을 엽니다.Open the Tailspin.Surveys solution.

  2. Tailspin.Surveys.Web/Startup.cs에서 다음 코드 블록을 찾아 주석 처리를 제거합니다.In Tailspin.Surveys.Web/Startup.cs, locate the following code block and uncomment it.

    //var config = builder.Build();
    //builder.AddAzureKeyVault(
    //    $"https://{config["KeyVault:Name"]}.vault.azure.net/",
    //    config["AzureAd:ClientId"],
    //    config["AzureAd:ClientSecret"]);
    
  3. Tailspin.Surveys.Web/Startup.cs에서 ICredentialService를 등록하는 코드를 찾습니다.In Tailspin.Surveys.Web/Startup.cs, locate the code that registers the ICredentialService. CertificateCredentialService를 사용하는 줄의 주석 처리를 제거하고 ClientCredentialService를 사용하는 줄을 주석으로 처리합니다.Uncomment the line that uses CertificateCredentialService, and comment out the line that uses ClientCredentialService:

    // Uncomment this:
    services.AddSingleton<ICredentialService, CertificateCredentialService>();
    // Comment out this:
    //services.AddSingleton<ICredentialService, ClientCredentialService>();
    

    이렇게 변경하면 웹앱이 클라이언트 어설션을 사용하여 OAuth 액세스 토큰을 가져올 수 있습니다.This change enables the web app to use Client assertion to get OAuth access tokens. 클라이언트 어설션을 사용하는 경우 OAuth 클라이언트 암호가 필요 없습니다.With client assertion, you don't need an OAuth client secret. 또는 클라이언트 암호를 키 자격 증명 모음에 저장할 수 있습니다.Alternatively, you could store the client secret in key vault. 그러나 키 자격 증명 모음 및 클라이언트 어설션 모두에서 클라이언트 인증서를 사용하므로 키 자격 증명 모음을 활성화하는 경우 클라이언트 어설션도 활성화하는 것이 좋습니다.However, key vault and client assertion both use a client certificate, so if you enable key vault, it's a good practice to enable client assertion as well.

사용자 암호 업데이트Update the user secrets

솔루션 탐색기에서 Tailspin.Surveys.Web 프로젝트를 마우스 오른쪽 단추로 클릭하고 사용자 암호 관리를 선택합니다.In Solution Explorer, right-click the Tailspin.Surveys.Web project and select Manage User Secrets. secrets.json 파일에서 기존 JSON을 삭제하고 다음에 붙여 넣습니다.In the secrets.json file, delete the existing JSON and paste in the following:

{
  "AzureAd": {
    "ClientId": "[Surveys web app client ID]",
    "ClientSecret": "[Surveys web app client secret]",
    "PostLogoutRedirectUri": "https://localhost:44300/",
    "WebApiResourceId": "[App ID URI of your Surveys.WebAPI application]",
    "Asymmetric": {
      "CertificateThumbprint": "[certificate thumbprint. Example: 105b2ff3bc842c53582661716db1b7cdc6b43ec9]",
      "StoreName": "My",
      "StoreLocation": "CurrentUser",
      "ValidationRequired": "false"
    }
  },
  "KeyVault": {
    "Name": "[key vault name]"
  }
}

[대괄호] 안에 있는 항목을 올바른 값으로 바꿉니다.Replace the entries in [square brackets] with the correct values.

  • AzureAd:ClientId: 설문 조사 앱의 클라이언트 ID입니다.AzureAd:ClientId: The client ID of the Surveys app.
  • AzureAd:ClientSecret: Azure AD에 설문 조사 애플리케이션을 등록할 때 생성된 키입니다.AzureAd:ClientSecret: The key that you generated when you registered the Surveys application in Azure AD.
  • AzureAd:WebApiResourceId: Azure AD에서 Surveys.WebAPI 애플리케이션을 만들 때 지정한 앱 ID URI입니다.AzureAd:WebApiResourceId: The App ID URI that you specified when you created the Surveys.WebAPI application in Azure AD.
  • Asymmetric:CertificateThumbprint: 클라이언트 인증서를 만들 때 이전에 가져온 인증서 지문입니다.Asymmetric:CertificateThumbprint: The certificate thumbprint that you got previously, when you created the client certificate.
  • KeyVault:Name: 키 자격 증명 모음의 이름입니다.KeyVault:Name: The name of your key vault.

참고

Asymmetric:ValidationRequired는 이전에 만든 인증서가 루트 CA(인증 기관)에서 서명되지 않았기 때문에 false입니다.Asymmetric:ValidationRequired is false because the certificate that you created previously was not signed by a root certificate authority (CA). 프로덕션에서는 루트 CA에서 서명된 인증서를 사용하고 ValidationRequired를 true로 설정합니다.In production, use a certificate that is signed by a root CA and set ValidationRequired to true.

업데이트된 secrets.json 파일을 저장합니다.Save the updated secrets.json file.

다음으로 솔루션 탐색기에서 Tailspin.Surveys.WebApi 프로젝트를 마우스 오른쪽 단추로 클릭하고 사용자 암호 관리를 선택합니다.Next, in Solution Explorer, right-click the Tailspin.Surveys.WebApi project and select Manage User Secrets. 기존 JSON을 삭제하고 다음에 붙여 넣습니다.Delete the existing JSON and paste in the following:

{
  "AzureAd": {
    "ClientId": "[Surveys.WebAPI client ID]",
    "WebApiResourceId": "https://tailspin5.onmicrosoft.com/surveys.webapi",
    "Asymmetric": {
      "CertificateThumbprint": "[certificate thumbprint]",
      "StoreName": "My",
      "StoreLocation": "CurrentUser",
      "ValidationRequired": "false"
    }
  },
  "KeyVault": {
    "Name": "[key vault name]"
  }
}

[대괄호] 안에 있는 항목의 이름을 바꾸고 secrets.json 파일을 저장합니다.Replace the entries in [square brackets] and save the secrets.json file.

참고

웹 API의 경우 설문 조사 애플리케이션이 아닌 Surveys.WebAPI 애플리케이션에 대한 클라이언트 ID를 사용해야 합니다.For the web API, make sure to use the client ID for the Surveys.WebAPI application, not the Surveys application.

다음Next