랩: 서비스 전반에서 리소스 비밀에 안전하게 액세스
학생 랩 매뉴얼
랩 시나리오
회사에서 B2B(비즈니스 간) 계약을 다른 지역 비즈니스와 계약을 맺고 야간에 삭제된 파일을 구문 분석해야 합니다. 일을 간단하게 하기 위해 두 번째 회사는 매일 밤 마이크로소프트 Azure 저장소 블랍으로 파일을 삭제 하기로 결정 했습니다. 이제 파일을 인터넷에 노출하지 않고 내부 시스템에서 블랍에 액세스하는 데 사용할 수 있는 보안 URL 을 생성하고 파일에 안전하게 액세스하는 방법을 고안해야 합니다. Microsoft Azure Key Vault 를 사용하여 저장소 계정 및 Azure Functions 에 대한 자격 증명을 저장하여 일반 텍스트로 자격 증명을 못 저장하거나 파일을 인터넷에 노출해서 파일에 안전하게 액세스하기 위해 필요한 코드를 작성하기로 결정했습니다.
목표
이 랩을 완료하면 다음을 수행할 수 있습니다.
-
Azure Key Vault를 만들어 Key Vault에 비밀 저장
-
Azure App Service 인스턴스용 서버 할당 관리 ID 만들기
-
Azure Active Directory ID 또는 애플리케이션용 Azure Key Vault 액세스 정책 만들기
-
Azure Storage .NET SDK(소프트웨어 개발 키트)를 사용하여 안전하게 Blob 다운로드
랩 설정
- 예상 시간: 45 분
지침
시작하기 전에
랩 가상 머신에 로그인
다음 자격 증명을 사용하여 Windows 10 가상 머신에 로그인해야 합니다.
-
사용자 이름: Admin
-
암호: Pa55w.rd
설치된 응용 프로그램 검토
Windows 10 바탕 화면 하단에 있는 작업 표시줄을 살펴봅니다. 작업 표시줄에는 이 랩에서 사용할 응용 프로그램에 대한 아이콘이 포함되어 있습니다.
-
Microsoft Edge
-
파일 탐색기
랩 파일 다운로드
-
작업 표시줄에서 Windows PowerShell 아이콘을 선택합니다.
-
PowerShell 명령 프롬프트에서 현재 작업 디렉터리를 Allfiles(F):\ 경로로 변경합니다.
cd F:
- 명령 프롬프트 내에서 다음 명령을 입력하고 Enter 키를 눌러 GitHub에서 호스트되는 microsoftlearning/AZ-203-DevelopingSolutionsforMicrosoftAzure 프로젝트를 Allfiles (F):\ 드라이브로 복제합니다.
git clone --depth 1 --no-checkout https://github.com/microsoftlearning/AZ-203-DevelopingSolutionsForMicrosoftAzure.
- 명령 프롬프트 내에서 다음 명령을 입력하고 Enter 키를 눌러 AZ-203T04 랩을 완료하는 데 필요한 랩 파일을 체크 아웃합니다.
git checkout master -- Allfiles/*
- 현재 실행 중인 Windows PowerShell 명령 프롬프트 응용 프로그램을 닫습니다.
연습 1: Azure 리소스 만들기
작업 1: Azure Portal 열기
-
Azure Portal(https://portal.azure.com)에 로그인합니다.
-
Azure 포털에 처음 로그인하는 경우 포털 둘러보기를 제공하는 대화 박스가 표시됩니다. 투어를 건너뛰려면 시작하기를 클릭합니다.
작업 2: Azure 저장소 계정 만들기
-
다음 세부 정보를 사용하여 새 스토리지 계정을 만듭니다.
-
새 리소스 그룹: 보안 기능
-
이름: securestor [소문자로 이름]
-
위치: 미국 동부
-
성능: 표준
-
계정 종류: 스토리지 V2(범용 v2)
-
복제: 로컬 중복 스토리지(LRS)
-
액세스 계층: 핫
-
참고: 랩을 진행하기 전에 Azure 에서 저장소 계정 만들기가 완료될 때까지 기다립니다. 계정이 생성되면 알림을 받게 됩니다.
-
새로 만든 저장소 계정 인스턴스의 액세스 키 블레이드를 엽니다.
-
연결 문자열 필드에 값을 기록합니다. 이 랩의 나중에 이 값을 사용합니다.
작업 3: Azure 키 볼트 만들기
-
다음 세부 정보에 따라서 새 키 볼트를 만들겁니다:
-
기존 리소스 그룹: 보안 기능
-
이름: securevault[소문자로 된 사용자 이름]
-
지역: 미국 동부
-
가격 계층: 표준
참고: 랩을 진행하기 전에 Azure에서 Key Vault 만들기가 완료될 때까지 기다립니다. 볼트가 생성되면 알림을 받게 됩니다.
-
작업 4: Azure 함수 어플 만들기
-
다음 세부 정보에 따라서 새 함수 어플을 만들겁니다:
-
기존 리소스 그룹: 보안 기능
-
앱 이름: securefunc[소문자로 된 사용자 이름]
-
게시: 코드
-
런타임 스택: .NET Core
-
지역: 미국 동부
-
스토리지 계정: securestor[소문자로 된 사용자 이름]
-
운영 체제: Windows
-
플랜: Consumption
-
Application Insights 사용: No
참고: 랩을 진행하기 전에 Azure에서 함수 앱 만들기가 완료될 때까지 기다립니다. 어플을 만들 때 알림을 받게 됩니다.
-
검토
이 연습에서는 이 랩에 사용할 모든 리소스를 만들었습니다.
연습 2: 비밀 및 ID 구성
작업 1: 할당된 시스템 관리형 서비스 ID 구성
-
이전에 랩에서 만든securefunc*함수 어플에 액세스합니다.
-
플랫폼 피처 탭에 있는 ID 설정으로 이동합니다.
-
할당된 시스템에서 관리 ID 를 활성화하고 변경 내용을 저장합니다.
작업 2: 키 볼트 비밀 만들기
-
이전에 랩에서 만든 securevault* 키 볼트에 액세스합니다.
-
설정 섹션에 있는비밀 링크로 이동합니다.
-
다음 설정을 사용하여 새 비밀을 만듭니다.
-
이름: 스토리지 자격 증명
-
값: <Storage Connection String>
-
사용 가능: Yes
참고: 이 비밀의 값으로 이 랩의 앞에서 기록한 스토리지 계정 연결 문자열을 사용합니다.
-
-
비밀을 클릭하여 최신 버전의 메타데이터를 봅니다.
-
나중에 랩에서 이 값을 사용하기 때문에 비밀 식별자 필드의 값을 기록합니다.
작업 3: 키 볼트 액세스 정책 구성
-
이전에 랩에서 만든 securevault* 키 볼트에 액세스합니다.
-
설정 섹션에 있는 액세스 정책 링크로 이동합니다.
-
다음 설정을 사용하여 새 액세스 정책을 만듭니다.
-
원칙: securefunc[소문자로 이름]
-
키 사용 권한: 없음
-
비밀 권한: GET
-
인증서 권한: 없음
-
승인된 응용 프로그램: 없음
-
-
변경 내용을 액세스 정책 목록에 저장합니다.
검토
이 연습에서는 함수 앱에 대한 서버에서 할당된 관리 서비스 ID를 만든 다음 해당 ID에 Key Vault에서 비밀 값을 얻을 수 있는 적절한 권한을 부여했습니다. 마지막으로 함수 어플 내에서 사용할 비밀을 만들었습니다.
연습 3: 함수 어플 코드 작성
작업 1: 키 볼트 파생 응용 프로그램 설정 만들기
-
이 랩의 앞에서 만든 securefunc* 함수 앱에 액세스합니다.
-
플랫폼 기능 탭에 있는 구성 설정으로 이동합니다.
-
다음 세부 정보를 사용하여 새 애플리케이션 설정을 만듭니다.
-
이름: StorageConnectionString
-
값: @Microsoft.KeyVault(SecretUri=<Secret Identifier>)
-
배포 슬롯 설정: 선택되지 않음
참고: 위의 구문을 사용하여 비밀 식별자에 대한 참조를 작성해야 합니다. 예를 들어 비밀 식별자가 https://securevaultstudent.vault.azure.net/secrets/storagecredentials/17b41386df3e4191b92f089f5efb4cbf 경우 @Microsoft.KeyVault(SecretUri= https://securevaultstudent.vault.azure.net/secrets/storagecredentials/17b41386df3e4191b92f089f5efb4cbf) 값이 됩니다.
-
-
애플리케이션 설정에 대한 변경 내용을 저장합니다.
작업 2: HTTP 트리거 함수 만들기
-
이전에 랩에서 만든securefunc*함수 어플에 액세스합니다.
-
다음 설정을 사용하여 새 함수를 만듭니다.
-
개발 환경: 포털에서
-
템플릿: HTTP 트리거
-
이름: 파일 파서
-
권한 부여 수준: 익명
-
-
함수 편집기에서 예제 함수 스크립트를 다음 자리 표시자 C# 코드로 바꿉니다.
using System.Net;
using Microsoft.AspNetCore.Mvc;
public static async Task<IActionResult> Run(HttpRequest req)
{
return new OkObjectResult("Test Successful");
}
- 저장 및 실행을 클릭하여 함수의 테스트 실행을 수행합니다. 실행의 출력은 테스트 성공입니다.
작업 3: Key Vault 파생 애플리케이션 설정 테스트
-
Run 메서드 내의 모든 기존 코드를 삭제합니다.
-
Environment.GetEnvironmentVariable 메서드를 사용하여 StorageConnectionString 응용 프로그램 설정의 값을 얻읍니다.
string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
- OkObjectResult 클래스 생성자를 사용하여 연결 문자열 변수의 값을 반환합니다.
return new OkObjectResult(connectionString);
- 저장 및 실행을 클릭하여 함수의 테스트 실행을 수행합니다. 실행의 출력은 Azure Key Vault에 저장된 저장소 계정 연결 문자열이어 야합니다.
검토
이 연습에서는 서비스 ID 를 사용하여 Azure Key Vault에 저장된 비밀의 값을 읽고 Azure Function의 결과로 해당 값을 반환합니다.
연습 4: 스토리지 계정 Blob에 액세스
작업 1: 샘플 저장소 블랍 업로드
-
이전에 랩에선 만든 securestor* 저장소 계정에 액세스합니다.
-
Blob service 섹션에 있는 컨테이너 링크로 이동합니다.
-
다음 설정을 사용하여 새 컨테이너를 만듭니다.
-
이름: 드롭
-
공용 액세스 수준: Blob(블랍에 대한 익명 읽기 액세스만)
-
-
새 drop 컨테이너로 이동합니다.
-
업로드를 클릭하여 records.json 파일(랩 가상 머신의 Allfiles (F): \Allfiles\Labs\04\Starter 폴더에 있음)을 업로드합니다.
참고: 파일이 이미 있는 경우 덮어쓰기 옵션을 사용하도록 설정하는 것이 좋습니다.
-
블랍 목록의 블랍 들어감을 클릭하여 records.json 블랍의 메타데이터를 봅니다.
-
새 브라우저 탭을 사용하여 블랍의 URL로 이동하여 블랍의 내용을 봅니다.
-
공용 액세스 수준을 Private(익명 액세스 없음) 으로 변경하여 컨테이너의 액세스 수준을 업데이트합니다.
-
새 브라우저 창 또는 탭을 사용하여 블랍의 URL로 이동하여 Blob의 내용을 봅니다. 이제 리소스를 찾을 수 없다는 오류 메시지가 표시됩니다.
참고: 오류 메시지가 표시되지 않으면 브라우저에서 파일을 캐시했을 수 있습니다. Ctrl+F5를 사용하여 오류 메시지가 표시될 때까지 페이지를 새로 고칩니다.
작업 2: NuGet에서 스토리지 계정 SDK 가져오기
-
이 랩의 앞에서 만든 securefunc* 함수 앱에 액세스합니다.
-
FileParser 함수에 대한 편집기 열기를 엽니다.
-
파일 보기 탭에서 다음 내용을 사용하여 새 function.proj 파일을 만듭니다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Azure.Storage.Blobs" Version="12.0.0" />
</ItemGroup>
</Project>
-
새로 만든 function.proj 파일을 저장합니다.
참고: 이 proj 파일에는 Azure.Storage.Blobs 패키지를 가져오는 데 필요한 NuGet 패키지 참조가 포함되어 있습니다.
-
파일 보기 탭에서 파일을 클릭하여 function.proj 파일의 내용을 봅니다.
-
파일 보기 탭에서 run.csx 파일을 클릭하여 FileParser 함수의 편집기로 돌아갑니다.
-
Azure.Storage, Azure.Storage.Blob 및 Azure.Storage.Blobs.Models 네임스페이스에 대한 두 개의 using 지시문을 추가합니다.
-
Run 메서드 내의 모든 기존 코드를 삭제합니다.
작업 3: 저장소 계정 코드 작성
- Environment.GetEnvironmentVariable 메서드를 사용하여 StorageConnectionString 응용 프로그램 설정의 값을 얻읍니다.
string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
- connectionString 변수를 생성자에 전달하여 BlobServiceClient 클래스의 새 인스턴스를 만듭니다.
BlobServiceClient serviceClient = new BlobServiceClient(connectionString);
- drop 컨테이너 이름을 전달하면서 BlobServiceClient.GetBlobContainerClient 메서드를 사용하여 이 랩의 앞에서 만든 컨테이너를 참조하는 BlobContainerClient 클래스의 새 인스턴스를 만듭니다.
BlobContainerClient containerClient = serviceClient.GetBlobContainerClient("drop");
- records.json Blob 이름을 전달하는 동안 BlobContainerClient.GetBlobClient 메서드를 사용하여 이 랩의 앞에서 업로드한 Blob을 참조하는 BlobClient 클래스의 새 인스턴스를 만듭니다.
BlobClient blobClient = containerClient.GetBlobClient("records.json");
작업 4: 블랍 다운로드
- BlobClient.DownloadAsync 메서드를 사용하여 참조된 Blob의 내용을 비동기적으로 다운로드하고 결과를 response라는 변수에 저장합니다.
var response = await blobClient.DownloadAsync();
- FileStreamResult 클래스 생성자를 사용하여 content 변수에 저장된 다양한 콘텐츠의 값을 반환합니다.
return new FileStreamResult(response?.Value?.Content, response?.Value?.ContentType);
- 저장 및 실행을 클릭하여 함수의 테스트 실행을 수행합니다. 실행의 출력은 저장소 계정에 저장된 $/drop/records.json 블랍의 내용이어 야합니다.
복습
이 연습에서는 C# 코드를 사용하여 스토리지 계정에 안전하게 액세스한 다음 Blob의 내용을 다운로드했습니다.
연습 5: 구독 정리
작업 1: Azure 클라우드 셸 열기 및 리소스 그룹 나열
-
포털 상단에서 클라우드 셸 아이콘을 클릭하여 새 셸 인스턴스를 엽니다.
-
Cloud Shell이 아직 구성되지 않은 경우 기본 설정을 사용하여 Bash용 셸을 구성합니다.
-
포털 하단의 Cloud Shell 명령 프롬프트에서 다음 명령을 입력하고 Enter 키를 눌러 구독의 모든 리소스 그룹을 나열합니다.
az group list
- 다음 명령을 입력하고 Enter 키를 눌러 리소스 그룹을 삭제하는 데 사용할 수 있는 명령 목록을 봅니다.
az group delete --help
작업 2: 리소스 그룹 삭제
- 다음 명령을 입력하고 Enter 를 눌러 SecureFunction 리소스 그룹을 삭제합니다.
az group delete --name SecureFunction --no-wait --yes
- 포털 하단의 Cloud Shell 창을 닫습니다.
작업 3: 액티브 응용 프로그램 닫기
현재 실행 중인 Microsoft Edge 응용 프로그램을 닫습니다.
검토
이 연습에서는 이 랩에 사용된 리소스 그룹을 제거하여 구독을 정리했습니다.