자습서: Key Vault를 사용하여 .NET App Service에서 보안 인식 서비스 연결
Azure App Service는 관리 ID를 사용하여 연결 비밀을 제거하여 프로덕션 환경에서 백 엔드 연결을 안전하게 관리하고 유지할 수 있는 연결 문자열 없이 백 엔드 서비스에 연결할 수 있습니다. 관리 ID를 지원하지 않고 여전히 연결 비밀이 필요한 백 엔드 서비스의 경우 Key Vault를 사용하여 연결 비밀을 관리할 수 있습니다. 이 자습서에서는 Azure AI 서비스를 예로 사용하여 실제로 수행하는 방법을 보여 줍니다. 완료되면 App Service 내부에 연결 비밀을 저장하지 않고 Azure AI 서비스에 프로그래밍 방식으로 호출하는 앱이 있습니다.
팁
Azure AI 서비스는 관리 ID를 통한 인증을 지원하지만 이 자습서에서는 구독 키 인증을 사용하여 App Services에서 관리 ID를 지원하지 않는 Azure 서비스에 연결하는 방법을 보여줍니다.
이 아키텍처를 사용하는 경우:
- 관리 ID로 Key Vault에 대한 연결을 보호합니다
- App Service는 Key Vault 참조를 앱 설정으로 사용하여 비밀에 액세스합니다.
- 키 자격 증명 모음에 대한 액세스는 앱으로 제한됩니다. 관리자와 같은 앱 contributor는 App Service 리소스를 완전히 컨트롤할 수 있으며 동시에 Key Vault 비밀에 액세스할 수 없습니다.
- 애플리케이션 코드가 앱 설정을 사용하여 연결 비밀에 이미 액세스하는 경우에는 변경이 필요하지 않습니다.
다음을 알아봅니다.
- 관리 ID 사용
- 관리 ID를 사용하여 Key Vault에 연결
- Key Vault 참조 사용
- Azure AI 서비스에 액세스
필수 조건
Azure CLI에 대한 환경을 준비합니다.
Azure Cloud Shell에서 Bash 환경을 사용합니다. 자세한 내용은 Azure Cloud Shell의 Bash에 대한 빠른 시작을 참조하세요.
CLI 참조 명령을 로컬에서 실행하려면 Azure CLI를 설치합니다. Windows 또는 macOS에서 실행 중인 경우 Docker 컨테이너에서 Azure CLI를 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI를 실행하는 방법을 참조하세요.
로컬 설치를 사용하는 경우 az login 명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 로그인을 참조하세요.
메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI에서 확장 사용을 참조하세요.
az version을 실행하여 설치된 버전과 종속 라이브러리를 찾습니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.
Azure AI 서비스에 대한 연결을 사용하여 앱 만들기
모든 리소스를 포함할 리소스 그룹을 만듭니다.
# Save resource group name as variable for convenience groupName=myKVResourceGroup region=westeurope az group create --name $groupName --location $region
Azure AI 서비스 리소스를 만듭니다. <cs-resource-name>을 사용자가 선택한 고유한 이름으로 바꿉니다.
# Save resource name as variable for convenience. csResourceName=<cs-resource-name> az cognitiveservices account create --resource-group $groupName --name $csResourceName --location $region --kind TextAnalytics --sku F0 --custom-domain $csResourceName
참고 항목
--sku F0
은 무료 계층 Azure AI 서비스 리소스를 만듭니다. 각 구독은 하나의 무료 계층TextAnalytics
리소스의 할당량으로 제한됩니다. 할당량을 이미 넘어선 경우 대신--sku S
를 사용합니다.
.NET 앱 구성
샘플 리포지토리를 로컬로 복제하고 App Service에 응용 프로그램 예제를 배포합니다. <app-name>을 고유한 이름으로 바꿉니다.
# Save app name as variable for convenience
appName=<app-name>
# Clone sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/dotnet
az webapp up --sku F1 --resource-group $groupName --name $appName --plan $appName --location $region
비밀을 앱 설정으로 구성
Azure AI 서비스 비밀을 앱 설정
CS_ACCOUNT_NAME
및CS_ACCOUNT_KEY
로 구성합니다.# Get subscription key for Cognitive Services resource csKey1=$(az cognitiveservices account keys list --resource-group $groupName --name $csResourceName --query key1 --output tsv) az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="$csResourceName" CS_ACCOUNT_KEY="$csKey1"
브라우저에서 앱 배포를
<app-name>.azurewebsites.net
로 이동하여 다양한 언어의 문자열로 언어 감지기를 사용해 보세요.애플리케이션 코드를 살펴보면 검색 결과에 대한 디버그 출력에서 배경과 동일한 글꼴 색을 확인할 수 있습니다. 결과 바로 아래에 있는 공백을 강조 표시하여 이를 확인할 수 있습니다.
안전한 백 엔드 연결
현재 App Service 앱에 연결 비밀이 앱 설정으로 저장됩니다. 이 접근 방식은 애플리케이션 코드베이스에서 이미 연결 비밀을 보호하고 있습니다. 그러나 앱을 관리할 수 있는 모든 contributor는 앱 설정도 볼 수 있습니다. 이 단계에서는 연결 비밀을 키 자격 증명 모음으로 이동하고, 사용자만 관리할 수 있도록 액세스를 잠그고, App Service 앱에서만 관리 ID를 사용하여 읽을 수 있도록 합니다.
키 자격 증명 모음을 생성합니다. <vault-name>을 고유한 이름으로 바꿉니다.
# Save app name as variable for convenience vaultName=<vault-name> az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
--enable-rbac-authorization
매개 변수 집합은 Azure 역할 기반 액세스 제어(RBAC)를 권한 모델로 설정합니다. 이 설정은 기본적으로 모든 액세스 정책 사용 권한을 무효화 합니다.자격 증명 모음에 대한 Key Vault Secrets Officer RBAC 역할을 사용자에게 제공합니다.
vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv) myId=$(az ad signed-in-user show --query id --output tsv) az role assignment create --role "Key Vault Secrets Officer" --assignee-object-id $myId --assignee-principal-type User --scope $vaultResourceId
앱에 대해 시스템이 할당한 관리 ID를 사용하도록 설정하 고 자격 증명 모음에 대한 Key Vault Secrets User RBAC 역할을 제공합니다.
az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role "Key Vault Secrets User"
자격 증명 모음에 비밀로 Azure AI 서비스 리소스 이름 및 구독 키를 추가하고 다음 단계에서 해당 ID를 환경 변수로 저장합니다.
csResourceKVUri=$(az keyvault secret set --vault-name $vaultName --name csresource --value $csResourceName --query id --output tsv) csKeyKVUri=$(az keyvault secret set --vault-name $vaultName --name cskey --value $csKey1 --query id --output tsv)
이전에는 앱에서 비밀을 앱 설정
CS_ACCOUNT_NAME
및CS_ACCOUNT_KEY
로 설정합니다. 이제 대신 키 자격 증명 모음 참조로 설정합니다.az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
브라우저에서
<app-name>.azurewebsites.net
으로 다시 이동합니다. 검색 결과가 다시 수신되면 키 자격 증명 모음 참조를 사용하여 Azure AI 서비스 엔드포인트에 연결하게 됩니다.
축하합니다. 앱은 이제 애플리케이션 코드를 변경하지 않고 키 자격 증명 모음에 보관된 비밀을 사용하여 Azure AI 서비스에 연결하고 있습니다.
리소스 정리
이전 단계에서는 리소스 그룹에서 Azure 리소스를 만들었습니다. 나중에 이러한 리소스가 필요하지 않을 것 같으면 Cloud Shell에서 다음 명령을 실행하여 리소스 그룹을 삭제합니다.
az group delete --name $groupName
이 명령을 실행하는 데 1분 정도 걸릴 수 있습니다.