다음을 통해 공유


자습서: Windows VM/VMSS를 사용하여 Azure 리소스에 액세스

Azure 리소스에 대한 관리 ID는 Microsoft Entra ID의 기능입니다. Azure 리소스에 대한 관리 ID를 지원하는 각 Azure 서비스는 자체 타임라인을 따릅니다. 시작하기 전에 리소스의 관리 ID 가용성 상태와 알려진 문제를 검토하세요.

필수 조건

Windows VM 시스템 할당 관리 ID를 사용하여 Azure Data Lake Store에 액세스

이 자습서에서는 Windows VM(가상 머신)에 대한 시스템 할당 관리 ID를 사용하여 Azure Data Lake Store에 액세스하는 방법을 보여줍니다. 관리 ID는 Azure에서 자동으로 관리됩니다. 이를 사용하면 애플리케이션이 코드에 자격 증명을 삽입할 필요 없이 Microsoft Entra 인증을 지원하는 서비스에 인증할 수 있습니다.

이 문서에서는 다음을 수행하는 방법을 알아봅니다.

  • VM에 Azure Data Lake Store에 대한 액세스 권한 부여
  • VM ID를 사용하여 액세스 토큰 가져오기 및 Azure Data Lake Store에 액세스하는 데 사용하기

Enable

한 번의 클릭으로 시스템 할당 관리 ID를 활성화할 수 있습니다. VM을 만드는 동안 또는 기존 VM의 속성에서 이 기능을 활성화할 수 있습니다.

스크린샷은 시스템 할당 상태를 켤 수 있는 가상 머신에 대한 시스템 할당 탭을 보여줍니다.

기존 VM에서 시스템 할당 관리 ID를 사용하도록 설정하려면 다음을 수행합니다.

  1. Azure Portal에 로그인합니다.

  2. 시스템 할당 ID가 설정된 가상 머신 만들기.

액세스 허가

Azure Data Lake Store에 있는 파일 및 폴더에 대한 VM 액세스 권한을 부여할 수 있습니다. 이 단계에서는 기존 Data Lake Store를 사용하거나 새로 만들 수 있습니다.

Azure Portal을 사용하여 새 Data Lake Store를 만들려면 이 Azure Data Lake Store 빠른 시작을 참조하세요. Azure Data Lake Store 설명서에서 Azure CLI 및 Azure PowerShell을 사용하는 빠른 시작도 있습니다.

Data Lake Store에서 새 폴더를 만들고 VM의 시스템 할당 ID 권한을 부여합니다. ID에는 해당 폴더의 파일을 읽고 쓰고 실행할 수 있는 권한이 필요합니다.

  1. Azure Portal의 왼쪽 탐색 창에서 Data Lake Store를 선택합니다.
  2. 이 자습서에 사용하려는 Data Lake Store를 선택합니다.
  3. 명령 모음에서 데이터 탐색기를 선택합니다.
  4. Data Lake Store의 루트 폴더를 선택합니다. 명령 모음에서 액세스를 선택합니다.
  5. 추가를 선택합니다. 선택 필드에서 VM의 이름을 입력합니다(예: DevTestVM). 검색 결과에서 VM을 선택한 다음 선택을 선택합니다.
  6. 사용 권한 선택, 읽기실행을 선택합니다. 이 폴더에 추가한 다음 액세스 권한만을 선택합니다.
  7. 확인을 선택한다음, 액세스 창을 닫습니다. 사용 권한은 성공적으로 추가되어야 합니다.
  8. 다음으로 새 폴더를 만듭니다. 명령 모음에서 새 폴더를 선택하고 새 폴더에 이름을 지정합니다. 예를 들어 TestFolder를 선택한 다음 확인을 선택합니다.
  9. 사용자가 만든 폴더를 선택한 다음, 명령 모음에서 액세스를 선택합니다.
  10. 추가를 선택한 다음 선택 필드에서 VM의 이름을 입력하고 선택을 선택합니다.
  11. 사용 권한 선택, 읽기, 쓰기, 실행을 선택합니다. 이 폴더에 추가한 다음, 액세스 권한 항목 및 기본 사용 권한 항목으로 추가합니다.
  12. 확인을 선택합니다. 사용 권한을 성공적으로 추가해야 합니다.

VM의 시스템 할당 관리 ID는 사용자가 만든 폴더에 있는 파일에서 모든 작업을 수행할 수 있습니다. Data Lake Store에 대한 액세스 권한을 관리하는 방법에 대한 자세한 내용은 Data Lake Store의 Access Control을 참조하세요.

데이터 액세스

Azure Data Lake Store는 기본적으로 Microsoft Entra 인증을 지원하므로 Azure 리소스에 대한 관리 ID를 사용하여 획득한 액세스 토큰을 직접 수락할 수 있습니다. Data Lake Store 파일 시스템에 인증하려면 권한 부여 헤더에 있는 Data Lake Store 파일 시스템 엔드포인트에 Microsoft Entra ID에서 발급한 액세스 토큰을 보냅니다. 헤더의 형식은 Bearer <ACCESS_TOKEN_VALUE>입니다.

Microsoft Entra 인증을 위한 Data Lake Store 지원에 대해 자세히 알아보려면 Microsoft Entra ID를 사용하여 Data Lake Store로 인증을 참조하세요.

참고 항목

Data Lake Store 파일 시스템 클라이언트 SDK는 Azure 리소스에 대한 관리 ID를 아직 지원하지 않습니다.

