Azure 로컬 에서 오프라인 작업을 위한 정체성 계획 수립

이 문서에서는 Azure 로컬 에서 연결이 끊긴 작업을 위해 ID를 계획하고 통합하는 방법을 설명합니다. ID 솔루션을 설정하고 운영자가 사용할 수 있는 작업 및 역할을 이해하는 방법을 알아봅니다.

정체성 이해 및 계획

연결이 끊긴 작업의 경우 기존 ID 및 액세스 관리 솔루션과 통합해야 합니다. 연결이 끊긴 작업을 배포하기 전에 ID 솔루션을 통합하고 적용하는 데 필요한 단계를 이해해야 합니다.

연결이 끊긴 작업은 다음 솔루션을 지원합니다.

  • Active Directory: 그룹 및 멤버 자격
  • AD FS(Active Directory Federation Services): 인증

비고

Active Directory에는 유니버설 그룹만 지원됩니다. 그룹 멤버 자격을 설정할 때 그룹 범위를 유니버설로 설정합니다.

ID 통합의 작동 방식 이해

배포 기간 동안, ID 공급자(IDP) 및 ID 및 액세스 관리와 통합하기 위해 비연결 운영을 설정합니다. 루트 연산자를 지정합니다. 이 사용자는 특수 운영자 구독을 소유하고 배포 후 다른 연산자를 추가합니다. 운영자 구독은 연산자 작업의 범위를 정의하고 개별 작업은 운영자 역할에 따라 달라집니다.

높은 수준에서 OIDC(OpenID Connect) 엔드포인트는 연결이 끊긴 작업에 사용자를 인증하고, LDAP(Lightweight Directory Access Protocol) 엔드포인트는 조직의 그룹 및 멤버 자격을 통합합니다. 통합 후 표준 Azure 역할 기반 액세스 제어가 원하는 범위에 할당됩니다.

어플라이언스 및 사용자 또는 워크로드가 서비스와 통신하는 방법의 스크린샷

비고

역할 할당 및 정책은 운영자 구독에서 개별 구독으로 상속되지 않습니다. 각 구독에는 고유한 범위가 있습니다. 개별 구독에 할당된 특정 역할만 해당 특정 구독 내에서 작업을 수행할 수 있습니다.

운영자 역할 및 작업 이해

