자습서: Microsoft Entra 애플리케이션을 사용하여 Microsoft Entra 사용자 만들기

적용 대상: Azure SQL Database

이 문서에서는 Azure SQL Database에서 Microsoft Entra 사용자를 만들 수 있도록 서비스 주체를 구성하는 방법을 설명합니다. 이 기능을 사용하면 Microsoft Entra 테넌트에서 사용자 및 애플리케이션에 대한 Azure SQL 리소스 액세스 관리를 프로그래밍 방식으로 구성할 수 있습니다.

참고 항목

Microsoft Entra ID는 이전의 Azure Active Directory(Azure AD)입니다.

Microsoft Entra 인증에 대한 자세한 내용은 Microsoft Entra 인증 사용을 참조하세요.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 논리 서버에 ID 할당
  • 서버 ID에 디렉터리 읽기 권한자 역할 할당
  • Microsoft Entra ID에 애플리케이션 등록
  • Azure SQL Database에서 해당 애플리케이션의 서비스 주체에 대한 데이터베이스 사용자 만들기
  • 서비스 주체를 사용하여 Microsoft Entra 데이터베이스 사용자 만들기

필수 조건

  • 기존 Azure SQL Database 배포. 이 자습서에서는 작업 SQL Database가 있다고 가정합니다.
  • SQL 데이터베이스가 있는 테넌트의 Microsoft Entra Global Administrator 또는 Privileged Role Administrator 사용 권한
  • 최신 버전의 Azure PowerShell 모듈
  • Microsoft.Graph PowerShell 모듈의 최신 버전.

논리 서버에 ID 할당

  1. SQL 데이터베이스를 호스트하는 Microsoft Entra 테넌트를 지정하여 Azure에 연결합니다. 테넌트 ID는 Azure PortalMicrosoft Entra ID 리소스에 대한 개요 페이지에서 찾을 수 있습니다. 테넌트 ID를 복사한 다음, 다음 PowerShell 명령을 실행합니다.

    • <TenantId>테넌트 ID로 바꿉니다.
    Connect-AzAccount -Tenant <TenantId>
    

    나중에 이 자습서에서 사용하기 위해 TenantId를 기록합니다.

  2. 시스템 할당 관리 ID를 생성하고 Azure의 논리 서버에 할당합니다. 다음 PowerShell 명령을 실행합니다.

    • Set-AzSqlServer 명령에서 <ResourceGroupName><ServerName>(을)를 리소스로 바꿉니다. 서버 이름이 myserver.database.windows.net인 경우 <ServerName>myserver로 바꿉니다.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. 서버 ID가 성공적으로 할당되었는지 확인합니다. 다음 PowerShell 명령을 실행합니다.

    • <ResourceGroupName><ServerName>을 리소스로 바꿉니다. 서버 이름이 myserver.database.windows.net인 경우 <ServerName>myserver로 바꿉니다.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    출력에 PrincipalId, TypeTenantId가 표시됩니다. 할당된 ID는 PrincipalId입니다.

  4. 이 ID는 Azure Portal로 이동하여 확인할 수도 있습니다.

    • Microsoft Entra ID 리소스에서 Enterprise 애플리케이션으로 이동합니다. 논리 서버의 이름을 입력합니다. 리소스에 표시되는 개체 ID는 주 서버 ID의 ID입니다.

    Screenshot shows where to find the Object ID for an enterprise application.

디렉터리 읽기 권한자 역할에 서버 ID 추가하는 법

서버 ID에는 Microsoft Entra 사용자 및 로그인을 만들고 그룹 확장을 수행하여 Microsoft Entra 그룹 멤버 자격에 따라 사용자 권한을 적용하는 등 관리 기능에 대해 Microsoft Entra ID를 쿼리할 수 있는 권한이 필요합니다. Microsoft Entra ID를 쿼리하는 서버 ID 권한이 해지되거나 서버 ID가 삭제되면 Microsoft Entra 인증이 작동을 중지합니다.

디렉터리 읽기 권한자 역할에 추가하거나 다음과 같은 하위 수준의 Microsoft Graph 권한을 할당하여 서버 ID에 Microsoft Entra 쿼리 권한을 할당합니다.

참고 항목

이 스크립트는 Microsoft Entra ID Global Administrator 또는 Privileged Role Administrator에 의해 실행되어야 합니다.

다음 스크립트는 Azure SQL Database의 논리 서버를 나타내는 ID에 대한 Microsoft Entra 디렉터리 읽기 권한자을 부여합니다.

  • <TenantId>를 이전에 수집한 TenantId로 바꿉니다.
  • <ServerName>을 논리 서버 이름으로 바꿉니다. 서버 이름이 myserver.database.windows.net인 경우 <ServerName>myserver로 바꿉니다.
# This script grants "Directory Readers" permission to a service principal representing a logical server for Azure SQL Database
# It can be executed only by a user who is a member of the **Global Administrator** or **Privileged Role Administrator** role.
# To check if the "Directory Readers" role was granted, re-execute this script

