VM이 도메인에 자동 조인되도록 Active Directory 구성

Last reviewed 2024-10-31 UTC

이 문서는 Windows 가상 머신(VM) 인스턴스가 Active Directory 도메인에 자동 조인되도록 Active Directory 및 Compute Engine을 구성하는 방법을 보여줍니다.

Windows VM을 Active Directory에 연결하는 과정을 자동화하면 Windows 서버 프로비저닝 과정을 단순화하는 데 도움이 됩니다. 이 접근 방식을 사용하면 Active Directory를 사용하여 액세스 및 구성을 관리할 때의 이점을 놓치지 않고도 자동 확장을 활용할 수 있습니다.

이 문서는 시스템 관리자를 대상으로 하며 Active Directory 및 Google Cloud Networking에 익숙하다고 가정합니다.

이 문서의 절차에 따라 만드는 구성은 Google Cloud에서 Windows Server로 수행하는 추가 작업의 기초가 될 수 있습니다. 예를 들어 이 절차를 완료하면 Windows 컨테이너에서 Windows 인증을 사용해 ASP.NET 애플리케이션을 배포할 수 있습니다.

관리형 Microsoft AD를 사용 중이고 비활성 컴퓨터 계정을 자동으로 삭제할 필요가 없는 경우 자동 도메인 조인 기능을 사용하여 Windows VM에 가입하는 것이 좋습니다. 자세한 내용은 도메인에 Windows VM 자동 가입을 참조하세요.

목표

  • 선택한 프로젝트에서 VM 인스턴스가 Active Directory 도메인에 자동으로 연결되도록 Cloud Run 앱을 배포합니다.
  • Active Directory 도메인에서 오래된 컴퓨터 계정을 주기적으로 스캔하고 이를 삭제하는 Cloud Scheduler 작업을 만듭니다.
  • 도메인에 조인된 VM 인스턴스의 자동 확장된 관리형 인스턴스 그룹(MIG)을 만들어 설정을 테스트합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

이 문서의 안내는 리소스 사용량을 Google Cloud의 항상 무료 등급 한도 내에서 유지하도록 작성되었습니다. 프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

이 문서에서는 Microsoft Active Directory용 관리형 서비스(관리형 Microsoft AD)를 사용하거나 Google Cloud에 자체 관리형 도메인 컨트롤러를 배포하여 Active Directory를 Google Cloud에 이미 배포했다고 가정합니다.

절차를 완료하려면 다음 항목이 있어야 합니다.

  • 사용자, 그룹, 조직 단위(OU)를 만드는 기능을 포함한 Active Directory 도메인에 대한 관리 액세스
  • Active Directory 도메인 컨트롤러가 배포된 VPC에 사용되지 않은 /28 CIDR IP 범위. 이 IP 범위를 사용하여 서버리스 VPC 액세스를 구성합니다.
  • Windows 인스턴스를 배포하는 서브넷. 서브넷은 비공개 Google 액세스를 사용하도록 구성되어야 합니다.

자체 관리형 도메인 컨트롤러를 사용할 때는 다음이 필요합니다.

이 접근 방식 구현하기

온프레미스 환경에서는 응답 파일(unattend.xml) 및 JoinDomain 맞춤설정을 사용하여 새 컴퓨터를 도메인에 자동으로 조인할 수 있습니다. Google Cloud에서도 동일한 프로세스를 사용할 수 있지만 몇 가지 제한사항이 있습니다.

  • 맞춤설정된 unattend.xml 파일을 사용하려면 커스텀 Compute Engine 이미지를 유지관리해야 합니다. Windows 업데이트를 사용하여 커스텀 이미지를 최신 상태로 유지하려면 지속적인 유지보수 또는 초기 작업을 통해 자동화를 설정해야 합니다. 다른 이유로 커스텀 이미지를 유지관리해야 하는 경우를 제외하고 이러한 추가 노력의 타당성이 인정되지 않을 수 있습니다.
  • 도메인 이름은 unattend.xml에 지정되어야 하기 때문에 JoinDomain 맞춤설정을 사용할 경우 이미지를 단일 Active Directory 도메인에 연결해야 합니다. 여러 Active Directory 도메인 또는 포리스트(예: 별도의 테스트 및 프로덕션 환경)를 유지관리하는 경우 도메인별로 여러 커스텀 이미지를 유지관리해야 할 수 있습니다.
  • Windows 컴퓨터를 도메인에 조인하려면 디렉터리에 컴퓨터 객체를 만들 수 있는 권한이 있는 사용자 인증 정보가 필요합니다. unattend.xml에서 JoinDomain 맞춤설정을 사용하는 경우 이 사용자 인증 정보를 unattend.xml에 일반 텍스트로 삽입해야 합니다. 이렇게 삽입된 사용자 인증 정보는 이미지를 공격자의 잠재적 타겟으로 바꿀 수 있습니다. 적절한 ID 및 액세스 관리(IAM) 권한을 설정하여 이미지에 대한 액세스를 제어할 수 있지만 커스텀 이미지에 대한 액세스를 관리하면 불필요한 복잡성이 추가됩니다.

