이 문서에서는 App Service 및 Azure Functions 애플리케이션에 대한 관리 ID를 만드는 방법과 다른 리소스에 액세스하는 데 사용하는 방법을 보여 줍니다.
중요
앱이 구독/테넌트 간에 마이그레이션되면 App Service 및 Azure Functions에 대한 관리 ID가 예상대로 작동하지 않습니다. 앱에서 새 ID를 확보해야 하며 해당 기능을 사용 중지했다가 다시 사용하도록 설정하여 수행합니다. 다운스트림 리소스에도 새 ID를 사용하려면 액세스 정책을 업데이트해야 합니다.
Azure AD(Azure Active Directory)의 관리 ID를 사용하면 앱에서 다른 Azure AD 보호 리소스(예: Azure Key Vault)에 쉽게 액세스할 수 있습니다. ID는 Azure 플랫폼에서 관리하며 비밀을 프로비전하거나 회전할 필요가 없습니다. Azure AD의 관리 ID에 관한 자세한 내용은 Azure 리소스에 대한 관리 ID를 참조하세요.
애플리케이션에 두 가지 형식의 ID를 부여할 수 있습니다.
시스템 할당 ID는 애플리케이션에 연결되어 있어 해당 앱을 삭제하면 이 ID도 삭제됩니다. 앱에는 하나의 시스템 할당 ID만 있을 수 있습니다.
사용자 할당 ID는 앱에 할당할 수 있는 독립 실행형 Azure 리소스입니다. 앱에는 여러 사용자 할당 ID가 있을 수 있습니다.
tenantId 속성은 ID가 속한 Azure AD 테넌트를 식별합니다. principalId는 애플리케이션 새 ID의 고유 식별자입니다. Azure AD 내에서 서비스 주체는 사용자가 App Service 또는 Azure Functions 인스턴스에 지정한 이름과 동일한 이름을 갖습니다.
템플릿의 이후 단계에서 이러한 속성을 참조해야 하는 경우 다음 예제와 같이 'Full' 플래그를 사용하여 reference()템플릿 함수를 통해 수행할 수 있습니다.
principalId는 Azure AD 관리에 사용되는 ID의 고유 식별자입니다. clientId는 런타임 호출 중 사용할 ID 지정에 사용하는 애플리케이션의 새 ID에 대한 고유 식별자입니다.
대상 리소스 구성
앱 또는 함수의 액세스를 허용하도록 대상 리소스를 구성해야 할 수 있습니다. 예를 들어 Key Vault에 액세스하기 위한 토큰을 요청하는 경우 앱 또는 함수의 관리 ID를 포함하는 액세스 정책도 추가해야 합니다. 그렇지 않으면 유효한 토큰을 사용하는 경우에도 Key Vault에 대한 호출이 거부됩니다. Azure SQL Database에서도 마찬가지입니다. Azure Active Directory 토큰을 지원하는 리소스에 대한 자세한 내용은 Azure AD 인증을 지원하는 Azure 서비스를 참조하세요.
중요
관리 ID에 대한 백 엔드 서비스는 약 24시간 동안 리소스 URI당 캐시를 유지합니다. 특정 대상 리소스의 액세스 정책을 업데이트하고 해당 리소스에 대한 토큰을 즉시 검색하는 경우 토큰이 만료될 때까지 오래된 권한으로 캐시된 토큰을 계속 가져올 수 있습니다. 현재 토큰 새로 고침을 강제로 적용할 수 있는 방법은 없습니다.
앱 코드에서 Azure 서비스에 커넥트
앱은 관리 ID를 사용하여 Azure SQL Database, Azure Key Vault, Azure Storage 같은 Azure Active Directory에 의해 보호되는 Azure 리소스에 대한 토큰을 가져올 수 있습니다. 이러한 토큰은 애플리케이션의 특정 사용자가 아닌 리소스에 액세스하는 애플리케이션을 나타냅니다.
App Service 및 Azure Functions는 토큰 검색을 위해 내부적으로 액세스할 수 있는 REST 엔드포인트를 제공합니다. REST 엔드포인트는 모든 언어의 일반 HTTP 클라이언트를 사용하여 구현할 수 있는 표준 HTTP GET을 사용하여 앱 내에서 액세스할 수 있습니다. .NET, JavaScript, Java, Python의 경우 Azure ID 클라이언트 라이브러리는 이 REST 엔드포인트에 대한 추상화 기능을 제공하고 개발 환경을 간소화합니다. 다른 Azure 서비스에 연결하는 것은 서비스별 클라이언트에 자격 증명 개체를 추가하는 것만큼 간단합니다.
Azure PowerShell에서 모든 ID를 제거하는 방법(Azure Functions만 해당):
# Update an existing function app to have IdentityType "None".
Update-AzFunctionApp -Name $functionAppName -ResourceGroupName $resourceGroupName -IdentityType None
ARM 템플릿에서 모든 ID를 제거하는 방법:
"identity": {
"type": "None"
}
참고
설정할 수 있는 애플리케이션 설정인 WEBSITE_DISABLE_MSI도 있으며 이것은 로컬 토큰 서비스를 비활성화합니다. 그러나 ID는 그대로 두고 도구는 관리 ID를 “켜짐” 또는 “사용”으로 표시합니다. 따라서 이 설정을 사용하지 않는 것이 좋습니다.
REST 엔드포인트 참조
관리 ID가 있는 앱은 다음 두 가지 환경 변수를 정의하여 이 엔드포인트를 사용할 수 있도록 합니다.
IDENTITY_ENDPOINT - 로컬 토큰 서비스의 URL입니다.
IDENTITY_HEADER - SSRF(서버 쪽 요청 위조) 공격을 완화하는 데 사용되는 헤더입니다. 플랫폼에서 값을 회전합니다.
IDENTITY_ENDPOINT는 앱이 토큰을 요청할 수 있는 로컬 URL입니다. 리소스 토큰을 가져오려면 이 엔드포인트에 다음 매개 변수를 포함하여 HTTP GET 요청을 보냅니다.
매개 변수 이름
그런 다음
Description
resource
쿼리
토큰을 가져와야 하는 리소스의 Azure AD 리소스 URI입니다. Azure AD 인증 또는 기타 리소스 URI를 지원하는 Azure 서비스 중 하나일 수 있습니다.
api-version
쿼리
사용할 토큰 API의 버전입니다. 2019-08-01을 사용합니다.
X-IDENTITY-HEADER
헤더
IDENTITY_HEADER 환경 변수의 값입니다. 이 헤더는 SSRF(서버 쪽 요청 위조) 공격을 완화하는 데 사용됩니다.
client_id
쿼리
(선택 사항) 사용할 사용자 할당 ID의 클라이언트 ID입니다. principal_id, mi_res_id 또는 object_id를 포함하는 요청에 사용할 수 없습니다. 모든 ID 매개 변수(client_id, principal_id, object_id 및 mi_res_id)를 생략하면 시스템 할당 ID가 사용됩니다.
principal_id
쿼리
(선택 사항) 사용할 사용자 할당 ID의 보안 주체 ID입니다. object_id는 대신 사용할 수 있는 별칭입니다. client_id, mi_res_id 또는 object_id를 포함하는 요청에 사용할 수 없습니다. 모든 ID 매개 변수(client_id, principal_id, object_id 및 mi_res_id)를 생략하면 시스템 할당 ID가 사용됩니다.
mi_res_id
쿼리
(선택 사항) 사용할 사용자 할당 ID의 Azure 리소스 ID입니다. principal_id, client_id 또는 object_id를 포함하는 요청에 사용할 수 없습니다. 모든 ID 매개 변수(client_id, principal_id, object_id 및 mi_res_id)를 생략하면 시스템 할당 ID가 사용됩니다.
중요
사용자 할당 ID에 대한 토큰을 가져오려고 시도하는 경우 선택적 속성 중 하나를 포함해야 합니다. 그러지 않으면 토큰 서비스는 시스템 할당 ID에 대한 토큰을 가져오려고 시도하는데 이는 존재 여부가 불분명합니다.