Import-Module Microsoft.Graph.Authentication
$ServerIdentityName = "<ServerName>"    # Enter your logical server name
$TenantId = "<TenantId>"                # Enter your tenant ID

Connect-MgGraph -TenantId "<TenantId>" -Scopes "RoleManagement.ReadWrite.Directory,Application.Read.All"

# Get Microsoft Entra "Directory Readers" role and create if it doesn't exist
$roleName = "Directory Readers"
$role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
if ($role -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-MgDirectoryRoleTemplate -Filter "DisplayName eq '$roleName'"
    New-MgDirectoryRoleTemplate -RoleTemplateId $roleTemplate.Id
    $role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
}

# Get service principal for server
$roleMember = Get-MgServicePrincipal -Filter "DisplayName eq '$ServerIdentityName'"
$roleMember.Count
if ($roleMember -eq $null) {
    Write-Output "Error: No service principal with name '$($ServerIdentityName)' found, make sure that ServerIdentityName parameter was entered correctly."
    exit
}
if (-not ($roleMember.Count -eq 1)) {
    Write-Output "Error: Multiple service principals with name '$($ServerIdentityName)'"
    Write-Output $roleMember | Format-List DisplayName, Id, AppId
    exit
}

# Check if service principal is already member of Directory Readers role
$isDirReader = Get-MgDirectoryRoleMember -DirectoryRoleId $role.Id -Filter "Id eq '$($roleMember.Id)'"

if ($isDirReader -eq $null) {
    # Add principal to Directory Readers role
    Write-Output "Adding service principal '$($ServerIdentityName)' to 'Directory Readers' role'..."
    $body = @{
        "@odata.id"= "https://graph.microsoft.com/v1.0/directoryObjects/{$($roleMember.Id)}"
    }
    New-MgDirectoryRoleMemberByRef -DirectoryRoleId $role.Id -BodyParameter $body
    Write-Output "'$($ServerIdentityName)' service principal added to 'Directory Readers' role'."
} else {
    Write-Output "Service principal '$($ServerIdentityName)' is already member of 'Directory Readers' role'."
}

참고 항목

이 스크립트의 출력은 ID가 디렉터리 읽기 권한자 역할에 할당되었는지를 나타냅니다. 권한이 부여되었는지 확실하지 않으면 스크립트를 다시 실행할 수 있습니다.

SQL Managed Instance에 대한 디렉터리 읽기 권한자 역할을 설정하는 방법에 대한 비슷한 방법은 Microsoft Entra 관리자(SQL Managed Instance) 프로비저닝을 참조하세요.

프로덕션 환경에서 일반적인 관리 방법은 Microsoft Entra ID의 역할 할당 가능 그룹에 디렉터리 읽기 권한자 역할을 할당하는 것입니다. 이렇게 하면 그룹 소유자는 그룹에 관리 ID를 추가할 수 있습니다. 이렇게 하면 기본 최소 권한의 원칙을 만족하면서 모든 SQL 인스턴스에 디렉터리 읽기 권한자 역할을 개별적으로 부여하기 위해 전역 관리자 또는 권한 있는 역할 관리자를 사용할 필요가 없습니다. 이 기능에 대한 자세한 내용은 Azure SQL용 Microsoft Entra ID의 디렉터리 읽기 권한자 역할을 참조하세요.

Microsoft Entra ID로 애플리케이션 만들기

애플리케이션 등록 앱을 등록하려면 최소한 Microsoft Entra ID 애플리케이션 개발자 역할이 필요합니다. 역할을 할당하는 방법에 대한 자세한 내용은 사용자에게 Microsoft Entra 역할 할당을 참조하세요.

이 자습서에서는 두 개의 서비스 주체를 사용합니다. 첫 번째 서비스 주체인 DBOwnerApp은 데이터베이스에서 다른 사용자를 만드는 데 사용됩니다. 두 번째 서비스 주체인 myappDBOwnerApp이 이 자습서의 뒷부분에서 데이터베이스 사용자를 만드는 애플리케이션입니다.

애플리케이션을 등록하려면 다음을 수행합니다.

  1. Azure Portal에서 Microsoft Entra ID>앱 등록>새 등록을 선택합니다.

    Screenshot shows the Register an application page.

    앱 등록을 만들면 애플리케이션(클라이언트) ID 값이 생성되고 표시됩니다. 나중에 이 자습서에서 사용하기 위해 기록해 두세요.

    Screenshot of the Azure portal that shows the App ID.

  2. 웹 애플리케이션 클라이언트 암호 만들기 여기에 가이드에 따라 로그인을 위한 인증서를 업로드하거나 비밀을 만듭니다. 이 자습서에서 나중에 사용하기 위해 DBOwnerApp의 클라이언트 비밀을 기록합니다.

자세한 내용은 포털을 사용하여 리소스에 액세스할 수 있는 Microsoft Entra 애플리케이션 및 서비스 주체 만들기 문서를 참조하세요.

서비스 주체 만들기

새로 만든 서비스 주체인 DBOwnerApp을 SQL Database의 사용자로 추가하고 권한을 할당합니다.

다른 사용자를 만들 수 있는 권한이 있는 Microsoft Entra ID를 사용하여 SQL Database에 연결합니다.