이 문서의 접근 방식은 응답 파일을 사용하지 않으므로 특별히 준비된 이미지가 필요하지 않습니다. 대신 VM 인스턴스를 만들 때 다음 sysprep specialize scriptlet을 사용합니다.

iex((New-Object System.Net.WebClient).DownloadString('https://DOMAIN'))

이 sysprep specialize scriptlet은 다음 다이어그램이 나타내는 프로세스를 초기화합니다.

sysprep specialize scriptlet이 초기화하는 프로세스

프로세스는 다음과 같습니다.

  1. VM 인스턴스를 만들면 Windows가 처음 부팅됩니다. specialize configuration pass 동안 Windows가 sysprep specialize scriptlet을 실행합니다. specialize scriptlet은 register-computer Cloud Run 앱을 호출하고 도메인 연결 프로세스를 제어하는 PowerShell 스크립트를 다운로드합니다.
  2. Windows에서 다운로드된 PowerShell 스크립트를 호출합니다.
  3. PowerShell 스크립트는 메타데이터 서버를 호출하여 VM 인스턴스를 안전하게 식별하는 ID 토큰을 가져옵니다.
  4. 스크립트가 register-computer 앱을 다시 호출하고 인증을 위해 ID 토큰을 전달합니다.
  5. 이 앱은 ID 토큰을 검증하고 VM 인스턴스의 이름, 영역, Google Cloud 프로젝트 ID를 추출합니다.
  6. 이 앱은 지정된 프로젝트의 VM 인스턴스를 도메인에 조인하도록 Active Directory 도메인이 구성되었는지 확인합니다. 이 확인을 완료하기 위해 앱은 Active Directory 도메인 컨트롤러를 찾아 연결하여 이름이 ID 토큰의 Google Cloud 프로젝트 ID와 일치하는 조직 단위(OU)를 확인합니다. 일치하는 OU가 발견되면 프로젝트의 VM 인스턴스는 지정된 OU의 Active Directory 도메인에 조인하도록 승인됩니다.
  7. 이 앱은 VM 인스턴스의 Active Directory 연결이 허용되도록 Google Cloud가 구성되었는지 확인합니다. 이 확인을 완료하기 위해 앱은 Compute Engine API를 사용하여 VM 인스턴스에 액세스할 수 있는지 확인합니다.
  8. 모든 검사가 성공적으로 수행되면 앱이 Active Directory에서 컴퓨터 계정을 미리 스테이지합니다. 이 앱은 VM 인스턴스의 이름, 영역, ID를 컴퓨터 계정 객체에 속성으로 저장하여, VM 인스턴스와 연결될 수 있도록 합니다.
  9. 그런 다음 앱은 Kerberos set password protocol을 사용하여 컴퓨터 계정에 임의의 비밀번호를 할당합니다.
  10. 컴퓨터 이름과 비밀번호는 TLS 보안 채널을 통해 Windows 인스턴스로 반환됩니다.
  11. 미리 스테이지된 컴퓨터 계정을 사용하여 PowerShell 스크립트가 컴퓨터를 도메인에 연결합니다.
  12. specialize configuration pass가 완료되면 머신이 재부팅됩니다.

이 과정의 나머지 부분에서는 자동화된 도메인 조인을 설정하는 단계를 안내합니다.

Active Directory 도메인 준비

먼저 Active Directory 도메인을 준비합니다. 이 단계를 완료하려면 Active Directory 도메인에 대한 관리 액세스 권한을 보유한 머신이 필요합니다.

선택사항: 컴퓨터를 도메인에 조인할 수 있는 사용자 제한

컴퓨터를 도메인에 조인할 수 있는 사용자를 제한해야 할 수 있습니다. 기본적으로 기본 도메인 컨트롤러 정책의 그룹 정책 객체(GPO) 구성은 모든 인증된 사용자에게 Add workstations to domain 사용자 권한을 부여합니다. 해당 사용자 권한이 있는 사용자는 누구나 컴퓨터를 도메인에 조인할 수 있습니다. 컴퓨터를 Active Directory 도메인에 조인하는 프로세스를 자동화하는 경우 이 수준의 액세스 권한을 전체적으로 부여하는 것은 불필요한 보안 위험을 야기할 수 있습니다.

컴퓨터를 Active Directory 도메인에 조인할 수 있는 사용자를 제한하려면 기본 도메인 컨트롤러 정책 GPO의 기본 구성을 변경하세요.

  1. RDP 클라이언트를 사용하여 Active Directory 도메인에 대한 관리 액세스 권한을 보유한 머신에 로그인합니다.
  2. 그룹 정책 관리 콘솔(GPMC)을 엽니다.
  3. 포리스트 > 도메인 > domain-name > 그룹 정책 객체로 이동합니다. 여기서 domain-name은 Active Directory 도메인의 이름입니다.
  4. 기본 도메인 컨트롤러 정책을 마우스 오른쪽 버튼으로 클릭하고 편집을 클릭합니다.
  5. 그룹 정책 관리 편집기 콘솔에서 컴퓨터 구성 > 정책 > Windows 설정 > 보안 설정 > 로컬 정책 > 사용자 권한 할당으로 이동합니다.
  6. 도메인에 워크스테이션 추가를 더블클릭합니다.
  7. 속성 목록에서 인증된 사용자를 삭제합니다.
  8. 관리자가 도메인에 수동으로 조인할 수 있도록 허용하려면(선택사항) 사용자 또는 그룹 추가를 클릭한 다음 관리 그룹을 목록에 추가합니다.
  9. 확인을 클릭합니다.

