Azure PowerShell을 사용하여 Azure 서비스 주체 만들기

Azure 서비스를 사용하는 자동화된 도구에는 항상 제한된 권한이 있어야 합니다. 애플리케이션이 완전한 권한이 있는 사용자로 로그인하는 대신 Azure는 서비스 주체를 제공합니다.

Azure 서비스 주체는 Azure 리소스에 액세스하기 위해 애플리케이션, 호스트된 서비스 및 자동화된 도구와 함께 사용하기 위해 만든 ID입니다. 이 액세스는 서비스 주체에 할당된 역할에 의해 제한되므로 액세스할 수 있는 리소스와 어느 수준에 액세스할 수 있는지 제어할 수 있습니다. 보안상의 이유로 사용자 ID로 로그인할 수 있도록 허용하는 대신 자동화된 도구에서 서비스 주체를 사용하는 것이 좋습니다.

이 문서에서는 Azure PowerShell을 사용하여 서비스 주체를 만들고, 정보를 가져오고, 다시 설정하는 단계를 보여줍니다.

주의

New-AzADServicePrincipal 명령을 사용하여 서비스 주체를 만들면 보호해야 하는 자격 증명이 출력에 포함됩니다. 또는 자격 증명을 사용할 필요가 없도록 관리 ID를 사용하는 것이 좋습니다.

필수 조건

서비스 주체 만들기

New-AzADServicePrincipal cmdlet을 사용하여 서비스 주체 만들기 서비스 주체를 만들 때 사용하는 로그인 인증 유형을 선택합니다.

Important

Az PowerShell 모듈 버전 7.x부터 New-AzADServicePrincipal은 더 이상 기본적으로 Contributor 역할을 서비스 주체에 할당하지 않습니다. 서비스 주체에게 특정 역할을 할당하려면 역할 할당을 추가하는 단계를 참조하세요.

참고 항목

계정에 서비스 주체 New-AzADServicePrincipal 를 만들 수 있는 권한이 없는 경우 "작업을 완료할 수 있는 권한이 부족합니다"가 포함된 오류 메시지를 반환합니다. Microsoft Entra 관리자에게 문의하여 서비스 주체를 만듭니다.

사용자가 애플리케이션을 등록할 수 있는 사용자 설정이 아니요설정된 Microsoft Entra ID 디렉터리에서 다음 Microsoft Entra ID 기본 제공 역할(작업 microsoft.directory/applications/createAsOwner 포함) 중 microsoft.directory/applications/create하나의 구성원이어야 합니다.

Microsoft Entra ID의 사용자 설정에 대한 자세한 내용은 애플리케이션을 만들 수 있는 사용자 제한(Restrict)을 참조 하세요.

서비스 주체에 사용할 수 있는 인증 유형에는 암호 기반 인증과 인증서 기반 인증의 두 가지 유형이 있습니다.

암호 기반 인증

Important

암호 기반 인증 서비스 주체의 기본 역할은 기여자입니다. 이 역할에는 Azure 계정에서 읽고 쓸 수 있는 모든 권한이 있습니다. 역할 할당 관리에 대한 내용은 서비스 주체 역할 관리를 참조하세요.

다른 인증 매개 변수가 없으면 암호 기반 인증이 사용되고 임의의 암호가 생성됩니다. 암호 기반 인증을 원하는 경우 이 방법을 사용하는 것이 좋습니다.

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

반환된 개체는 생성된 암호를 포함하는 PasswordCredentials.SecretText 속성을 포함합니다. 서비스 주체를 사용하여 인증할 수 있도록 이 값을 안전한 위치에 저장해야 합니다. 해당 값은 콘솔 출력에 표시되지 않습니다. 암호를 분실한 경우 서비스 주체 자격 증명을 다시 설정합니다.

다음 코드를 사용하면 비밀을 내보낼 수 있습니다.

$sp.PasswordCredentials.SecretText

반환된 New-AzADServicePrincipal 개체에는 서비스 주체로 Id 로그인하는 데 사용할 수 있는 멤버와 DisplayName 멤버가 포함됩니다.

Important

서비스 주체로 로그인하려면 서비스 주체가 만들어진 테넌트 ID가 필요합니다. 서비스 주체를 만들 때 활성 테넌트 가져오기를 위해 서비스 주체를 만든 직후에 다음 명령을 실행합니다.

(Get-AzContext).Tenant.Id

인증서 기반 인증

Important

인증서 기반 인증 서비스 주체를 만들 때에는 기본 역할이 할당되지 않습니다. 역할 할당 관리에 대한 내용은 서비스 주체 역할 관리를 참조하세요.

인증서 기반 인증을 사용하는 서비스 주체는 매개 변수를 CertValue 사용하여 만들어집니다. 이 매개 변수는 공용 인증서의 base64로 인코딩된 ASCII 문자열을 사용합니다. PEM 파일 또는 텍스트로 인코딩된 CRT 또는 CER로 표시됩니다. 공용 인증서의 이진 인코딩은 지원되지 않습니다. 이러한 지침에서는 이미 사용할 수 있는 인증서가 있다고 가정합니다.

$cert = <public certificate as base64-encoded string>
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -CertValue $cert

New-AzADServicePrincipal에서 반환된 개체는 IdDisplayName 속성을 포함하며, 이들은 서비스 주체로 로그인에 사용할 수 있는 멤버입니다. 서비스 주체로 로그인하는 클라이언트도 인증서의 프라이빗 키에 액세스해야 합니다.

Important