운영자 구독에 더 많은 연산자를 할당하여 일상적인 작업을 수행할 수 있습니다. 운영자 구독의 기본 제공 소유자 역할은 운영자에게 범위 /Subscriptions/\<GUID>/Microsoft.AzureLocalOperator/*에서 이러한 작업을 수행할 수 있는 기능을 부여합니다.

운영자 역할 및 수행할 수 있는 작업을 이해하는 데 도움이 되도록 다음 표에서는 다양한 범주에서 사용 가능한 작업에 대한 자세한 분석을 제공합니다. 이러한 범주에는 ID 및 액세스 관리, 구독 관리, 관찰 가능성 및 진단이 포함됩니다.

이러한 테이블을 사용하여 운영자 구독 범위 내에서 연산자가 실행할 수 있는 특정 작업을 식별합니다.

ID 및 액세스 관리

조치 오퍼레이터
더 많은 연산자 할당 예
SPN 만들기 예
SPN 삭제 예
서비스 주체 이름(SPN) 나열 예
SPN 업데이트 예
그룹 멤버 자격 보기(동기화됨) 예
ID 구성 보기 예
ID 동기화 상태 보기 예

구독 관리

조치 오퍼레이터
별칭 만들기 예
구독 만들기 예
별칭 삭제 예
구독 삭제 예
별칭 나열 예
모든 구독 나열 예
구독 소유권 다시 할당 예
구독 이름 바꾸기 예
구독 다시 시작 예

관찰 가능성 및 진단

조치 오퍼레이터
로그 수집 예
진단 및 시스템 생성 로그 설정 구성 예
syslog 전달 구성 예
다운로드 로그 예

연산자가 사용할 수 있는 작업에는 몇 가지 예외가 있습니다.

  • 운영자는 운영자 구독을 삭제할 수 없습니다.

  • SPN(서비스 사용자 이름)에 할당된 소유자는 해당 SPN을 삭제할 수도 있습니다.

비고

제공된 작업만 Azure Portal에서 사용할 수 있습니다.

필요한 경우 보안 연산자, 구독 관리자 및 지원 연산자와 같은 다른 기본 제공 역할을 고려하고 평가할 수 있습니다. 보다 자세한 연산자 역할을 수행하려면 운영자 역할을 기반으로 사용자 지정 역할 정의를 만들고 운영자 구독에 대한 액세스를 할당할 수 있습니다.

동기화 이해

초기 설정을 완료한 후 시스템은 그룹 멤버 자격과 그룹을 동기화하여 연결이 끊긴 작업에 액세스할 수 있도록 합니다. 동기화되는 그룹 및 멤버 자격을 확인하려면 Get-ApplianceExternalIdentityObservability에 나열된 것과 같은 연산자 API(애플리케이션 프로그래밍 인터페이스)를 사용합니다. 동기화는 6시간마다 주기적으로 실행됩니다.

ID 검사 목록

이 검사 목록을 사용하여 연결이 끊긴 작업과 ID 통합을 계획합니다.

  • IP 주소 또는 FQDN(정규화된 도메인 이름)을 식별합니다.

    • LDAP 엔드포인트(Active Directory)
    • 로그인 엔드포인트(AD FS/OIDC)
  • LDAP 엔드포인트에 FQDN을 사용하는 경우:

    • 연결이 끊긴 작업 어플라이언스가 설정되어 있고 제공된 엔드포인트를 확인하는 DNS(도메인 이름 시스템)를 사용하는지 확인합니다.
  • LDAP v3 서버(Active Directory)에서 읽기 전용 액세스 권한이 있는 계정을 만듭니다.

  • 멤버 자격 동기화에 대한 루트 그룹을 식별합니다.

  • UPN을 식별합니다. 이 사용자에게 초기 운영자 역할이 할당되어야 합니다.

배포 전에 다음 매개 변수를 수집하고 사용할 수 있도록 합니다.

매개 변수 이름 설명 예시
권위 OIDC 엔드포인트, 메타데이터 등에 대한 정보를 제공하는 액세스 가능한 기관 URI입니다. https://adfs.contoso-AzureLocal.com/adfs
ClientID adfsclient 앱을 설정할 때 만들어진 AppID입니다. 00001111-aaaa-2222-bbbb-3333cccc4444
LdapCredential(사용자 이름 및 암호) LDAP 통합을 위한 자격 증명(읽기 전용)입니다. 사용자 이름: ldap

암호:******
LdapsCertChainInfo LDAP 엔드포인트에 대한 인증서 체인 정보입니다. 데모를 위해 인증서 체인 정보를 생략할 수 있습니다. 인증서 체인을 가져오는 방법
OidcCertChainInfo OIDC 엔드포인트에 대한 인증서 체인 정보입니다. 데모를 위해 인증서 체인 정보를 생략할 수 있습니다. 인증서 체인을 가져오는 방법
LdapServer 연결이 끊긴 작업에서 연결할 수 있는 LDAP 엔드포인트입니다. 이 엔드포인트는 그룹 및 그룹 멤버 자격을 동기화합니다. Ldap.local.contoso.com
LdapPort 글로벌 카탈로그에 연결하는 데 사용되는 LDAP 포트입니다. 기본 3268은 안전하지 않은 채널이며 3269는 글로벌 카탈로그에 대한 ssl/secure 채널입니다. 3269
RootOperatorUserPrincipalName 운영자 구독에 처음으로 액세스 권한이 부여된 운영자 가상 사용자에 대한 UPN Cloud-admin@local.contoso.com
SyncGroupIdentifier 동기화를 시작할 Active Directory 그룹에 대한 GUID입니다.

$group = Get-ADGroup -Identity “mygroup” \| Select-Object Name, ObjectGUID
81d71e5c5-abc4-11af-8132-afdf6bbe2ec1
자동화 인증서 (선택 사항) 자동화 계정에 사용할 인증서

사용자 고유의 PKI를 사용하여 클라이언트 인증서를 만들거나 자체 서명된 인증서를 사용하고 이 인증서를 보호합니다.
$cert=New-SelfSignedCertificate -Subject '자동화 계정'

구성 매개 변수 예제:

$ldapPass = 'retracted'|Convertto-securestring -asplaintext -force
$idpConfig = @{ 
     authority = 'https://adfs.contoso-AzureLocal.com/adfs'    
           clientId  = '9e7655c5-1bc4-45af-8345-cdf6bbf4ec1'    
           rootOperatorUserPrincipalName = 'operator@local.contoso.com'    
           ldapServer                    = 'ldap.local.contoso.com'    
           LdapCredential = New-Object PSCredential -ArgumentList @("ldap", $ldapPass)
      syncGroupIdentifier           = '81d71e5c5-abc4-11af-8132-afdf6bbe2ec1'
}

완전 자동화된 배포

완전히 자동화된 배포의 경우 IdentityConfiguration의 일부로 AutomationCertificate를 사용합니다. 이렇게 하면 이 계정을 사용하여 운영자로 로그인하고, 구독을 만들고, 리소스 공급자를 등록하고, 전체 자동화로 실행할 수 있으므로 전체 배포 흐름을 자동화할 수 있습니다.

배포 후 해당 인증서로 로그인하는 방법에 대한 예제는 다음과 같습니다.

$username = '2cb981cc-147e-47cd-a32c-4bb0dfa60573'
$certPath = 'C:\Aldo\operatorcert.pem'
$tenantId = 'aaaabbbb-0000-cccc-1111-dddd2222eeee'
# Example using az login
az login --service-principal --username $username --certificate $certPath --tenant $tenantId

# Example using Powershell
# Make sure the cert is installed in the CurrentUser cert store
$CertThumbprint = (Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*Azure Local disconnected operations automation credential*" }).Thumbprint
Connect-AzAccount -ServicePrincipal `
                  -ApplicationId $username`
                  -TenantId $tenantId `
                  -CertificateThumbprint $certThumbprint

다음 사항에 유의하세요.

  • 사용자 이름은 정적입니다. 연산자 역할을 하는 애플리케이션 ID입니다.
  • 인증서를 .pem 파일로 변환/내보내야 합니다.

제한점

연결이 끊긴 작업과 ID 통합을 계획할 때 다음 제한 사항을 고려합니다.

  • 동기화 후 사용자 및 그룹 제거: 마지막 동기화 후 멤버 자격이 있는 사용자 및 그룹을 제거하면 연결이 끊긴 작업이 정리되지 않습니다. 이 제한으로 인해 그룹 멤버 자격을 쿼리할 때 오류가 발생할 수 있습니다.

  • 강제 동기화 기능 없음: 초기 동기화에는 최대 6시간이 걸릴 수 있습니다. 그 후 동기화는 15분마다 실행됩니다.

  • 관리 그룹 또는 집계 루트 수준 없음: 이 기능은 여러 구독에 사용할 수 없습니다.

  • 지원되는 유효성 검사: Active Directory/AD FS만 지원의 유효성을 검사합니다.

ID 통합 관련 문제 완화

호스트 관리자는 연결이 끊긴 작업 PowerShell cmdlet을 사용하여 설정을 업데이트하고 문제를 해결합니다. ID 설정을 다시 구성해야 하는 몇 가지 시나리오는 다음과 같습니다.

  • 동기화가 실패했거나 시작되지 않았습니다.

    • LDAP 자격 증명이 유효한지 확인합니다.
    • LDAP 자격 증명에 읽기 권한이 있는지 확인합니다.
    • 연결이 끊긴 작업이 LDAP 서버에 연결할 수 있는지 확인하고, FQDN(IP 주소를 사용하지 않는 경우)을 확인하고, 방화벽이 트래픽을 차단하지 않는지 확인합니다.
  • 동기화된 잘못된 그룹 집합:

    • 올바른 SyncGroupIdentifier 루트로 설정되어 있는지 확인합니다. 동기화 중인 항목입니다.
  • 운영자 구독에 대한 액세스 손실:

    • 운영자에 대한 액세스를 복원하려면 rootOperatorUserPrincipalName을(를) 변경하십시오.

ID 통합을 위한 Cmdlet

호스트 관리자는 연결이 끊긴 작업 모듈 및 설치 인증서를 사용하여 설정을 변경하고 ID 통합 문제를 해결하는 데 도움이 되는 cmdlet을 실행합니다. ID 통합에 사용할 수 있는 cmdlet을 나열하려면 실행 Get-Command ApplianceExternalIdentity 합니다.

ID 구성 테스트

이 cmdlet을 사용하여 클라이언트 쪽에서 ID 구성의 유효성을 신속하게 검사합니다.

$idpConfig = new-applianceIdentityConfiguration @identityParams

Test-ApplianceExternalIdentityConfiguration -config $idpConfig

ID 구성 테스트(심층 유효성 검사)

이 cmdlet을 사용하여 구성을 적용하기 전에 매개 변수 및 설정의 유효성을 검사합니다.

$idpConfig = new-applianceIdentityConfiguration @identityParams

Test-ApplianceExternalIdentityConfigurationDeep -config $idpConfig

ID 설정 또는 재설정

이 cmdlet을 사용하여 운영자 구독을 다시 설정합니다. ID 통합에 문제가 있는 경우에만 이 cmdlet을 사용합니다.

Set-ApplianceExternalIdentityConfiguration

ID 관리

이 cmdlet을 사용하여 ID 구성을 설정하고 문제를 해결하는 데 도움이 되는 모든 cmdlet을 나열합니다.

Get-Command *Appliance*ExternalIdentity*

부록

이러한 명령에는 Windows Server 2022 이상에서 PowerShell을 사용합니다.

데모를 위해 Active Directory 또는 ADDS(Active Directory Domain Services) 설정

# Modify to fit your domain/installation
$GSMAAccount = 'Local\gmsa_adfs$'

Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools

# Import the ADDSDeployement module
Import-Module ADDSDeployment

# Install the AD FS role
Install-WindowsFeature ADFS-Federation -IncludeManagementTools

# Promote the server to a domain controller
Install-ADDSForest `
    -DomainName "local.contoso.com" `
    -DomainNetbiosName "local" ` #NETBIOS 15 char limit
    -SafeModeAdministratorPassword (ConvertTo-SecureString "" -AsPlainText -Force) `
    -InstallDns

# Test only
Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10))
$cert = New-SelfSignedCertificate -DnsName "adfs.local.contoso.com" 

# Import the AD FS module and configure AD FS
Import-Module ADFS

# Install AD FS
Install-AdfsFarm `
    -CertificateThumbprint "$($cert.Thumbprint)" `
    -FederationServiceName "adfs.local.contoso.com" `
    -FederationServiceDisplayName "Local Contoso ADFS" `
    -GroupServiceAccountIdentifier $GSMAAccount

AD FS 클라이언트 앱, 샘플 사용자 및 그룹 만들기

# ClientID can be any unique id in your organization - hardcoded GUID here just as example
Add-AdfsClient `
    -Name "Azure Local Disconnected operations Sign In Service" `
    -ClientId "11112222-bbbb-3333-cccc-4444dddd5555" `
    -RedirectUri "https://login.autonomous.cloud.private/signin-oidc"

# Import the Active Directory module
Import-Module ActiveDirectory

# Create new Active Directory users
$users = @('operator', 'ldap', 'user1', 'user2', 'user3')
$users | % {Remove-ADUser $_ -Confirm:$false -ErrorAction SilentlyContinue }

$users | % {New-ADUser `
    -Name "AzureLocal User $_" `
    -GivenName "AzureLocal" `
    -Surname "User $_" `
    -SamAccountName $_ `
    -UserPrincipalName "$_@Local.contoso.com" `
    -Path "CN=Users,DC=local,DC=contoso,DC=com" `
    -AccountPassword (ConvertTo-SecureString "" -AsPlainText -Force) `
    -Enabled $true
 }

# Create a new Active Directory group
New-ADGroup `
    -Name "AzureLocal Users" `
    -GroupScope Universal `
    -Path "CN=Users,DC=local,DC=contoso,DC=com"

# Add the user to the group
Add-ADGroupMember `
    -Identity "AzureLocal Users" `
    -Members $users

# Create AD FS sync group and add the operator to it
# Variables
$groupName = "ADFS_Sync_Group"
$ouPath = "CN=Users,DC=local,DC=contoso,DC=com"
$users = @("operator")

# Create the group
New-ADGroup -Name $groupName `
            -SamAccountName $groupName `
            -GroupScope Universal `
            -GroupCategory Security `
            -Path $ouPath `
            -Description "Sync group for ADFS purposes"

# Add members to the group
foreach ($user in $users) {
    Add-ADGroupMember -Identity $groupName -Members $user
}

# Retrieve the group's ObjectGUID
$group = Get-ADGroup -Identity $groupName | Select-Object Name, ObjectGUID

# Display the syncGroupIdentifier (ObjectGUID), which is required by the IDP script run from the host
$group

상속 옵션을 사용하여 사용자에게 LDAP 사용자 읽기 권한 부여

다음 예제에서는 설정을 사용하여 사용자 컨테이너에서 LDAP 사용자에게 읽기 권한을 부여합니다 ActiveDirectorySecurityInheritance "All" . "All"을 사용하여 액세스 규칙을 할당하면 규칙이 대상 개체의 전체 하위 트리에 적용됩니다.

$domain = Get-ADDomain
$identity = [System.Security.Principal.NTAccount]"$($domain.Name)\ldap"
$accessRule = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($identity,  [System.DirectoryServices.ActiveDirectoryRights] "GenericRead",    [System.Security.AccessControl.AccessControlType] "Allow",    [System.DirectoryServices.ActiveDirectorySecurityInheritance] "All")
$acl = Get-Acl -Path "AD:\CN=Users,$($domain.DistinguishedName)"
$acl.AddAccessRule($accessRule)
Set-ACL -Path "AD:\CN=Users,$($domain.DistinguishedName)" -AclObject $acl
Write-Verbose "Granted 'GenericRead' permissions to LDAP account."

GSMA 계정에 사용자 속성을 읽을 수 있는 권한 부여

다음 예제에서는 GSMA 계정이 동기화 그룹에서 Active Directory의 사용자 속성을 읽을 수 있도록 하는 방법을 보여 줍니다.

# GroupName and GSMAccount defined earlier

# Get group details
$Group = Get-ADGroup -Identity $GroupName
$GroupDN = $Group.DistinguishedName

# Build the access rule
$Identity = New-Object System.Security.Principal.NTAccount($GSMAAccount)
$ActiveDirectoryRights = [System.DirectoryServices.ActiveDirectoryRights]::ReadProperty
$AccessControlType = [System.Security.AccessControl.AccessControlType]::Allow
$InheritanceType = [System.DirectoryServices.ActiveDirectorySecurityInheritance]::All

# Create the access rule and apply it to the group
# bf9679c0-0de6-11d0-a285-00aa003049e2 (Member attribute): https://learn.microsoft.com/en-us/windows/win32/adschema/a-member?redirectedfrom=MSDN 
$Rule = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $Identity, $ActiveDirectoryRights, $AccessControlType, "bf9679c0-0de6-11d0-a285-00aa003049e2", $InheritanceType
$GroupEntry = [ADSI]"LDAP://$GroupDN"
$Security = $GroupEntry.ObjectSecurity
$Security.AddAccessRule($Rule)
$GroupEntry.CommitChanges()

비고

ADFS 팜의 GSMA 계정이 사용자 속성을 읽을 수 없는 경우 ADFS 로그인 페이지에 입력된 자격 증명이 올바른 경우에도 로그인이 실패합니다.

ADFS 기능 확인 및 테스트

IDPInitiated Signon 테스트 페이지를 사용하도록 설정하려면 다음 단계를 수행합니다.

  1. 로그인 테스트 페이지를 사용하도록 설정합니다. 다음 명령을 실행합니다.

     Set-AdfsProperties -EnableIdpInitiatedSignonPage $true
    
  2. IdpInitiatedSignon(https://adfs.FDQN/adfs/ls/IdpInitiatedSignon.aspx)으로 이동하여 FQDN을 실제 도메인 이름으로 바꿉니다.

    도메인 이름을 사용하는 예제는 다음과 같습니다.

    https://adfs.MYFQDN/adfs/ls/IdpInitiatedSignon.aspx

  3. 운영자 계정을 사용하여 로그인하여 ADFS 기능을 확인합니다.

이 기능은 Azure 로컬 2602 이상에서만 사용할 수 있습니다.