이제 그룹 정책 관리 편집기 콘솔과 GPMC를 닫아도 됩니다.

디렉터리 구조 초기화

이제 모든 프로젝트별 OU에 대해 컨테이너로 작동하는 OU를 만듭니다.

  1. RDP 클라이언트를 사용하여 Active Directory 도메인에 대한 관리 액세스 권한을 보유한 머신에 로그인합니다.
  2. 관리자 권한 PowerShell 세션을 엽니다.
  3. 새 조직 단위를 만듭니다.

    $ParentOrgUnitPath = (Get-ADDomain).ComputersContainer
    $ProjectsOrgUnitPath = New-ADOrganizationalUnit `
      -Name 'Projects' `
      -Path $ParentOrgUnitPath `
      -PassThru
    

Active Directory 사용자 계정 만들기

Active Directory에 액세스하고 컴퓨터 계정을 미리 스테이지하려면 register-computer 앱에 Active Directory 사용자 계정이 필요합니다.

  1. register-computer라는 Active Directory 사용자 계정을 만들고 이 계정에 임의의 비밀번호를 할당한 다음 Projects OU에 배치합니다.

    # Generate a random password
    $Password = [Guid]::NewGuid().ToString()+"-"+[Guid]::NewGuid().ToString()
    
    # Create user
    $UpnSuffix = (Get-ADDomain).DNSRoot
    $RegisterComputerUser = New-ADUser `
        -Name "register-computer Cloud Run app" `
        -GivenName "Register" `
        -Surname "Computer" `
        -Path $ProjectsOrgUnitPath `
        -SamAccountName "register-computer" `
        -UserPrincipalName "register-computer@$UpnSuffix" `
        -AccountPassword (ConvertTo-SecureString "$Password" -AsPlainText -Force) `
        -PasswordNeverExpires $True `
        -Enabled $True `
        -PassThru
    
  2. register-computer 계정에 Projects OU 및 하위 OU에서 컴퓨터 계정 및 그룹을 관리하는 데 필요한 최소한의 권한 모음을 부여합니다.

    $AcesForContainerAndDescendents = @(
        "CCDC;Computer",               # Create/delete computers
        "CCDC;Group"                   # Create/delete users
    )
    
    $AcesForDescendents = @(
        "LC;;Computer" ,               # List child objects
        "RC;;Computer" ,               # Read security information
        "WD;;Computer" ,               # Change security information
        "WP;;Computer" ,               # Write properties
        "RP;;Computer" ,               # Read properties
        "CA;Reset Password;Computer",  # ...
        "CA;Change Password;Computer", # ...
        "WS;Validated write to service principal name;Computer",
        "WS;Validated write to DNS host name;Computer",
    
        "LC;;Group",                   # List child objects
        "RC;;Group",                   # Read security information
        "WD;;Group",                   # Change security information
        "WP;;Group",                   # Write properties
        "RP;;Group"                    # Read properties
    )
    
    $AcesForContainerAndDescendents | % { dsacls.exe $ProjectsOrgUnitPath /G "${RegisterComputerUser}:${_}" /I:T | Out-Null }
    $AcesForDescendents | % { dsacls.exe $ProjectsOrgUnitPath /G "${RegisterComputerUser}:${_}" /I:S | Out-Null }
    

    명령어를 완료하는 데 몇 분이 걸릴 수 있습니다.

  3. register-computer 계정에 DNS 레코드를 삭제할 수 있는 권한을 부여합니다.

    관리형 Microsoft AD

    Add-ADGroupMember -Identity "Cloud Service DNS Administrators" -Members ${RegisterComputerUser}
    

    자체 관리 도메인

    $DnsPartition=(Get-ADDomain).SubordinateReferences | Where-Object {$_.StartsWith('DC=DomainDnsZones')}
    $DnsContainer="DC=$((Get-ADDomain).DNSRoot),CN=MicrosoftDNS,$DnsPartition"
    
    dsacls $DnsContainer /G "${RegisterComputerUser}:SD" /I:S
    
  4. Projects OU 경로 및 register-computer Active Directory 사용자 계정의 생성된 비밀번호를 표시합니다. 나중에 필요하므로 값을 확인합니다.

    Write-Host "Password: $Password"
    Write-Host "Projects OU: $ProjectsOrgUnitPath"
    

Google Cloud 프로젝트 준비

이제 도메인 프로젝트를 구성합니다.

  • 관리형 Microsoft AD를 사용하는 경우 도메인 프로젝트는 관리형 Microsoft AD를 배포한 프로젝트입니다.
  • 자체 관리형 Active Directory를 사용하는 경우 도메인 프로젝트는 Active Directory 도메인 컨트롤러를 실행하는 프로젝트입니다. 공유 VPC에서 이 프로젝트는 VPC 호스트 프로젝트와 동일해야 합니다.

이 도메인 프로젝트를 사용하면 다음을 수행할 수 있습니다.

  • register-computer Active Directory 사용자 계정의 비밀번호가 포함된 Secret Manager 보안 비밀을 만듭니다.
  • register-computer 앱을 배포합니다.
  • 비활성 컴퓨터 계정을 삭제하도록 Cloud Scheduler를 구성합니다.

도메인 프로젝트에 대한 액세스 권한은 최소 권한 원칙에 따라 부여하는 것이 좋습니다.

Secret Manager 보안 비밀 만들기

  1. Google Cloud Console에서 Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. PowerShell을 시작합니다.

    pwsh
    
  3. 다음 변수를 초기화하여 domain-project-id을 도메인 프로젝트의 ID로 바꿉니다.

    $DomainProjectId = "domain-project-id"
    
  4. 도메인 프로젝트를 기본 프로젝트로 설정합니다.

    & gcloud config set project $DomainProjectId
    
  5. Secret Manager API를 사용 설정합니다.

    & gcloud services enable secretmanager.googleapis.com
    
  6. register-computer Active Directory 사용자 계정의 비밀번호를 입력하고 Secret Manager 보안 비밀에 저장합니다.

    $RegisterComputerCredential = (Get-Credential -Credential 'register-computer')
    
    $TempFile = New-TemporaryFile
    Set-Content $TempFile $($RegisterComputerCredential.GetNetworkCredential().Password) -NoNewLine
    
    & gcloud secrets create ad-password --data-file $TempFile
    
    Remove-Item $TempFile
    

Kerberos 및 LDAP에 액세스 권한 부여

도메인 조인을 관리하기 위해 register-computer 앱은 다음 프로토콜을 사용하여 도메인 컨트롤러에 액세스합니다.

  • LDAP (TCP/389) 또는 LDAPS (TCP/636)
  • Kerberos(UDP/88, TCP/88)
  • Kerberos 비밀번호 변경(UDP/464, TCP/464)

관리형 Microsoft AD

방화벽 규칙을 구성할 필요가 없습니다.

자체 관리 도메인

도메인 컨트롤러에 대한 액세스를 허용하는 방화벽 규칙을 만듭니다.

도메인 컨트롤러에 할당한 네트워크 태그를 기준으로 규칙을 적용하거나 서비스 계정을 사용하여 규칙을 적용할 수 있습니다.

네트워크 태그 기준

& gcloud compute firewall-rules create allow-adkrb-from-serverless-to-dc `
    --direction INGRESS `
    --action allow `
    --rules udp:88,tcp:88,tcp:389,tcp:636,udp:464,tcp:464 `
    --source-ranges $ServerlessIpRange `
    --target-tags dc-tag `
    --network $VpcName `
    --project vpc-project-id `
    --priority 10000

다음을 바꿉니다.

  • dc-tag: 도메인 컨트롤러 VM에 할당된 네트워크 태그입니다.
  • vpc-project-id: VPC가 정의된 프로젝트의 ID입니다. 공유 VPC를 사용할 경우 VPC 호스트 프로젝트를 사용합니다. 그 외에는 도메인 프로젝트의 ID를 사용합니다.

서비스 계정 기준

& gcloud compute firewall-rules create allow-adkrb-from-serverless-to-dc `
    --direction INGRESS `
    --action allow `
    --rules udp:88,tcp:88,tcp:389,tcp:636,udp:464,tcp:464 `
    --source-ranges $ServerlessIpRange `
    --target-service-accounts dc-sa `
    --network $VpcName `
    --project vpc-project-id `
    --priority 10000

다음을 바꿉니다.

  • dc-sa: 도메인 컨트롤러 VM에서 사용하는 서비스 계정의 이메일 주소입니다.
  • vpc-project-id: VPC가 정의된 프로젝트의 ID입니다. 공유 VPC를 사용할 경우 VPC 호스트 프로젝트를 사용합니다. 그 외에는 도메인 프로젝트의 ID를 사용합니다.

Cloud Run 앱 배포

이제 Cloud Build를 설정하여 register-computer 앱을 Cloud Run에 배포합니다.

  1. Cloud Shell에서 GitHub 저장소를 클론합니다.

    & git clone https://github.com/GoogleCloudPlatform/gce-automated-ad-join.git
    cd gce-automated-ad-join/ad-joining
    
  2. 다음 변수를 초기화합니다.

    $ServerlessRegion = "serverless-region"
    $VpcName = "vpc-name"
    $VpcSubnet = "subnet-name"
    $AdDomain = "dns-domain-name"
    $AdNetbiosDomain = "netbios-domain-name"
    $ProjectsOrgUnitPath = "projects-ou-distinguished-name"
    

    다음을 바꿉니다.

    • serverless-region: register-computer 앱을 배포할 리전입니다. 리전은 VM 인스턴스를 배포할 리전과 동일하지 않아도 됩니다.
    • vpc-name: Active Directory 도메인 컨트롤러가 포함된 VPC 네트워크의 이름입니다.
    • subnet-name: 직접 VPC 액세스에 사용할 vpc-name의 서브넷입니다. 서브넷은 serverless-region와 동일한 리전에 있어야 합니다.
    • dns-domain-name: Active Directory 도메인의 DNS 도메인 이름입니다.
    • netbios-domain-name: Active Directory 도메인의 NetBIOS 이름입니다.
    • projects-ou-distinguished-name: Projects OU의 고유 이름입니다.
  3. Cloud Functions 및 Cloud Build API를 사용 설정합니다.

    & gcloud services enable run.googleapis.com cloudbuild.googleapis.com
    
  4. Cloud Run 앱에 대해 register-computer-app 서비스 계정을 만듭니다.

    & gcloud iam service-accounts create register-computer-app `
      --display-name="register computer Cloud Run app"
    
  5. Cloud Build 트리거를 실행하기 위한 서비스 계정 build-service을 만듭니다.

    & gcloud iam service-accounts create build-service `
      --display-name="Cloud Build build agent"
    
  6. Cloud Run 서비스 계정이 Active Directory 비밀번호가 포함된 보안 비밀을 읽을 수 있도록 허용합니다.

    & gcloud secrets add-iam-policy-binding ad-password `
      --member "serviceAccount:register-computer-app@$DomainProjectId.iam.gserviceaccount.com" `
      --role "roles/secretmanager.secretAccessor"
    
  7. Cloud Build에 배포하기 위해 필요한 권한을 Cloud Build에 부여합니다.

    $DomainProjectNumber = (gcloud projects describe $DomainProjectId --format='value(projectNumber)')
    & gcloud iam service-accounts add-iam-policy-binding register-computer-app@$DomainProjectId.iam.gserviceaccount.com `
      --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" `
      --role "roles/iam.serviceAccountUser"
    
    & gcloud projects add-iam-policy-binding $DomainProjectId `
      --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" `
      --role roles/cloudbuild.builds.builder
    
    & gcloud projects add-iam-policy-binding $DomainProjectId `
      --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" `
      --role roles/run.admin
    
  8. cloudbuild.yaml 파일을 템플릿으로 사용하여 환경과 일치하는 커스텀 Cloud Run 빌드 구성을 만듭니다.

    $Build = (Get-Content cloudbuild.yaml)
    $Build = $Build.Replace('__SERVERLESS_REGION__', "$ServerlessRegion")
    $Build = $Build.Replace('__PROJECTS_DN__', "$ProjectsOrgUnitPath")
    $Build = $Build.Replace('__AD_DOMAIN__', "$AdDomain")
    $Build = $Build.Replace('__AD_NETBIOS_DOMAIN__', "$AdNetbiosDomain")
    $Build = $Build.Replace('__SERVICE_ACCOUNT_EMAIL__', "register-computer-app@$DomainProjectId.iam.gserviceaccount.com")
    $Build = $Build.Replace('__SERVERLESS_NETWORK__', "$VpcName")
    $Build = $Build.Replace('__SERVERLESS_SUBNET__', "$VpcSubnet")
    $Build | Set-Content .\cloudbuild.hydrated.yaml
    
  9. 앱을 빌드하고 Cloud Run에 배포합니다.

    & gcloud builds submit . `
      --config cloudbuild.hydrated.yaml `
      --substitutions _IMAGE_TAG=$(git rev-parse --short HEAD) `
      --service-account "projects/$DomainProjectId/serviceAccounts/build-service@$DomainProjectId.iam.gserviceaccount.com" `
      --default-buckets-behavior regional-user-owned-bucket
    

    배포를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

  10. Cloud Run 앱의 URL을 확인합니다.

    $RegisterUrl = (gcloud run services describe register-computer `
      --platform managed `
      --region $ServerlessRegion `
      --format=value`(status.url`))
    Write-Host $RegisterUrl
    

    URL을 확인합니다. Active Directory에 연결해야 하는 VM 인스턴스를 만들 때마다 이 URL이 필요합니다.

  11. Cloud Run 앱을 호출하여 배포가 작동했는지 확인합니다.

    Invoke-RestMethod $RegisterUrl
    

    PowerShell 스크립트가 표시됩니다. VM은 도메인 조인 단계인 specialize 단계에서 스크립트를 실행합니다.

자동 도메인 가입을 위한 프로젝트 사용 설정

VM의 프로젝트가 자동 도메인 조인에 대해 사용 설정된 경우를 제외하고 register-computer 앱에서는 VM 인스턴스를 Active Directory 도메인에 조인할 수 없습니다. 이 보안 절차는 승인되지 않은 프로젝트에 연결된 VM이 도메인에 액세스하지 못하도록 방지합니다.

자동 도메인 조인을 위해 프로젝트를 사용 설정하려면 다음 안내를 따르세요.

  • Active Directory에 Google Cloud 프로젝트 ID와 이름이 같은 OU를 만듭니다.
  • register-computer 앱에 Google Cloud 프로젝트 액세스 권한을 부여합니다.

먼저 OU를 만듭니다.

  1. RDP 클라이언트를 사용하여 Active Directory 도메인에 대한 관리 액세스 권한을 보유한 머신에 로그인합니다.
  2. Active Directory 사용자 및 컴퓨터 MMC 스냅인에서 Projects OU로 이동합니다.
  3. OU를 마우스 오른쪽 버튼으로 클릭하고 새로 만들기 > 조직 단위를 선택합니다.
  4. 새 객체 대화상자에서 VM을 배포할 Google Cloud 프로젝트의 ID를 입력합니다.
  5. 확인을 클릭합니다.

그런 후 register-computer 앱에 Google Cloud 프로젝트 액세스 권한을 부여합니다.

  1. Cloud Shell에서 PowerShell을 시작합니다.

    pwsh
    
  2. 다음 변수를 초기화합니다.

    $ProjectId = "project-id"
    $DomainProjectId = "domain-project-id"
    

    바꾸기

    • project-id를 VM을 배포할 Google Cloud 프로젝트의 ID로 바꿉니다.
    • domain-project-id를 도메인 프로젝트의 ID로 바꿉니다.
  3. register-computer-app 서비스 계정에 프로젝트에 대한 Compute Viewer 역할을 부여합니다.

    & gcloud projects add-iam-policy-binding $ProjectId `
        --member "serviceAccount:register-computer-app@$DomainProjectId.iam.gserviceaccount.com" `
        --role "roles/compute.viewer"
    

이제 프로젝트는 자동 도메인 조인을 지원할 준비가 되었습니다.

도메인 조인 테스트

이제 다음을 수행하여 설정이 올바르게 작동하는지 확인할 수 있습니다.

  • Active Directory 도메인에 자동으로 연결되는 단일 VM 인스턴스를 만듭니다.
  • Active Directory 도메인에 자동으로 연결되는 VM 인스턴스의 관리형 인스턴스 그룹을 만듭니다.

단일 VM 인스턴스 만들기 및 연결

Active Directory 도메인에 자동으로 연결되는 VM 인스턴스를 만듭니다.

  1. Cloud Shell에서 PowerShell 세션으로 돌아가고 다음 변수를 초기화합니다.

    $Region = "vpc-region-to-deploy-vm"
    $Zone = "zone-to-deploy-vm"
    $Subnet = "vpc-subnet-to-deploy-vm"
    $ServerlessRegion = "serverless-region"
    

    다음을 바꿉니다.

    • vpc-region-to-deploy-vm: VM 인스턴스를 배포할 리전입니다.
    • vpc-subnet-to-deploy-vm: VM 인스턴스를 배포할 서브넷입니다.
    • zone-to-deploy-vm: VM 인스턴스를 배포할 영역입니다.
    • serverless-region: Cloud Run 앱을 배포한 리전입니다.
  2. 기본 프로젝트 및 영역을 설정합니다.

    & gcloud config set project $ProjectId
    & gcloud config set compute/zone $Zone
    
  3. Cloud Run 앱의 URL을 다시 조회합니다.

    $RegisterUrl = (gcloud run services describe register-computer `
      --platform managed `
      --region $ServerlessRegion `
      --format value`(status.url`) `
      --project $DomainProjectId)
    
  4. VM을 도메인에 조인하는 specialize scriptlet을 전달하여 인스턴스를 만듭니다.

    공유 VPC

    $VpchostProjectId = (gcloud compute shared-vpc get-host-project $ProjectId --format=value`(name`))
    & gcloud compute instances create join-01 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --machine-type n1-standard-2 `
        --no-address `
        --subnet projects/$VpchostProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    독립형 VPC

    & gcloud compute instances create join-01 `
        --image-family=windows-2019-core `
        --image-project=windows-cloud `
        --machine-type=n1-standard-2 `
        --no-address `
        --subnet $Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    커스텀 호스트 이름을 사용하려는 경우 --hostname 매개변수를 명령어에 추가합니다.

    Windows Server 2019 이전의 Windows Server 버전을 사용하는 경우 기본적으로 TLS 1.2가 사용 중지되어, specialize scriptlet가 실패할 수 있습니다. TLS 1.2를 사용 설정하려면 다음 scriptlet을 대신 사용하세요.

    [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12;iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))
    
  5. 부팅 프로세스를 모니터링합니다.

    & gcloud compute instances tail-serial-port-output join-01
    

    약 1분 후에 머신이 Active Directory 도메인에 조인됩니다. 출력은 다음과 비슷합니다.

    Domain           : corp.example.com
    DomainController : dc-01.corp.example.com.
    OrgUnitPath      : OU=test-project-123,OU=Projects,DC=corp,DC=example,DC=com
    
    WARNING: The changes will take effect after you restart the computer
    
    Computer successfully joined to domain
    

    부팅 프로세스 관찰을 중지하려면 CTRL+C를 누르세요.

VM이 Active Directory에 조인되었는지 여부 확인

  1. RDP 클라이언트를 사용하여 Active Directory 도메인에 대한 관리 액세스 권한을 보유한 머신에 로그인합니다.
  2. Active Directory 사용자 및 컴퓨터 MMC 스냅인을 엽니다.
  3. 메뉴에 보기 > 고급 기능이 사용 설정되어 있어야 합니다.
  4. VM 인스턴스를 만든 Google Cloud 프로젝트 ID와 이름이 같은 OU로 이동합니다.
  5. join-01 계정을 더블클릭합니다.
  6. 속성 대화상자에서 특성 편집기 탭을 클릭합니다.

    컴퓨터 계정에 추가 LDAP 특성이 주석으로 표시됩니다. 이러한 특성을 사용하면 컴퓨터 객체와 Compute Engine 인스턴스 간의 연결을 추적할 수 있습니다.

    목록에 다음 LDAP 특성 및 값이 포함되어 있는지 확인합니다.

    LDAP 특성
    msDS-cloudExtensionAttribute1 Google Cloud 프로젝트 ID
    msDS-cloudExtensionAttribute2 Compute Engine 영역
    msDS-cloudExtensionAttribute3 Compute Engine 인스턴스 이름

    msDS-cloudExtensionAttribute 특성은 범용 특성으로 Active Directory 자체에서는 사용하지 않습니다.

오류 진단

VM 인스턴스가 도메인에 연결할 수 없으면 register-computer 앱의 로그를 확인합니다.

  1. Google Cloud Console에서 Cloud Run으로 이동합니다.

    Cloud Run으로 이동

  2. register-computer앱을 클릭합니다.

  3. 메뉴에서 로그를 클릭합니다.

인스턴스 삭제

VM 인스턴스가 Active Directory 도메인에 조인되었는지 확인한 후 인스턴스를 삭제합니다.

  • 인스턴스를 삭제합니다.

    & gcloud compute instances delete join-01 --quiet
    

관리형 인스턴스 그룹 만들기 및 조인

MIG의 인스턴스를 자동으로 도메인에 조인할 수 있는지도 확인할 수 있습니다.

  1. VM을 도메인에 조인하는 specialize script를 전달하여 인스턴스 템플릿을 만듭니다.

    공유 VPC

    $VpchostProjectId = (gcloud compute shared-vpc get-host-project $ProjectId --format=value`(name`))
    & gcloud compute instance-templates create ad-2019core-n1-std-2 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --no-address `
        --machine-type n1-standard-2 `
        --subnet projects/$VpchostProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    독립형 VPC

    & gcloud compute instance-templates create ad-2019core-n1-std-2 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --no-address `
        --machine-type n1-standard-2 `
        --subnet projects/$ProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    
  2. 인스턴스 템플릿을 사용하는 관리형 인스턴스 그룹을 만듭니다.

    & gcloud compute instance-groups managed create group-01 `
        --template ad-2019core-n1-std-2 `
        --size=3
    