이 자습서에서는 REST를 요청하는 PowerShell을 사용하여 Data Lake Store 파일 시스템 REST API에 인증합니다. 인증을 위해 VM의 시스템 할당 관리 ID를 사용하려면 VM에서 요청해야 합니다.

  1. 포털에서 Virtual Machines로 이동하여 Windows VM으로 이동합니다. 그런 다음 개요에서 연결을 선택합니다.

  2. Windows VM을 만들 때 추가한 사용자 이름암호를 입력합니다.

  3. 이제 가상 머신에 대한 원격 데스크톱 연결을 만들었으므로 원격 세션에서 PowerShell을 엽니다.

  4. PowerShell Invoke-WebRequest cmdlet을 사용하여 Azure 리소스 엔드포인트에 대한 로컬 관리 ID에 요청하여 Azure Data Lake Store에 대한 액세스 토큰을 가져옵니다. Data Lake Store의 리소스 식별자는 https://datalake.azure.net/입니다. Data Lake가 리소스 식별자와 정확히 일치하므로 후행 슬래시가 중요합니다.

    $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatalake.azure.net%2F' -Method GET -Headers @{Metadata="true"}
    

    JSON 개체에서 PowerShell 개체로 응답을 변환합니다.

    $content = $response.Content | ConvertFrom-Json
    

    응답에서 액세스 토큰을 추출합니다.

    $AccessToken = $content.access_token
    
  5. 모든 항목이 올바르게 구성되었는지 확인합니다. PowerShell Invoke-WebRequest cmdlet을 사용하여 Data Lake Store의 REST 엔드포인트에 루트 폴더의 폴더를 나열하도록 요청합니다. 권한 부여 헤더에 Bearer 문자열에 대문자 "B"가 있는 것이 중요합니다. Data Lake Store의 개요 섹션에서 Data Lake Store의 이름을 찾을 수 있습니다.

    Invoke-WebRequest -Uri https://<YOUR_ADLS_NAME>.azuredatalakestore.net/webhdfs/v1/?op=LISTSTATUS -Headers @{Authorization="Bearer $AccessToken"}
    

    성공적인 응답은 다음과 같습니다.

    StatusCode        : 200
    StatusDescription : OK
    Content           : {"FileStatuses":{"FileStatus":[{"length":0,"pathSuffix":"TestFolder","type":"DIRECTORY", "blockSize":0,"accessTime":1507934941392, "modificationTime":1507944835699,"replication":0, "permission":"770","ow..."
    RawContent        : HTTP/1.1 200 OK
                        Pragma: no-cache
                        x-ms-request-id: b4b31e16-e968-46a1-879a-3474aa7d4528
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosniff
                        Strict-Transport-Security: ma...
    Forms             : {}
    Headers           : {[Pragma, no-cache], [x-ms-request-id, b4b31e16-e968-46a1-879a-3474aa7d4528],
                        [x-ms-webhdfs-version, 17.04.22.00], [Status, 0x0]...}
    Images            : {}
    InputFields       : {}
    Links             : {}
    ParsedHtml        : System.__ComObject
    RawContentLength  : 556
    
  6. 이제 Data Lake Store에 파일을 업로드해 보세요. 먼저 업로드할 파일을 만듭니다.

    echo "Test file." > Test1.txt
    
  7. PowerShell Invoke-WebRequest cmdlet을 사용하여 이전에 만든 폴더에 파일을 업로드하도록 Data Lake Store의 REST 엔드포인트에 요청합니다. 이 요청은 두 단계로 이루어집니다.

    1. 요청을 수행하고 파일을 업로드할 위치로 리디렉션을 가져옵니다.
    2. 파일을 업로드합니다. 이 자습서에서 설명한 값과 다른 값을 사용하는 경우 폴더 및 파일의 이름을 적절하게 설정해야 합니다.
    $HdfsRedirectResponse = Invoke-WebRequest -Uri https://<YOUR_ADLS_NAME>.azuredatalakestore.net/webhdfs/v1/TestFolder/Test1.txt?op=CREATE -Method PUT -Headers @{Authorization="Bearer $AccessToken"} -Infile Test1.txt -MaximumRedirection 0
    

    $HdfsRedirectResponse 값을 삽입하는 경우 다음과 같은 응답이 표시됩니다.

    PS C:\> $HdfsRedirectResponse
    
    StatusCode        : 307
    StatusDescription : Temporary Redirect
    Content           : {}
    RawContent        : HTTP/1.1 307 Temporary Redirect
                        Pragma: no-cache
                        x-ms-request-id: b7ab492f-b514-4483-aada-4aa0611d12b3
                        ContentLength: 0
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosn...
    Headers           : {[Pragma, no-cache], [x-ms-request-id, b7ab492f-b514-4483-aada-4aa0611d12b3], 
                        [ContentLength, 0], [x-ms-webhdfs-version, 17.04.22.00]...}
    RawContentLength  : 0
    

    리디렉션 엔드포인트에 요청을 보내어 업로드를 완료합니다.

    Invoke-WebRequest -Uri $HdfsRedirectResponse.Headers.Location -Method PUT -Headers @{Authorization="Bearer $AccessToken"} -Infile Test1.txt -MaximumRedirection 0
    

    성공적인 응답은 다음과 같습니다.

    StatusCode        : 201
    StatusDescription : Created
    Content           : {}
    RawContent        : HTTP/1.1 201 Created
                        Pragma: no-cache
                        x-ms-request-id: 1e70f36f-ead1-4566-acfa-d0c3ec1e2307
                        ContentLength: 0
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosniff
                        Strict...
    Headers           : {[Pragma, no-cache], [x-ms-request-id, 1e70f36f-ead1-4566-acfa-d0c3ec1e2307],
                        [ContentLength, 0], [x-ms-webhdfs-version, 17.04.22.00]...}
    RawContentLength  : 0
    

마지막으로 다른 Data Lake Store 파일 시스템 API를 사용하여 파일에 추가하고 다운로드하는 등의 작업을 수행할 수 있습니다.

사용 안 함

VM에서 시스템이 할당 ID를 사용하지 않도록 설정하려면 시스템 할당 ID의 상태를 해제로 설정합니다.

스크린샷은 시스템 할당 상태를 해제할 수 있는 가상 머신에 대한 시스템 할당 탭을 보여줍니다.

Windows VM 시스템 할당 관리 ID를 사용하여 Azure Storage에 액세스

이 자습서에서는 Windows VM(가상 머신)에 대한 시스템 할당 관리 ID를 사용하여 Azure Storage에 액세스하는 방법을 보여줍니다. 다음 방법에 대해 설명합니다.

  • 스토리지 계정에 Blob 컨테이너 만들기
  • 스토리지 계정에 Windows VM의 시스템 할당 관리 ID 액세스 부여
  • 액세스 가져오기 및 액세스를 사용하여 Azure Storage 호출

Enable

한 번의 클릭으로 시스템 할당 관리 ID를 활성화할 수 있습니다. VM을 만드는 동안 또는 기존 VM의 속성에서 이 기능을 활성화할 수 있습니다.

스크린샷은 시스템 할당 상태를 켤 수 있는 가상 머신에 대한 시스템 할당 탭을 보여줍니다.

기존 VM에서 시스템 할당 관리 ID를 사용하도록 설정하려면 다음을 수행합니다.

  1. Azure Portal에 로그인합니다.

  2. 시스템 할당 ID가 설정된 가상 머신 만들기.

스토리지 계정 만들기

이 섹션에서는 스토리지 계정을 만듭니다.

  1. Azure Portal의 왼쪽 위 모서리에서 + 리소스 만들기 단추를 선택합니다.

  2. 스토리지를 선택한 다음, 스토리지 계정 - Blob, 파일, 테이블, 큐를 선택합니다.

  3. 이름 필드에 저장소 계정의 이름을 입력합니다.

  4. 배포 모델계정 종류리소스 관리자스토리지(범용 v1)로 설정해야 합니다.

  5. 구독리소스 그룹은 이전 단계에서 VM을 만들 때 지정한 것과 일치합니다.

  6. 만들기를 실행합니다.

    새 스토리지 계정을 만드는 방법을 보여 주는 스크린샷

Blob 컨테이너 만들기 및 스토리지 계정에 파일 업로드

파일에 Blob Storage가 필요하므로 파일을 저장할 Blob 컨테이너를 만들어야 합니다. 그런 다음, 새 스토리지 계정에서 Blob 컨테이너에 파일을 업로드합니다.

  1. 새로 만든 스토리지 계정으로 이동합니다.

  2. Blob Service 섹션에서 컨테이너를 선택합니다.

  3. 페이지 맨 위에서 + 컨테이너를 선택합니다.

  4. 새 컨테이너 필드에 컨테이너의 이름을 입력한 다음 공용 액세스 수준 옵션에서 기본값을 유지합니다.

    스토리지 컨테이너를 만드는 방법을 보여 주는 스크린샷.

  5. 선택한 편집기를 사용하여 로컬 컴퓨터에서 hello world.txt라는 파일을 만듭니다. 파일을 열고 Hello world!에 텍스트를 추가한 후, 저장합니다.

  6. 새로 만든 컨테이너에 파일을 업로드할 컨테이너 이름을 선택한 다음 업로드를 선택합니다.

  7. Blob 업로드 창의 파일 섹션에서 폴더 아이콘을 선택하고 로컬 컴퓨터의 파일 hello_world.txt를 찾습니다. 그런 다음 파일을 선택하고 업로드합니다. 텍스트 파일 업로드 화면을 보여 주는 스크린샷.

액세스 허가

이 섹션에서는 VM에 Azure Storage 컨테이너에 대한 액세스 권한을 부여하는 방법을 보여줍니다. VM의 시스템 할당 관리 ID를 사용하여 Azure Storage Blob에서 데이터를 검색할 수 있습니다.

  1. 새로 만든 스토리지 계정으로 이동합니다.

  2. 액세스 제어(IAM) 를 선택합니다.

  3. 추가>역할 할당 추가를 선택하여 역할 할당 추가 페이지를 엽니다.

  4. 다음 역할을 할당합니다. 세부 단계에 대해서는 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

    설정
    역할 Storage Blob 데이터 읽기 권한자
    다음에 대한 액세스 할당 관리 ID
    시스템 할당 가상 머신
    선택 <가상 머신>

    역할 할당 추가 페이지를 보여 주는 스크린샷.

데이터 액세스

Azure Storage는 기본적으로 Microsoft Entra 인증을 지원하므로 관리 ID를 사용하여 획득한 액세스 토큰을 직접 수락할 수 있습니다. 이 접근 방법은 Azure Storage와 Microsoft Entra ID의 통합을 사용하며, 연결 문자열에서 자격 증명을 제공하는 것과는 다릅니다.

다음은 Azure Storage에 대한 연결을 여는 .NET 코드 예제입니다. 이 예제에서는 액세스 토큰을 사용한 다음, 이전에 만든 파일의 내용을 읽습니다. VM의 관리 ID 엔드포인트에 액세스하기 위해서는 VM에 대해 이 코드를 실행해야 합니다. 액세스 토큰 방법을 사용하려면 .NET Framework 4.6 이상이 필요합니다. <URI to blob file>의 값을 적절하게 바꿉니다. 만들고 Blob Storage로 업로드한 파일로 이동하고 속성 아래의 URL개요 페이지로 복사하여 이 값을 가져올 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace StorageOAuthToken
{
    class Program
    {
        static void Main(string[] args)
        {
            //get token
            string accessToken = GetMSIToken("https://storage.azure.com/");

            //create token credential
            TokenCredential tokenCredential = new TokenCredential(accessToken);

            //create storage credentials
            StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);

            Uri blobAddress = new Uri("<URI to blob file>");

            //create block blob using storage credentials
            CloudBlockBlob blob = new CloudBlockBlob(blobAddress, storageCredentials);

            //retrieve blob contents
            Console.WriteLine(blob.DownloadText());
            Console.ReadLine();
        }

        static string GetMSIToken(string resourceID)
        {
            string accessToken = string.Empty;
            // Build request to acquire MSI token
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=" + resourceID);
            request.Headers["Metadata"] = "true";
            request.Method = "GET";

            try
            {
                // Call /token endpoint
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Pipe response Stream to a StreamReader, and extract access token
                StreamReader streamResponse = new StreamReader(response.GetResponseStream());
                string stringResponse = streamResponse.ReadToEnd();
                JavaScriptSerializer j = new JavaScriptSerializer();
                Dictionary<string, string> list = (Dictionary<string, string>)j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
                accessToken = list["access_token"];
                return accessToken;
            }
            catch (Exception e)
            {
                string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                return accessToken;
            }
        }
    }
}

응답에는 파일의 내용이 포함됩니다.

Hello world! :)

사용 안 함

VM에서 시스템이 할당 ID를 사용하지 않도록 설정하려면 시스템 할당 ID의 상태를 해제로 설정합니다.

스크린샷은 시스템 할당 상태를 해제할 수 있는 가상 머신에 대한 시스템 할당 탭을 보여줍니다.

Windows VM 시스템 할당 관리 ID를 사용하여 SAS 자격 증명으로 Azure Storage에 액세스

이 자습서에서는 Windows VM(가상 머신)에 대한 시스템 할당 ID를 사용하여 SAS(공유 액세스 서명) 자격 증명을 얻는 방법을 보여줍니다.

서비스 SAS는 제한된 시간 및 특정 서비스(이 경우 Blob 서비스)에 대해 스토리지 계정의 개체에 대해 제한된 액세스 권한을 부여하는 기능을 제공합니다. SAS는 계정 액세스 키를 노출하지 않고 이 작업을 수행합니다. 스토리지 작업에 평소와 같이 SAS 자격 증명을 사용할 수 있습니다. 예를 들어 스토리지 SDK를 사용하는 경우입니다. 이 자습서에서는 Azure Storage PowerShell을 사용하여 Blob을 업로드 및 다운로드하는 과정을 보여 줍니다.

이 문서에서 배울 내용은 다음과 같습니다.

  • 스토리지 계정 만들기
  • Resource Manager의 스토리지 계정 SAS에 대한 VM 액세스 권한 부여
  • VM ID를 사용하여 액세스 토큰을 가져오고 리소스 관리자에서 SAS를 검색하는 데 사용

참고 항목

Azure Az PowerShell 모듈을 사용하여 Azure와 상호 작용하는 것이 좋습니다. 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

스토리지 계정 만들기

아직 없는 경우 스토리지 계정을 만들어야 합니다. 그렇지 않으면 다음 단계에 따라 VM의 시스템 할당 관리 ID에 기존 스토리지 계정의 SAS 자격 증명에 대한 액세스 권한을 부여합니다.

  1. 스토리지를 선택한 다음, 스토리지 계정을 선택합니다.

  2. 스토리지 계정 만들기 패널에서 스토리지 계정의 이름을 입력합니다.

  3. 배포 모델계정 종류Resource Manager범용으로 설정되어 있는지 확인합니다.

  4. 구독리소스 그룹이 이전 단계에서 VM을 만들 때 지정한 항목과 일치하는지 확인합니다.

  5. 만들기를 선택하여 스토리지 계정을 만듭니다.

    새 스토리지 계정을 만드는 방법을 보여 주는 스크린샷

스토리지 계정에서 BLOB 컨테이너 만들기

자습서의 뒷부분에서 파일을 업로드하고 새 스토리지 계정에 다운로드합니다. 파일에 Blob Storage가 필요하기 때문에 파일을 저장할 Blob 컨테이너를 만들어야 합니다.

  1. 새로 만든 스토리지 계정으로 이동합니다.

  2. 왼쪽 패널에서 Blob service컨테이너 링크를 선택합니다.

  3. 페이지 맨 위에서 + 컨테이너를 선택하면, 새 컨테이너 패널이 나타납니다.

  4. 컨테이너에 이름을 지정하고 액세스 수준을 확인한 다음 확인을 선택합니다. 여기서 지정한 이름은 자습서의 뒷부분에서 사용됩니다.

    스토리지 컨테이너를 만드는 방법을 보여 주는 스크린샷

스토리지 SAS를 사용하도록 VM의 시스템 할당 관리 ID 액세스 부여

Azure Storage는 기본적으로 Microsoft Entra 인증을 지원하지 않습니다. 그러나 관리 ID를 사용하여 Resource Manager에서 스토리지 SAS를 검색한 다음, 해당 SAS를 사용하여 스토리지에 액세스할 수 있습니다. 이 단계에서 스토리지 계정 SAS에 대한 VM의 시스템 할당 관리 ID 액세스 권한을 부여합니다.

  1. 새로 만든 스토리지 계정으로 다시 이동합니다.

  2. 액세스 제어(IAM) 를 선택합니다.

  3. 추가>역할 할당 추가를 선택하여 역할 할당 추가 페이지를 엽니다.

  4. 다음 역할을 할당합니다. 세부 단계에 대해서는 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

    설정
    역할 스토리지 계정 기여자
    다음에 대한 액세스 할당 관리 ID
    시스템 할당 가상 머신
    선택 <Windows 가상 머신>

    역할 할당 추가 페이지를 보여 주는 스크린샷.

VM의 ID를 사용하여 액세스 토큰을 가져온 다음 Azure Resource Manager를 호출하는 데 사용

이 자습서의 나머지 부분에서는 VM에서 작업합니다. 이 부분에서는 Azure Resource Manager PowerShell cmdlet을 사용해야 합니다. PowerShell을 설치하지 않은 경우 계속하기 전에 최신 버전을 다운로드할 수 있습니다.

  1. Azure Portal에서 Virtual Machines, Windows 가상 머신으로 이동한 후 개요 페이지 위쪽의 연결을 선택합니다.

  2. Windows VM을 만들 때 추가한 사용자 이름암호를 입력합니다.

  3. 가상 머신을 사용하여 원격 데스크톱 연결을 설정합니다.

  4. 원격 세션에서 PowerShell을 연 다음, PowerShell Invoke-WebRequest cmdlet을 사용하여 Azure 리소스 엔드포인트에 대한 로컬 관리 ID에서 Azure Resource Manager 토큰을 가져옵니다.

       $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -Method GET -Headers @{Metadata="true"}
    

    참고 항목

    resource 매개 변수의 값은 Microsoft Entra ID에서 예상하는 값과 정확히 일치해야 합니다. Azure Resource Manager 리소스 ID를 사용할 때는 URI에 후행 슬래시를 포함해야 합니다.

    다음으로 $response 개체에서 JSON(JavaScript Object Notation) 형식의 문자열로 저장된 content 요소를 추출합니다.

    $content = $response.Content | ConvertFrom-Json
    

    다음으로는 응답에서 액세스 토큰을 추출합니다.

    $ArmToken = $content.access_token
    

스토리지 호출을 위해 Azure Resource Manager에서 SAS 자격 증명 가져오기

마지막으로 PowerShell을 사용하여 이전 섹션에서 검색한 액세스 토큰을 사용하여 Resource Manager를 호출합니다. 이 토큰을 사용하여 스토리지 SAS 자격 증명을 만듭니다. SAS 자격 증명이 있으면 다른 스토리지 작업을 호출할 수 있습니다.

이 요청의 경우 다음 HTTP 요청 매개 변수를 사용하여 SAS 자격 증명을 만듭니다.

{
    "canonicalizedResource":"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>",
    "signedResource":"c",              // The kind of resource accessible with the SAS, in this case a container (c).
    "signedPermission":"rcw",          // Permissions for this SAS, in this case (r)ead, (c)reate, and (w)rite. Order is important.
    "signedProtocol":"https",          // Require the SAS be used on https protocol.
    "signedExpiry":"<EXPIRATION TIME>" // UTC expiration time for SAS in ISO 8601 format, for example 2017-09-22T00:06:00Z.
}

여기에 있는 매개 변수는 SAS 자격 증명에 대한 요청 POST 본문에 포함됩니다. SAS 자격 증명을 만들기 위한 매개 변수에 대한 자세한 내용은 서비스 SAS REST 목록 참조를 참조하세요.

  1. 매개 변수를 JSON으로 변환한 다음 스토리지 listServiceSas 엔드포인트를 호출하여 SAS 자격 증명을 만듭니다.

    $params = @{canonicalizedResource="/blob/<STORAGE-ACCOUNT-NAME>/<CONTAINER-NAME>";signedResource="c";signedPermission="rcw";signedProtocol="https";signedExpiry="2017-09-23T00:00:00Z"}
    $jsonParams = $params | ConvertTo-Json
    
    $sasResponse = Invoke-WebRequest -Uri https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE-ACCOUNT-NAME>/listServiceSas/?api-version=2017-06-01 -Method POST -Body $jsonParams -Headers @{Authorization="Bearer $ArmToken"}
    

    참고 항목

    URL은 대/소문자를 구분하므로 resourceGroups의 대문자 "G"를 포함하여 리소스 그룹의 이름을 지정할 때 사용한 것과 동일한 대/소문자를 사용해야 합니다.

  2. 다음으로 응답에서 SAS 자격 증명을 추출합니다.

    $sasContent = $sasResponse.Content | ConvertFrom-Json
    $sasCred = $sasContent.serviceSasToken
    
  3. SAS 자격 증명을 검사하는 경우 다음과 같이 표시됩니다.

    PS C:\> $sasCred
    sv=2015-04-05&sr=c&spr=https&se=2017-09-23T00%3A00%3A00Z&sp=rcw&sig=JVhIWG48nmxqhTIuN0uiFBppdzhwHdehdYan1W%2F4O0E%3D
    
  4. test.txt 파일을 만듭니다. 그런 다음 SAS 자격 증명을 사용하여 New-AzStorageContent cmdlet으로 인증하고 파일을 blob 컨테이너로 업로드한 다음 파일을 다운로드합니다.

    echo "This is a test text file." > test.txt
    
  5. 먼저 Install-Module Azure.Storage를 사용하여 Azure Storage cmdlet을 설치해야 합니다. PowerShell Set-AzStorageBlobContent cmdlet을 사용하여 방금 만든 Blob을 업로드합니다.

    $ctx = New-AzStorageContext -StorageAccountName <STORAGE-ACCOUNT-NAME> -SasToken $sasCred
    Set-AzStorageBlobContent -File test.txt -Container <CONTAINER-NAME> -Blob testblob -Context $ctx
    

    응답:

    ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
    BlobType          : BlockBlob
    Length            : 56
    ContentType       : application/octet-stream
    LastModified      : 9/21/2017 6:14:25 PM +00:00
    SnapshotTime      :
    ContinuationToken :
    Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
    Name              : testblob
    
  6. Get-AzStorageBlobContent PowerShell cmdlet을 사용하여 업로드한 Blob을 다운로드할 수 있습니다.

    Get-AzStorageBlobContent -Blob testblob -Container <CONTAINER-NAME> -Destination test2.txt -Context $ctx
    

    응답:

    ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
    BlobType          : BlockBlob
    Length            : 56
    ContentType       : application/octet-stream
    LastModified      : 9/21/2017 6:14:25 PM +00:00
    SnapshotTime      :
    ContinuationToken :
    Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
    Name              : testblob
    

Windows VM 시스템 할당 관리 ID를 사용하여 Azure SQL Database에 액세스

이 자습서에서는 Windows VM(가상 머신)에 대한 시스템 할당 ID를 사용하여 Azure SQL Database에 액세스하는 방법을 보여 줍니다. 관리되는 서비스 ID는 Azure에서 자동으로 관리되며 코드에 자격 증명을 삽입할 필요 없이 Microsoft Entra 인증을 지원하는 서비스에 인증할 수 있습니다.

이 문서에서 배울 내용은 다음과 같습니다.

  • VM에 Azure SQL Database에 대한 액세스 권한 부여
  • Microsoft Entra 인증 사용
  • VM의 시스템 할당 ID를 나타내는 데이터베이스에 포함된 사용자를 만듭니다.
  • VM ID를 사용하여 액세스 토큰을 가져온 다음, Azure SQL Database를 쿼리하는 데 사용

Enable

한 번의 클릭으로 시스템 할당 관리 ID를 활성화할 수 있습니다. VM을 만드는 동안 또는 기존 VM의 속성에서 이 기능을 활성화할 수 있습니다.

스크린샷은 시스템 할당 상태를 켤 수 있는 가상 머신에 대한 시스템 할당 탭을 보여줍니다.

기존 VM에서 시스템 할당 관리 ID를 사용하도록 설정하려면 다음을 수행합니다.

  1. Azure Portal에 로그인합니다.

  2. 시스템 할당 ID가 설정된 가상 머신 만들기.

액세스 허가

Azure SQL Databaser의 데이터베이스에 대한 액세스 권한을 VM에 부여하려면 기존 논리 SQL 서버를 사용하거나 서버를 새로 만듭니다. Azure Portal을 사용하여 새 서버 및 데이터베이스를 만들려면 다음 Azure SQL 빠른 시작을 따릅니다. Azure SQL 설명서에서 Azure CLI 및 Azure PowerShell을 사용하는 빠른 시작도 있습니다.

다음 단계에 따라 VM에 데이터베이스에 대한 액세스 권한을 부여합니다.

  1. 서버에 대해 Microsoft Entra 인증을 사용하도록 설정합니다.
  2. VM의 시스템 할당 ID를 나타내는 데이터베이스에 포함된 사용자를 만듭니다.

Microsoft Entra 인증 사용

Microsoft Entra 인증을 구성하려면:

  1. Azure Portal의 왼쪽 탐색 영역에서 SQL Server를 선택합니다.
  2. Microsoft Entra 인증에 사용하도록 설정할 SQL Server를 선택합니다.
  3. 블레이드의 설정 섹션에서 Active Directory 관리자를 선택합니다.
  4. 명령 모음에서 관리자 설정을 선택합니다.
  5. 서버 관리자로 지정할 Microsoft Entra 사용자 계정을 선택한 다음 선택을 선택합니다.
  6. 명령 모음에서 저장을 선택합니다.

포함된 사용자 만들기

이 섹션에서는 VM의 시스템 할당 ID를 나타내는 데이터베이스에 포함된 사용자를 만드는 방법을 보여줍니다. 이 단계에서는 Microsoft SSMS(SQL Server Management Studio) 설치가 필요합니다. 시작하기 전에 Microsoft Entra 통합에 대한 백그라운드 지식을 알아보려면 다음 문서를 검토하는 것이 도움이 될 수 있습니다.

SQL 데이터베이스에는 고유한 Microsoft Entra ID 표시 이름이 필요합니다. 이를 통해 사용자, 그룹 및 서비스 주체(애플리케이션)와 같은 Microsoft Entra 계정과 관리 ID에 사용되는 VM 이름은 해당 표시 이름과 관련된 Microsoft Entra ID에서 고유하게 정의되어야 합니다. SQL은 이러한 사용자를 T-SQL로 만드는 동안 Microsoft Entra ID 표시 이름을 확인합니다. 표시 이름이 고유하지 않으면 명령이 실패하고 지정된 각 계정에 대해 고유한 Microsoft Entra ID 표시 이름을 제공하라는 메시지가 표시됩니다.

포함된 사용자를 만들려면

  1. SQL Server Management Studio를 엽니다.

  2. 서버에 연결 대화 상자에서 서버 이름 필드에 서버 이름을 입력합니다.

  3. 인증 필드에서 Active Directory - MFA 지원을 통한 유니버설 인증을 선택합니다.

  4. 사용자 이름 필드에 서버 관리자로 설정한 Microsoft Entra 계정의 이름을 입력합니다(예: cjensen@fabrikam.com).

  5. 옵션을 선택합니다.

  6. 연결할 데이터베이스 필드에 구성하려면 비시스템 데이터베이스의 이름을 입력합니다.

  7. 연결을 선택하고 로그인 프로세스를 완료합니다.

  8. 개체 탐색기에서 데이터베이스 폴더를 확장합니다.

  9. 사용자 데이터베이스를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택합니다.

  10. 쿼리 창에서 다음 줄을 입력하고, 도구 모음에서 실행을 선택합니다.

    참고 항목

    다음 명령의 VMName은 필수 구성 요소 섹션에서 시스템 할당 ID를 사용하도록 설정한 VM의 이름입니다.

    CREATE USER [VMName] FROM EXTERNAL PROVIDER
    

    이 명령은 성공적으로 완료되고 VM의 시스템 할당 ID에 대해 포함된 사용자가 만들어집니다.

  11. 쿼리 창을 지우고, 다음 줄을 입력하고, 도구 모음에서 실행을 선택합니다.

    참고 항목

    다음 명령의 VMName은 필수 구성 요소 섹션에서 시스템 할당 ID를 사용하도록 설정한 VM의 이름입니다.

    "VMName 주체에 중복된 표시 이름이 있습니다"라는 오류가 발생하는 경우 WITH OBJECT_ID='xxx'를 사용하여 CREATE USER 문을 추가합니다.

    ALTER ROLE db_datareader ADD MEMBER [VMName]
    

    명령이 성공적으로 완료되고 포함된 사용자에게 전체 데이터베이스를 읽을 수 있는 기능이 부여됩니다.

이제 VM에서 실행되는 코드는 해당 시스템 할당 관리 ID를 사용하여 토큰을 가져오고 해당 토큰을 사용하여 서버 인증을 받을 수 있습니다.

데이터 액세스

이 섹션에서는 VM의 시스템 할당 관리 ID를 사용하여 액세스 토큰을 가져오고 이를 사용하여 Azure SQL을 호출하는 방법을 보여줍니다. Azure SQL은 기본적으로 Microsoft Entra 인증을 지원하므로 Azure 리소스에 대한 관리 ID를 사용하여 가져오는 액세스 토큰을 직접 수락할 수 있습니다. 이 메서드는 연결 문자열에 자격 증명을 제공할 필요가 없습니다.

다음은 Active Directory 관리 ID 인증을 사용하여 SQL에 대한 연결을 여는 .NET 코드 예제입니다. VM의 시스템 할당 관리 ID의 엔드포인트에 액세스하기 위해서는 코드가 VM에서 실행되어야 합니다.

이 메서드를 사용하려면 .NET Framework 4.6.2 이상 또는 .NET Core 3.1 이상이 필요합니다. 그에 따라 AZURE-SQL-SERVERNAME 및 DATABASE의 값을 바꾸고 Microsoft.Data.SqlClient 라이브러리에 NuGet 참조를 추가합니다.

using Microsoft.Data.SqlClient;

try
{
//
// Open a connection to the server using Active Directory Managed Identity authentication.
//
string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>; Authentication=Active Directory Managed Identity; Encrypt=True";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();

참고 항목

SDK를 사용하여 다른 프로그래밍 옵션으로 작업하는 동안 관리 ID를 사용할 수 있습니다.

또는 PowerShell을 사용하여 VM에 앱을 작성하고 배포할 필요 없이 엔드투엔드 설정을 테스트합니다.

  1. Portal에서 Virtual Machines -> Windows VM으로 이동한 다음, 개요에서 연결을 선택합니다.

  2. Windows VM을 만들 때 추가한 VM 관리자 자격 증명을 입력합니다.

  3. 이제 가상 머신에 대한 원격 데스크톱 연결을 만들었으므로 원격 세션에서 PowerShell을 엽니다.

  4. PowerShell Invoke-WebRequest cmdlet을 사용하여 로컬 관리 ID의 엔드포인트에 대한 요청을 수행해 Azure SQL용 액세스 토큰을 가져옵니다.

        $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatabase.windows.net%2F' -Method GET -Headers @{Metadata="true"}
    

    JSON 개체에서 PowerShell 개체로 응답을 변환합니다.

    $content = $response.Content | ConvertFrom-Json
    

    응답에서 액세스 토큰을 추출합니다.

    $AccessToken = $content.access_token
    
  5. 서버에 대한 연결을 엽니다. AZURE-SQL-SERVERNAME 및 DATABASE 값을 바꿉니다.

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Data Source = <AZURE-SQL-SERVERNAME>; Initial Catalog = <DATABASE>; Encrypt=True;"
    $SqlConnection.AccessToken = $AccessToken
    $SqlConnection.Open()
    

    다음으로 쿼리를 만든 후 서버로 보냅니다. TABLE 값을 바꿉니다.

    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = "SELECT * from <TABLE>;"
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    

마지막으로 $DataSet.Tables[0] 값을 확인하여 쿼리의 결과를 검토합니다.

사용 안 함

VM에서 시스템이 할당 ID를 사용하지 않도록 설정하려면 시스템 할당 ID의 상태를 해제로 설정합니다.

스크린샷은 시스템 할당 상태를 해제할 수 있는 가상 머신에 대한 시스템 할당 탭을 보여줍니다.

Windows VM 시스템 할당 관리 ID를 사용하여 Azure Key Vault에 액세스

이 자습서에서는 Windows VM(가상 머신)이 시스템 할당 관리 ID를 사용하여 Azure Key Vault에 액세스하는 방법을 보여줍니다. Key Vault를 사용하면 클라이언트 애플리케이션에서 비밀을 사용하여 Microsoft Entra ID로 보호되지 않는 리소스에 액세스할 수 있습니다. 관리 ID는 Azure에서 자동으로 관리됩니다. 코드에 인증 정보를 포함하지 않고 Microsoft Entra 인증을 지원하는 서비스에 인증할 수 있습니다.

이 문서에서 배울 내용은 다음과 같습니다.

  • Key Vault에 저장된 비밀 액세스 권한을 VM에 부여
  • VM ID를 사용하여 액세스 토큰을 가져온 다음 Key Vault에서 비밀을 검색하는 데 사용

주요 자격 증명 모음 만들기

이 문서의 단계는 시작하는 포털에 따라 약간 다를 수도 있습니다.

이 섹션에서는 Key Vault에 저장된 비밀에 대한 액세스 권한을 VM에 부여하는 방법을 보여줍니다. Azure 리소스의 관리 ID를 사용할 때 코드에서 Microsoft Entra 인증을 지원하는 리소스에 인증하기 위한 액세스 토큰을 가져올 수 있습니다. 

그러나 모든 Azure 서비스가 Microsoft Entra 인증을 지원하는 것은 아닙니다. 이러한 서비스에서 Azure 리소스에 대한 관리 ID를 사용하려면 Azure Key Vault에 서비스 자격 증명을 저장하고 VM의 관리 ID로 Key Vault에 액세스하여 자격 증명을 검색합니다.

먼저 Key Vault를 만들고 VM의 시스템 할당 관리 ID에 Key Vault에 대한 액세스 권한을 부여해야 합니다.

  1. Azure Portal에 로그인합니다.

  2. 왼쪽 탐색 모음 맨 위에서 리소스 만들기를 선택합니다.

  3. Marketplace 검색 상자에 Key Vault를 입력하고 Enter를 누릅니다.

  4. 결과에서 Key Vault를 선택한 다음, 만들기를 선택합니다.

  5. 새 키 자격 증명 모음의 이름을 입력합니다.

    키 자격 증명 모음 만들기 화면의 스크린샷

  6. 필요한 모든 정보를 입력합니다. 이 자습서에서 사용할 구독 및 리소스 그룹을 선택해야 합니다.

  7. 검토 + 만들기를 선택합니다.

  8. 만들기를 실행합니다.

비밀 만들기

다음으로, 나중에 VM에서 실행되는 코드를 사용하여 검색할 수 있도록 Key Vault에 비밀을 추가해야 합니다. 이 섹션에서는 PowerShell을 사용하지만 VM에서 실행하는 모든 코드에 동일한 개념이 적용됩니다.

  1. 새로 만든 Key Vault로 이동합니다.

  2. 비밀을 선택한 다음 추가를 선택합니다.

  3. 생성/가져오기를 선택합니다.

  4. 비밀 만들기 화면의 업로드 옵션에서 수동을 선택한 상태로 둡니다.

  5. 비밀의 이름과 값을 입력합니다. 원하는 어떤 값이나 입력할 수 있습니다. 

  6. 활성화 날짜와 만료 날짜는 비워 두고 사용 가능로 유지합니다. 

  7. 만들기를 선택하여 비밀을 만듭니다.

    비밀을 만드는 방법을 보여 주는 스크린샷.

액세스 허가

Key Vault가 저장하는 비밀을 읽으려면 VM에서 사용하는 관리 ID에 대한 액세스 권한을 부여해야 합니다.

  1. 새로 만든 Key Vault로 이동합니다.

  2. 왼쪽 메뉴에서 액세스 정책을 선택합니다.

  3. 액세스 정책 추가 선택.

    키 자격 증명 모음 액세스 정책 화면을 보여 주는 스크린샷

  4. 액세스 정책 추가 섹션의 템플릿에서 구성(선택 사항) 드롭다운 메뉴에서 비밀 관리를 선택합니다.

  5. 보안 주체를 선택한 다음 검색 필드에 이전에 만든 VM의 이름을 입력합니다. 

  6. 결과 목록에서 VM을 선택하고 선택을 선택합니다.

  7. 추가를 선택합니다.

  8. 저장을 선택합니다.

데이터 액세스

이 섹션에서는 VM ID를 사용하여 액세스 토큰을 가져오고 이를 사용하여 Key Vault에서 비밀을 검색하는 방법을 보여줍니다. PowerShell 4.3.1 이상이 설치되어 있지 않으면 최신 버전을 다운로드하고 설치해야 합니다.

참고 항목

PowerShell을 사용하여 비밀을 인증하고 검색하는 방법은 관리 ID가 특별히 필요한 시나리오 또는 애플리케이션 코드 내에 프로세스를 포함할 때 선호됩니다.

먼저 VM의 시스템 할당 관리 ID를 사용하여 Key Vault에 인증하기 위한 액세스 토큰을 가져옵니다.

  1. Portal에서 Virtual Machines -> Windows VM으로 이동한 다음, 개요에서 연결을 선택합니다.
  2. Windows VM을 만들 때 추가한 사용자 이름암호를 입력합니다.
  3. 이제 가상 머신에 대한 원격 데스크톱 연결을 만들었으므로 원격 세션에서 PowerShell을 엽니다.
  4. PowerShell에서 테넌트에 대해 웹 요청을 호출하여 VM의 특정 포트에서 로컬 호스트용 토큰을 가져옵니다.

참고 항목

GCC-H와 같은 소버린 클라우드를 사용하는 경우 PowerShell cmdlet에서 vault.usgovcloudapi.net 대신 엔드포인트 vault.azure.net을(를) 사용합니다.

PowerShell 요청 예제:

$Response = Invoke-RestMethod -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -Method GET -Headers @{Metadata="true"} 

참고 항목

소버린 클라우드로 작업할 때 cmdlet의 끝에 지정된 엔드포인트를 조정해야 합니다.

예를 들어 vault.usgovcloudapi.net은(는) Azure Government 클라우드로 작업할 때 사용해야 하며, 최종 결과는 다음과 같습니다.

$Response = Invoke-RestMethod -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.usgovcloudapi.net' -Method GET -Headers @{Metadata="true"

접미사가 사용자 환경과 일치하는지 확인하려면 Azure Key Vault 보안 개요 문서를검토합니다.

응답은 다음과 같아야 합니다.

토큰 응답이 있는 요청을 보여 주는 스크린샷

다음으로는 응답에서 액세스 토큰을 추출합니다.

   $KeyVaultToken = $Response.access_token

마지막으로, PowerShell Invoke-WebRequest cmdlet을 사용하여 Key Vault에서 이전에 만든 비밀을 검색하고 권한 부여 헤더에 액세스 토큰을 전달합니다. Key Vault 개요 페이지의 기본 정보 섹션에 있는 Key Vault의 URL이 필요합니다.

Invoke-RestMethod -Uri https://<your-key-vault-URL>/secrets/<secret-name>?api-version=2016-10-01 -Method GET -Headers @{Authorization="Bearer $KeyVaultToken"}

응답은 다음과 같아야 합니다.

  value       id                                                                                    attributes
  -----       --                                                                                    ----------
  'My Secret' https://mi-lab-vault.vault.azure.net/secrets/mi-test/50644e90b13249b584c44b9f712f2e51 @{enabled=True; created=16…

Key Vault에서 비밀을 검색한 후에는 이름과 암호가 필요한 서비스에 인증하는 데 비밀을 사용할 수 있습니다.

리소스 정리

마지막으로 리소스를 정리하려는 경우 Azure Portal에 로그인하고 리소스 그룹을 선택한 다음, 이 자습서 프로세스에서 만든 리소스 그룹(예: mi-test)을 찾아 선택합니다. 그런 다음, 리소스 그룹 삭제 명령을 사용합니다.

또는 PowerShell 또는 CLI를 사용하여 리소스를 정리할 수도 있습니다.

Windows VM 시스템 할당 관리형 ID를 사용하여 리소스 관리자에 액세스

이 문서의 단계는 시작하는 포털에 따라 약간 다를 수 있습니다.

이 자습서에서는 시스템 할당 ID를 만들어서, Windows VM(가상 머신)에 할당한 다음, 이 ID를 사용하여 Azure Resource Manager API에 액세스하는 방법을 설명합니다. 관리 서비스 ID는 Azure에서 자동으로 관리됩니다. 그러면 코드에 자격 증명을 포함할 필요 없이 Microsoft Entra 인증을 지원하는 서비스에 인증할 수 있습니다.

이 문서에서 배울 내용은 다음과 같습니다.

  • Azure Resource Manager에 대한 액세스 권한을 VM에 부여합니다.
  • VM의 시스템 할당 관리형 ID를 사용하여 액세스 토큰을 가져와 Resource Manager에 액세스합니다.
  1. 관리자 계정으로 Azure Portal에 로그인합니다.

  2. 리소스 그룹 탭으로 이동합니다.

  3. VM의 관리형 ID에 액세스 권한을 부여할 리소스 그룹을 선택합니다.

  4. 왼쪽 창에서 액세스 제어(IAM)를 선택합니다.

  5. 추가를 선택한 다음, 역할 할당 추가를 선택합니다.

  6. 역할 탭에서 읽기 권한자를 선택합니다. 이 역할이 있으면 모든 리소스를 볼 수 있지만 변경할 수는 없습니다.

  7. 구성원 탭의 다음에 대한 액세스 할당 옵션에서 관리형 ID를 선택한 다음, + 구성원 선택을 선택합니다.

  8. 구독 드롭다운에 적절한 구독이 나열되어 있는지 확인합니다. 리소스 그룹에서는 모든 리소스 그룹을 선택합니다.

  9. 관리 ID 드롭다운에서 가상 머신을 선택합니다.

  10. 선택에서는 드롭다운에서 VM을 선택한 다음, 저장을 선택합니다.

    관리형 ID에 판독기 역할을 추가하는 것을 보여 주는 스크린샷

액세스 토큰 가져오기

VM의 시스템 할당 관리형 ID를 사용하고 Resource Manager를 호출하여 액세스 토큰을 가져옵니다.

아래의 단계를 완료하려면 SSH 클라이언트가 필요합니다. Windows를 사용 중인 경우 Linux용 Windows 하위 시스템에서 SSH 클라이언트를 사용할 수 있습니다. SSH 클라이언트의 키 구성에 대한 도움이 필요하면 Azure에서 Windows를 통해 SSH 키를 사용하는 방법 또는 Azure에서 Linux VM용 SSH 공개 및 프라이빗 키 쌍을 만들고 사용하는 방법을 참조하세요.

  1. Portal에서 Linux VM으로 이동한 다음, 개요에서 연결을 선택합니다.
  2. 선택한 SSH 클라이언트를 사용하여 VM에 연결합니다.
  3. 터미널 창에서 curl을 사용하여 Azure 리소스에 대한 로컬 관리 ID 엔드포인트에 대한 요청을 만들어서 Azure Resource Manager에 대한 액세스 토큰을 가져옵니다.   액세스 토큰에 대한 curl 요청은 다음과 같습니다.
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -H Metadata:true

참고 항목

resource 매개 변수의 값은 Microsoft Entra ID에서 예상하는 값과 정확히 일치해야 합니다. Resource Manager의 리소스 ID의 경우 URI에 후행 슬래시를 포함해야 합니다.

응답에는 Azure Resource Manager에 액세스하는 데 필요한 액세스 토큰이 포함되어 있습니다.

응답:

{
  "access_token":"eyJ0eXAiOi...",
  "refresh_token":"",
  "expires_in":"3599",
  "expires_on":"1504130527",
  "not_before":"1504126627",
  "resource":"https://management.azure.com",
  "token_type":"Bearer"
}

이 액세스 토큰을 사용하여 Azure Resource Manager에 액세스해 이전에 이 VM에 액세스 권한을 부여했던 리소스 그룹의 세부 정보를 확인하는 등의 작업을 수행합니다. <SUBSCRIPTION-ID>, <RESOURCE-GROUP>, <ACCESS-TOKEN>의 값은 이전에 작성한 값으로 바꿉니다.

참고 항목

URL은 대/소문자를 구분하므로 앞서 리소스 그룹의 이름을 지정할 때 사용한 정확한 대/소문자를 사용해야 하며, “resourceGroup”과 같이 대문자 “G”를 사용해야 합니다.

curl https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>?api-version=2016-09-01 -H "Authorization: Bearer <ACCESS-TOKEN>" 

특정 리소스 그룹 정보를 사용하여 다시 응답합니다.

{
"id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/DevTest",
"name":"DevTest",
"location":"westus",
"properties":
{
  "provisioningState":"Succeeded"
  }
} 

Windows VM에서 사용자 할당 관리 ID를 사용하여 Azure Resource Manager에 액세스

이 자습서에서는 사용자 할당 ID를 만들어서, Windows VM(가상 머신)에 할당한 다음, 이 ID를 사용하여 Azure Resource Manager API에 액세스하는 방법을 설명합니다. 관리 서비스 ID는 Azure에서 자동으로 관리됩니다. 그러면 코드에 자격 증명을 포함할 필요 없이 Microsoft Entra 인증을 지원하는 서비스에 인증할 수 있습니다.

이 문서에서 배울 내용은 다음과 같습니다.

  • 사용자 할당 관리 ID 만들기
  • 사용자 할당 ID를 Windows VM에 할당
  • 사용자 할당 ID에 Azure Resource Manager의 리소스 그룹 액세스 권한 부여
  • 사용자 할당 ID를 사용하여 액세스 토큰을 가져와서 Azure Resource Manager를 호출하는 데 사용
  • Resource Group의 속성 읽기

참고 항목

Azure Az PowerShell 모듈을 사용하여 Azure와 상호 작용하는 것이 좋습니다. 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

로컬로 Azure PowerShell 구성

이 예제에서 스크립트를 실행하려면 다음 두 가지 옵션을 사용할 수 있습니다.

  • 코드 블록의 오른쪽 위 모서리에 있는 사용해 보기 단추를 사용하여 열 수 있는 Azure Cloud Shell을 사용합니다.
  • 다음 섹션에 설명된 대로 Azure PowerShell을 사용하여 로컬로 스크립트를 실행합니다.

이 자습서에 로컬로 Azure PowerShell을 사용(Cloud Shell을 사용하는 대신)하려면 다음 단계를 완료합니다.

  1. 아직 설치하지 않은 경우 Azure PowerShell 최신 버전을 설치합니다.

  2. Azure에 로그인:

    Connect-AzAccount
    
  3. PowerShellGet 최신 버전을 설치합니다.

    Install-Module -Name PowerShellGet -AllowPrerelease
    

    다음 단계에서 이 명령을 실행한 후 현재 PowerShell 세션에서 Exit를 제거해야 합니다.

  4. 릴리스된 버전의 Az.ManagedServiceIdentity 모듈을 설치합니다. 이 자습서에서 사용자 할당 관리 ID 작업을 수행하려면 이 작업이 필요합니다.

    Install-Module -Name Az.ManagedServiceIdentity -AllowPrerelease
    

Enable

사용자 할당 ID를 기반으로 하는 시나리오의 경우 이 섹션에서 다음 단계를 수행해야 합니다.

  1. ID를 만듭니다.
  2. 새로 만든 ID를 할당합니다.

ID 만들기

이 섹션에서는 독립 실행형 Azure 리소스로 만들어지는 사용자 할당 ID를 만드는 방법을 보여줍니다. New-AzUserAssignedIdentity cmdlet을 사용하면 하나 이상의 Azure 서비스 인스턴스를 할당할 수 있는 Microsoft Entra 테넌트에 ID가 만들어집니다.

Important

사용자 할당 관리 ID를 만들 때 이름은 문자나 숫자로 시작해야 하며 영숫자, 하이픈(-), 밑줄(_)의 조합을 포함할 수 있습니다. 가상 머신 또는 가상 머신 확장 집합에 대한 할당이 제대로 작동하려면 이름이 24자로 제한됩니다. 자세한 내용은 FAQ 및 알려진 문제를 참조하세요.

New-AzUserAssignedIdentity -ResourceGroupName myResourceGroupVM -Name ID1

응답에는 다음 예제와 같이 생성된 사용자 할당 ID에 대한 세부 정보가 포함됩니다. 다음 단계에서 사용되므로 사용자 할당 ID에 대한 IdClientId 값을 정의합니다.

{
Id: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1
ResourceGroupName : myResourceGroupVM
Name: ID1
Location: westus
TenantId: aaaabbbb-0000-cccc-1111-dddd2222eeee
PrincipalId: aaaaaaaa-bbbb-cccc-1111-222222222222
ClientId: 00001111-aaaa-2222-bbbb-3333cccc4444
ClientSecretUrl: https://control-westus.identity.azure.net/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1/credentials?tid=aaaabbbb-0000-cccc-1111-dddd2222eeee&oid=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb&aid=00001111-aaaa-2222-bbbb-3333cccc4444
Type: Microsoft.ManagedIdentity/userAssignedIdentities
}

ID 할당

이 섹션에서는 사용자 할당 ID를 Windows VM에 할당하는 방법을 보여줍니다. 사용자 할당 ID는 여러 Azure 리소스에 있는 클라이언트에 사용될 수 있습니다. 다음 명령을 사용하여 사용자 할당 ID를 단일 VM에 할당합니다. 이전 단계에서 반환된 Id 속성을 -IdentityID 매개 변수에 사용합니다.

$vm = Get-AzVM -ResourceGroupName myResourceGroup -Name myVM
Update-AzVM -ResourceGroupName TestRG -VM $vm -IdentityType "UserAssigned" -IdentityID "/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"

액세스 허가

이 섹션에서는 Azure Resource Manager의 리소스 그룹에 사용자 할당 ID 액세스 권한을 부여하는 방법을 보여줍니다. Azure 리소스에 대한 관리 ID는 Microsoft Entra 인증을 지원하는 리소스 API를 인증하는 액세스 토큰을 요청하기 위해 코드에 사용할 수 있는 ID를 제공합니다. 이 자습서에서 코드는 Azure Resource Manager API에 액세스합니다.

코드가 API에 액세스할 수 있으려면 그 전에 Azure Resource Manager의 리소스에 ID 액세스 권한을 부여해야 합니다. 이 경우 VM이 포함된 리소스 그룹에 액세스합니다. <SUBSCRIPTIONID>의 값을 환경에 적합하게 업데이트합니다.

$spID = (Get-AzUserAssignedIdentity -ResourceGroupName myResourceGroupVM -Name ID1).principalid
New-AzRoleAssignment -ObjectId $spID -RoleDefinitionName "Reader" -Scope "/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/"

응답에는 다음 예제와 같이 만든 역할 할당에 대한 세부 정보가 포함됩니다.

RoleAssignmentId: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000000
Scope: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM
DisplayName: ID1
SignInName:
RoleDefinitionName: Reader
RoleDefinitionId: 00000000-0000-0000-0000-000000000000
ObjectId: aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
ObjectType: ServicePrincipal
CanDelegate: False

데이터 액세스

이 문서의 단계는 시작하는 포털에 따라 약간 다를 수도 있습니다.

액세스 토큰 가져오기

이 자습서의 나머지 부분에서는 이전에 만든 VM에서 작업합니다.

  1. Azure Portal에 로그인합니다.

  2. 포털에서 Virtual Machines로 이동하고 Windows VM으로 이동합니다. 개요에서 연결을 선택합니다.

  3. Windows VM을 만들 때 사용한 사용자 이름암호를 입력합니다.

  4. VM을 사용하여 원격 데스크톱 연결을 만들었으므로 이제 원격 세션에서 PowerShell을 엽니다.

  5. PowerShell Invoke-WebRequest cmdlet을 사용하여 Azure Resource Manager에 대한 액세스 토큰을 가져오도록 Azure 리소스 엔드포인트의 로컬 관리 ID에 요청합니다. client_id 값은 사용자 할당 관리 ID를 만들 때 반환되는 값입니다.

    $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&client_id=00001111-aaaa-2222-bbbb-3333cccc4444&resource=https://management.azure.com/' -Method GET -Headers @{Metadata="true"}
    $content = $response.Content | ConvertFrom-Json
    $ArmToken = $content.access_token
    

속성 읽기

마지막으로 이전 단계에서 검색한 액세스 토큰을 사용하여 Azure Resource Manager에 액세스하고, 사용자 할당 ID 액세스 권한을 부여한 리소스 그룹의 속성을 읽습니다. <SUBSCRIPTION ID>를 환경의 구독 ID로 바꿉니다.

(Invoke-WebRequest -Uri https://management.azure.com/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroupVM?api-version=2016-06-01 -Method GET -ContentType "application/json" -Headers @{Authorization ="Bearer $ArmToken"}).content

응답은 다음 예제와 비슷하게 특정 리소스 그룹 정보를 포함합니다.

{"id":"/subscriptions/<SUBSCRIPTIONID>/resourceGroups/myResourceGroupVM","name":"myResourceGroupVM","location":"eastus","properties":{"provisioningState":"Succeeded"}}

자세한 정보