서비스 주체로 로그인하려면 서비스 주체가 만들어진 테넌트 ID가 필요합니다. 서비스 주체를 만들 때 활성 테넌트 가져오기를 위해 서비스 주체를 만든 직후에 다음 명령을 실행합니다.

(Get-AzContext).Tenant.Id

기존 서비스 주체 가져오기

활성 테넌트의 서비스 주체 목록은 Get-AzADServicePrincipal을 사용하여 검색할 수 있습니다. 기본적으로 이 명령은 테넌트에 있는 모든 서비스 주체를 반환합니다. 대규모 조직의 경우 결과를 반환하는 데 시간이 오래 걸릴 수 있습니다. 대신 선택적 서버 쪽 필터링 인수 중 하나를 사용하는 것이 좋습니다.

  • DisplayNameBeginsWith는 제공된 값과 일치하는 접두사를 가진 서비스 주체를 요청합니다. 서비스 주체의 표시 이름은 만드는 중에 DisplayName으로 설정된 값입니다.
  • DisplayName는 서비스 주체 이름의 정확한 일치를 요청합니다.

서비스 주체 역할 관리

Azure PowerShell에는 역할 할당을 관리하는 다음 cmdlet이 있습니다.

RBAC(역할 기반 액세스 제어) 및 역할에 대한 자세한 내용은 RBAC: 기본 제공 역할을 참조하세요.

다음 예제에서는 Reader 역할을 추가하고 Contributor 역할을 제거합니다.

New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName 'Reader'
Remove-AzRoleAssignment -ObjectId <service principal object ID> -RoleDefinitionName 'Contributor'

Important

역할 할당 cmdlet은 서비스 사용자 주체 ID를 사용하지 않습니다. 생성 시 생성되는 연결된 애플리케이션 ID를 사용합니다. 서비스 주체에 대한 애플리케이션 ID를 가져오려면 Get-AzADServicePrincipal을 사용합니다.

참고 항목

계정에 역할을 할당할 수 있는 권한이 없는 경우 계정에 "'Microsoft.Authorization/roleAssignments/write' 작업을 수행할 수 있는 권한이 없음"이라는 오류 메시지가 표시됩니다. 역할을 관리하려면 Microsoft Entra 관리자에게 문의하세요.

역할을 추가해도 이전에 할당된 권한은 제한되지 않습니다 . 서비스 주체의 권한을 제한할 때 기여자 역할을 제거해야 합니다.

변경 내용은 할당된 역할을 나열하여 확인할 수 있습니다.

Get-AzRoleAssignment -ServicePrincipalName ServicePrincipalName

서비스 주체를 사용하여 로그인

로그인하여 새 서비스 주체의 자격 증명 및 권한을 테스트합니다. 서비스 주체를 사용하여 로그인하려면 연결된 값과 서비스 주체가 만든 테넌트가 필요합니다 applicationId .

암호를 사용하여 서비스 주체로 로그인하려면 다음을 수행합니다.

# Use the application ID as the username, and the secret as password
$credentials = Get-Credential
Connect-AzAccount -ServicePrincipal -Credential $credentials -Tenant <tenant ID>

인증서 기반 인증을 사용하려면 Azure PowerShell이 인증서 지문을 기반으로 로컬 인증서 저장소에서 정보를 검색할 수 있어야 합니다.

Connect-AzAccount -ServicePrincipal -Tenant <TenantId> -CertificateThumbprint <Thumbprint> -ApplicationId <ApplicationId>

PowerShell에서 액세스할 수 있는 자격 증명 저장소로 인증서를 가져오는 방법에 대한 지침은 인증서 기반 인증을 참조하세요 .

자격 증명 다시 설정

서비스 주체에 대한 자격 증명을 잊어버린 경우 New-AzADSpCredential을 사용하여 임의의 암호로 새 자격 증명을 추가합니다. 이 cmdlet은 암호를 재설정할 때 사용자 정의 자격 증명을 지원하지 않습니다.

Important

새 자격 증명을 할당하기 전에 기존 자격 증명을 제거하여 로그인을 방지할 수 있습니다. 이렇게 하려면 Remove-AzADSpCredential cmdlet을 사용합니다.

Remove-AzADSpCredential -DisplayName ServicePrincipalName
$newCredential = New-AzADSpCredential -ServicePrincipalName ServicePrincipalName

문제 해결

"New-AzADServicePrincipal: 속성 identifierUris에 대해 동일한 값을 가진 다른 개체가 이미 있습니다."라는 오류가 표시되면 이름이 같은 서비스 주체가 아직 없는지 확인합니다.

Get-AzAdServicePrincipal -DisplayName ServicePrincipalName

기존 서비스 주체가 더 이상 필요하지 않은 경우 다음 예제를 사용하여 제거할 수 있습니다.

Remove-AzAdServicePrincipal -DisplayName ServicePrincipalName

이 오류는 이전에 Azure Active Directory 애플리케이션에 대한 서비스 주체를 만든 경우에도 발생할 수 있습니다. 서비스 주체를 제거하면 애플리케이션을 계속 사용할 수 있습니다. 이 애플리케이션을 사용하면 동일한 이름의 다른 서비스 주체를 만들 수 없습니다.

다음 예제를 사용하여 이름이 같은 Microsoft Entra 애플리케이션이 존재하지 않는지 확인할 수 있습니다.

Get-AzADApplication -DisplayName ServicePrincipalName

이름이 같은 애플리케이션이 있는 경우 다음 예제를 사용하여 제거할 수 있습니다.

Remove-AzADApplication -DisplayName ServicePrincipalName

그렇지 않은 경우 만들려는 새 서비스 주체의 대체 이름을 선택합니다.