몇 분 정도 기다린 후 Active Directory 사용자 및 컴퓨터 MMC 스냅인을 사용하여 4개의 새 객체가 Active Directory에 생성되었는지 확인합니다.

  • 관리형 인스턴스 그룹의 3개 VM 인스턴스에 해당하는 3개의 컴퓨터 계정
  • 3개의 컴퓨터 계정이 포함된 group-01이라는 1개 그룹. 그룹 관리형 서비스 계정(gMSA)을 계획하려는 경우 이 그룹을 사용하여 gMSA에 액세스 권한을 부여할 수 있습니다.

MIG의 VM 인스턴스를 Active Directory 도메인에 조인할 수 있는지 확인한 후 다음 단계에 따라 관리형 그룹 및 인스턴스 템플릿을 삭제할 수 있습니다.

  1. Cloud Shell에서 인스턴스 그룹을 삭제합니다.

    & gcloud compute instance-groups managed delete group-01 --quiet
    
  2. 인스턴스 템플릿을 삭제합니다.

    & gcloud compute instance-templates delete ad-2019core-n1-std-2 --quiet
    

비활성 컴퓨터 계정 삭제 예약

컴퓨터를 도메인에 조인하는 프로세스를 자동화하면 새 서버 설정에 필요한 노력을 줄여주며 관리형 인스턴스 그룹에서 도메인에 조인된 서버를 사용할 수 있습니다. 그러나 시간 경과에 따라 비활성 컴퓨터 계정이 도메인에 누적될 수 있습니다.

