Active Directory Site 설정을 도메인에 조인된 Client에서 확인하는 방법

4분 분량
콘텐츠 수준: 중급
0

도메인 컨트롤러가 여러대 이고 이중 일부 도메인 컨트롤러만 Port를 허용한 경우 아래의 방법을 통해 사이트 설정이 되어있는지 확인할수 있습니다.

AWS환경에서 Active Directory Service는 Amazon FSx for Windows File Server,Amazon FSx for NetApp ONTAP, WorkSpaces, AppStream 2.0 등의 서비스에서 인증용도로 사용됩니다. 그리고 이러한 AD와의 연결성에 문제가 있을 경우 아래와 같이 일부 서비스의 공식문서에서는 AD와의 검증을 테스트 하기 위해 서비스를 하려고 하는 서브넷이 인스턴스를 생성하고 AD에 조인한뒤 테스트를 통해 AD와의 연결성을 검증하고 있습니다.

[+] Validating your Active Directory configuration https://docs.aws.amazon.com/fsx/latest/WindowsGuide/validate-ad-config.html

[+] AD 커넥터 테스트 https://docs.aws.amazon.com/ko_kr/directoryservice/latest/admin-guide/ad_connector_getting_started.html#connect_verification

하지만 인스턴스가 정상적으로 조인이 되었다고 하더라도 AD의 도메인 컨트롤러가 여러대 이고 일부 도메인 컨트롤러 에서만 필요한 Port가 열려있을 경우, 위의 테스트를 통해서도 AD와의 검증을 제대로 할수 없는 경우가 있을 수 있습니다. 이는 도메인명으로 여러대 도메인 컨트롤러와 검증을 시도하기에 Port가 열려있지 않는 도메인 컨트롤러와 연결만 시도하다 Timeout이 발생하여 검증테스트가 중단 될수 있기 때문입니다.

따라서 이러한 상황일때는 아래와 같이 Active Directory Site and Service 에서 Site의 설정 확인이 필요합니다.

Enter image description here

하지만 AD에 접근권한이 없어 확인이 어려울 경 우 Client 단에서 아래와 같이 확인이 가능합니다. 그리고 도메인에 가입한 Client 에서 자기 자신이 속한 Site 가 알고 싶으면 아래와 같은 DsGetSiteName.ps1 스크립트를 구동하여 확인이 가능합니다. (단, 스크립트를 실행하는 도메인 계정이 GetComputerSite 를 호출할 권한이 있어야 하고 없을 시 맨 아래줄을 삭제 후 구동해 주시기 바랍니다.)

$code = @"
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static class NetApi32 {
    private class unmanaged {
        [DllImport("NetApi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
        internal static extern UInt32 DsGetSiteName([MarshalAs(UnmanagedType.LPTStr)]string ComputerName, out IntPtr SiteNameBuffer);

        [DllImport("Netapi32.dll", SetLastError=true)]
        internal static extern int NetApiBufferFree(IntPtr Buffer);
    }

    public static string DsGetSiteName(string ComputerName) {
        IntPtr siteNameBuffer = IntPtr.Zero;
        UInt32 hResult = unmanaged.DsGetSiteName(ComputerName, out siteNameBuffer);
        string siteName = Marshal.PtrToStringAuto(siteNameBuffer);
        unmanaged.NetApiBufferFree(siteNameBuffer);
        if(hResult == 0x6ba) { throw new Exception("ComputerName not found"); }
        return siteName;
    }
}
"@

Add-Type -TypeDefinition $code

$value = hostname
[NetApi32]::DsGetSiteName("$value")
[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite()

위 스크립트를 .ps1 파일로 저장 후 수행을 하면 아래와 같이 출력됩니다. 이 Client는 100.0.137. 의 IP를 가지고 있어 Subnet 대역대가 100.0.0.0/16에 해당되어 Site는 Test 라는 사이트를 바라보고 있음을 확인 할수 있습니다.

Enter image description here

그리고 [NetApi32]::DsGetSiteName("$value") 에서 "$value"를 AD에 조인한 다른 컴퓨터 이름으로 변경하면 그 컴퓨터가 어디 사이트에 속해 있는지도 알 수 있습니다. 아래는 EC2 인스턴스 환경에서 2개의 VPC에 각각 AD를 설치하고 이중화 한뒤 각기 다르게 사이트 설정을 한 후 위의 스크립트를 구동한 결과 입니다.

테스트 환경은 아래와 같이 A VPC와 B VPC를 peering 설정 하고 각 VPC에서 AD를 설치하고 도메인컨틀로러 이중화를 진행하였습니다. 그리고 Site 설정 전 AD에 가입 후 위의 스크립트를 구동해 보았으며 이후 Site설정 후 Client에서 위의 스크립트를 구동 시 제대로 된 Site 설정을 불러오는지를 테스트 하였습니다.

A VPC : 172.31.0.0/16 B VPC : 100.0.0.0/16

A AD: 172.31.33.- B AD: 100.0.137.-

A Client: 172.31.38.- B Client: 100.0.141.-

A Client는 아래와 같이 IP가 172.31.38.- 으로 Default-First-Site-Name의 Subnet인 172.31.0.0/16에 해당되어 Default-First-Site Name으로 출력됨이 확인됩니다. Enter image description here

B Client: 아래와 같이 IP 가 100.0.141.- 으로 TEST 의 Subnet인 100.0.0.0/16에 해당되어 TEST로 출력됨이 확인됩니다.

Enter image description here

이 밖에 만약 Site 설정이 되어 있지 않은 경우 아래와 같이 기본 Default-First-Site-Name 이 출력됨을 확인하였습니다.

Enter image description here

따라서 특정 도메인 컨트롤러와 TCP Port와 UDP Port 연결 테스트에서 모두 성공적으로 연결이 됨을 확인했음에도 FSx 파일서버 나 WorkSpaces 그리고 AppStream에서 도메인 조인에 지속적으로 실패한다면 서비스가 생성되는 서브넷 대역에서 인스턴스를 생성 후 수동으로 AD에 조인한 뒤 사이트 설정이 제대로 되어 있는지 반드시 확인이 필요합니다.

그리고 아래와 같이 사이트 설정은 다른 명령어로도 확인이 가능합니다.

  • nltest /dsgetdc: 도메인명
  • Get-ADReplicationSubnet -Filter * | select name, site

다만 아래와 같이 위의 명령어 수행시 아래와 같은 오류가 발생할수 있으며, 이때 위의 스크립트를 활용을 해볼수 있습니다.

PS C:\>  Get-ADReplicationSubnet -Filter * | select name, site
Get-ADReplicationSubnet : 'Get-ADReplicationSubnet' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이
름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음 다시 시도하십시오.
위치 줄:1 문자:2
 Get-ADReplicationSubnet -Filter * | select name, site
 ~~~~~~~~~~~~~~~~~~~~~~~
 CategoryInfo          : ObjectNotFound: (Get-ADReplicationSubnet:String) [], CommandNotFoundException
FullyQualifiedErrorId : CommandNotFoundException


PS C:\> nltest /dsgetdc: 도메인명
DC 이름을 가져오지 못했습니다. 

그리고 [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite() 명령어 수행 시 AdjacentSites 라는 인접한 사이트 주소도 표기됩니다. 사이트 내의 AD가 모두 통신이 안되는 경우를 산정해서 반드시 인전합 2개의 사이트의 도메인컨트롤러와도 통신이 되게 설정 하시기를 권장드립니다.

여기에 이미지 설명 입력

댓글 없음