Important

Microsoft Entra 사용자만 Azure SQL Database에서 다른 Microsoft Entra 사용자를 만들 수 있습니다. 서버 관리자를 포함하여 SQL 인증을 기반으로 하는 사용자는 Microsoft Entra 사용자를 만들 수 없습니다. Microsoft Entra 관리자는 SQL Database에서 다른 Microsoft Entra 사용자를 처음 만들 수 있는 유일한 사용자입니다. Microsoft Entra 관리자가 다른 사용자를 만든 후에는 적절한 권한이 있는 모든 Microsoft Entra 사용자가 다른 Microsoft Entra 사용자를 만들 수 있습니다.

  1. 다음 T-SQL 명령을 사용하여 SQL Database에서 DBOwnerApp 사용자를 만듭니다.

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. 다른 Microsoft Entra 사용자를 만들려면 최소한 ALTER ANY USER SQL 권한이 필요합니다. 또한 이 권한은 db_owner의 구성원 자격격 및 Microsoft Entra 관리자 할당을 통해 상속됩니다. 다음 예제에서는 데이터베이스에서 다른 Microsoft Entra 사용자를 만들 수 있도록 DBOwnerApp에 권한을 할당하는 세 가지 옵션을 보여 줍니다.

    sp_addrolemember 사용하여 db_owner 역할에 DBOwnerApp을 추가할 수 있습니다.

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    다음 T-SQL 샘플과 같이 DBOwnerAppALTER ANY USER권한을 할당할 수 있습니다.

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    DBOwnerApp을 Microsoft Entra 관리자로 설정할 수 있습니다. 이 작업은 Azure Portal, PowerShell 또는 Azure CLI 명령을 사용하여 수행할 수 있습니다. 자세한 내용은 Microsoft Entra 관리자 프로비전(SQL Database)을 참조하세요.

서비스 주체 생성 및 사용

  1. 다음 스크립트를 사용하여 DBOwnerApp 서비스 주체 사용자를 사용하는 myapp Microsoft Entra 서비스 주체 사용자를 만듭니다.

    • <TenantId>를 이전에 수집한 TenantId로 바꿉니다.
    • <ClientId>를 이전에 수집한 ClientId로 바꿉니다.
    • <ClientSecret>을 이전에 만든 클라이언트 암호로 바꿉니다.
    • <ServerName>을 논리 서버 이름으로 바꿉니다. 서버 이름이 myserver.database.windows.net인 경우 <ServerName>myserver로 바꿉니다.
    • <database name>을 SQL Database 이름으로 바꿉니다.
    # PowerShell script for creating a new SQL user called myapp using application DBOwnerApp with secret
    # DBOwnerApp is an admin for the server
    
    # Download latest  MSAL  - https://www.powershellgallery.com/packages/MSAL.PS
    Import-Module MSAL.PS
    
    $tenantId = "<TenantId>"   # Microsoft Entra tenant ID where DBOwnerApp resides
    $clientId = "<ClientId>"   # Application (client) ID recorded earlier for DBOwnerApp
    $clientSecret = "<ClientSecret>"   # Client secret for DBOwnerApp 
    $scopes = "https://database.windows.net/.default" # The endpoint
    
    $result = Get-MsalToken -RedirectUri $uri -ClientId $clientId -ClientSecret (ConvertTo-SecureString $clientSecret -AsPlainText -Force) -TenantId $tenantId -Scopes $scopes
    
    $Tok = $result.AccessToken
    #Write-host "token"
    $Tok
    
    $SQLServerName = "<ServerName>"    # Logical server name 
    $DatabaseName = "<database name>"   # Azure SQL database name
    
    Write-Host "Create SQL connection string"
    $conn = New-Object System.Data.SqlClient.SQLConnection 
    $conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30"
    $conn.AccessToken = $Tok
    
    Write-host "Connect to database and execute SQL script"
    $conn.Open() 
    $ddlstmt = 'CREATE USER [myapp] FROM EXTERNAL PROVIDER;'
    Write-host " "
    Write-host "SQL DDL command"
    $ddlstmt
    $command = New-Object -TypeName System.Data.SqlClient.SqlCommand($ddlstmt, $conn)       
    
    Write-host "results"
    $command.ExecuteNonQuery()
    $conn.Close()
    

    또는 Azure SQL Database에 대한 Microsoft Entra 서비스 주체 인증 코드를 사용할 수 있습니다. CREATE USER [myapp] FROM EXTERNAL PROVIDER DDL 문을 실행하도록 스크립트를 수정합니다. 동일한 스크립트를 사용하여 SQL Database에서 일반 Microsoft Entra 사용자 또는 그룹을 만들 수 있습니다.

  2. 다음 명령을 실행하여 myapp 사용자가 데이터베이스에 있는지 확인합니다.

    SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId
    FROM sys.database_principals
    WHERE name = 'myapp'
    GO
    

    다음과 비슷한 출력이 표시됩니다.

    name	type	type_desc	appId
    myapp	E	EXTERNAL_USER	6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    

다음 단계