이러한 누적을 방지하려면 Active Directory 도메인을 주기적으로 스캔하여 오래된 계정과 연결된 DNS 레코드를 찾아 자동으로 삭제하도록 register-computer 앱을 설정하는 것이 좋습니다.

register-computer 앱은 컴퓨터 계정의 msDS-cloudExtensionAttribute 속성을 사용하여 비활성 컴퓨터 계정을 식별할 수 있습니다. 이러한 속성에는 프로젝트, 영역, Compute Engine에서 해당 VM 인스턴스의 인스턴스 이름이 포함됩니다. 각 컴퓨터 계정에서 앱은 해당 VM 인스턴스를 계속 사용할 수 있는지 여부를 확인할 수 있습니다. 사용할 수 없는 경우 해당 컴퓨터 계정은 비활성으로 간주되어 삭제됩니다.

컴퓨터 계정 삭제를 트리거하려면 Cloud Run 앱의 /cleanup 엔드포인트를 호출합니다. 승인되지 않은 사용자가 삭제를 트리거하지 못하도록 방지하기 위해서는 register-computer-app 서비스 계정을 사용하여 이 요청을 인증해야 합니다.

Cloud Scheduler 구성

다음 단계에서는 24시간마다 자동 삭제를 실행하도록 Cloud SchedulerPub/Sub를 설정하는 방법을 보여줍니다.

  1. Cloud Shell에서 도메인 프로젝트에 Cloud Scheduler API를 사용 설정합니다.

    & gcloud services enable cloudscheduler.googleapis.com
    
  2. AppEngineLocation을 Cloud Scheduler를 배포할 App Engine 위치로 설정합니다.

    $AppEngineLocation = "location"
    

    location을 VPC 리소스에 대해 선택한 App Engine 리전(예: us-central)으로 바꿉니다. 이 리전을 App Engine 위치로 사용할 수 없는 경우 현재 위치와 지리적으로 가까운 리전을 선택하세요. 자세한 내용은 리전 및 영역을 참조하세요.

  3. App Engine을 초기화합니다.

    & gcloud app create --region $AppEngineLocation --project $DomainProjectId
    
  4. Cloud Scheduler 작업을 만듭니다.

    & gcloud scheduler jobs create http cleanup-computer-accounts `
        --schedule "every 24 hours" `
        --uri "$RegisterUrl/cleanup" `
        --oidc-service-account-email register-computer-app@$DomainProjectId.iam.gserviceaccount.com `
        --oidc-token-audience "$RegisterUrl/" `
        --project $DomainProjectId
    

    이 작업은 24시간마다 register-computer 앱을 호출하고 인증에 register-computer-app 서비스 계정을 사용합니다.

삭제 실행

비활성 컴퓨터 계정을 삭제하기 위한 구성을 확인하려면 Cloud Scheduler 작업을 수동으로 실행하면 됩니다.

  1. Google Cloud Console에서 Cloud Scheduler로 이동합니다.

    Cloud Scheduler로 이동

  2. 생성된 cleanup-computer-accounts 작업에서 지금 실행을 클릭합니다.

    몇 초 후 결과 열에 성공이 표시되면 삭제가 성공적으로 완료되었다는 의미입니다. 몇 초 후에도 결과 열이 자동으로 업데이트되지 않으면 새로고침 버튼을 클릭하세요.

삭제되는 계정에 대한 자세한 내용은 register-computer 앱의 로그를 확인하세요.

  1. Google Cloud Console에서 Cloud Run으로 이동합니다.

    Cloud Run으로 이동

  2. register-computer앱을 클릭합니다.

  3. 메뉴에서 로그를 클릭합니다.

    로그 항목에는 도메인 조인을 테스트하는 데 사용한 VM 인스턴스의 컴퓨터 계정이 비활성 상태로 간주되어 삭제되었음이 표시됩니다.

삭제

이 문서를 다른 참조 아키텍처 및 배포의 기준으로 사용하는 경우 삭제 단계를 실행하는 경우에 관한 다른 문서를 읽어보세요.

이 문서에 사용된 Google Cloud 설정을 유지하지 않으려면 다음 안내에 따라 설정을 되돌릴 수 있습니다.

  1. Cloud Shell에서 Cloud Scheduler 작업을 삭제합니다.

    & gcloud scheduler jobs delete cleanup-computer-accounts `
      --project $DomainProjectId
    
  2. Cloud Run 앱을 삭제합니다.

    & gcloud run services delete register-computer `
      --platform managed `
      --project $DomainProjectId `
      --region $ServerlessRegion
    
  3. Secret Manager 보안 비밀을 삭제합니다.

    gcloud secrets delete ad-password --project $DomainProjectId
    
  4. LDAP 및 Kerberos 액세스에 대한 방화벽 규칙을 삭제합니다.

    gcloud compute firewall-rules delete allow-adkrb-from-serverless-to-dc --project=vpc-project-id
    

    vpc-project-id를 VPC가 정의된 프로젝트의 ID로 바꿉니다. 공유 VPC를 사용할 경우 VPC 호스트 프로젝트를 사용합니다. 그 외에는 도메인 프로젝트의 ID를 사용합니다.

Active Directory 변경사항 되돌리기

  1. RDP 클라이언트를 사용하여 Active Directory 도메인에 대한 관리 액세스 권한을 보유한 머신에 로그인합니다.
  2. Active Directory 사용자 및 컴퓨터 MMC 스냅인에서 Projects OU로 이동합니다.
  3. register-computer Active Directory 사용자 계정을 삭제합니다.
  4. 자동 도메인 조인 테스트용으로 만든 OU를 삭제합니다.

다음 단계