Windows, 특히 Active Directory를 사용하는 환경에서 시간 동기화는 매우 중요한 작업이다. 도메인 컨트롤러와 클라이언트 간의 시간이 일치하지 않으면 KERBEROS/NTLM 인증에 실패할 수 있고, DC와 클라이언트 사이의 동기화가 끊어질 수 있다.
AD 환경에서 w32tm
을 구성하기 위한 가이드는 많이 있지만, 해당 설정들이 실제로 어떠한 영향을 미치는지, 트러블슈팅과 디버깅을 위해서는 어떤 방법들을 사용할 수 있는지 설명하는 문서는 거의 없어 이번 포스트를 작성하게 되었다.
일부 명령어는 관리자 권한을 요구하기 때문에, 명령 프롬프트를 관리자 권한으로 실행하는 것이 바람직하다.
w32tm
의 설정 옵션에는 서버 옵션과 클라이언트 옵션이 혼재되어 있기 때문에, 개별 설정을 Server/Client
로 구분하였다.
기본 형식: w32tm [/명령어]
/config
: w32tm의 설정을 변경한다./reliable
: [yes|no] 자신을 신뢰할 수 있는 시간 소스로 설정한다 (Server)/syncfromflag
: [NO|DOMHIER|MANUAL] 동기화 대상을 지정한다 (Client)/manualpeerlist
: 동기화 할 NTP 서버를 지정한다. <NTP 서버 주소>,<플래그>
꼴로 구성되며, 여러 개의 서버를 구성할 경우 쌍따옴표("")로 감싸고, 띄어쓰기로 구분한다. (Client)/update
: 설정 변경을 즉시 반영한다./resync
: 시스템 시간을 다시 동기화한다./rediscover
: 네트워크 구성을 다시 확인하고 동기화한다./nowait
: 재동기화 과정을 기다리지 않고 즉시 return 한다./monitor
: w32tm의 현재 상태를 확인한다./query
: w32tm의 상태와 구성을 확인한다./source
: 현재 동기화 중인 시간 소스를 출력한다./peers
: 시간 동기화 대상 피어를 출력한다./configuration
: w32tm의 현재 구성 정보를 출력한다./verbose
: 다른 명령어와 함께 사용할 경우, 더 많은 정보를 출력한다.일반적으로 도메인 컨트롤러와 클라이언트 사이의 시간이 어긋나는 것이 가장 큰 문제가 되기 때문에, 특별한 요구사항이 있지 않은 이상은 도메인 컨트롤러는 외부의 타임 서버를 바라보고, 클라이언트는 도메인 서버를 바라보게 하는 것이 바람직하다.
따라서, 다음과 같이 w32tm
을 구성한다.
# 구성 초기화
w32tm /unregister
w32tm /register
net start w32time
# NTP 서버와의 시간 동기화 설정
w32tm /config /manualpeerlist:yourNTPserver,0x8 /syncfromflags:manual /reliable:yes /update
w32tm /resync /rediscover
# 구성 초기화
w32tm /unregister
w32tm /register
net start w32time
# 도메인 컨트롤러와의 동기화 설정
w32tm /config /syncfromflags:DOMHIER /update
w32tm /resync /nowait
도메인 컨트롤러의 그룹 정책 구성은 Default Domain Controllers Policy
에 설정해야 한다. 만약 자체적인 도메인 컨트롤러 정책이 존재한다면, 해당 정책에 구성을 반영한다.
Active Directory Group Policy를 통한 구성은 Computer > Policies > Administrative Templates > System > Windows Time Service
에서 설정할 수 있다.
Group Policy에서 사용하는 용어와 w32tm
명령어의 용어가 다르기 때문에, 설정 시 약간의 주의가 필요하다.
manualpeerlist
와 같은 형식으로 입력. 단, 여러 서버를 지정할 때 띄어쓰기만 필요하며, 쌍따옴표는 필요하지 않음w32tm
의 syncfromflags:MANUAL
과 동일)클라이언트의 정책은 Default Domain Policy
를 이용해 구성한다.
w32tm
의 syncfromflags:DOMHIER
과 동일)시간 동기화가 정상적으로 이루어지는지 확인하기 위해서 다음 명령어들을 사용할 수 있다.
# 동기화 상태 확인
w32tm /query /status
# AD 구성요소 모니터링
w32tm /monitor
# 현재 동기화 중인 타임 소스 확인
w32tm /query /source
# 동기화 대상 NTP Peer 확인
w32tm /query /peers
w32time
을 통한 시간 동기화가 제대로 이루어지지 않는 경우에는 w32tm
명령어를 통해 트러블슈팅에 필요한 정보들을 수집할 수 있다.
w32tm /monitor
명령어를 통해, 현재 w32tm
이 어떤 서버와 동기화를 진행하고 있는지, 기준 시계가 무엇인지 확인한다. 만약 RefID
가 'LOCL'
이라면, 서버와 시간이 동기화되지 않고 있는 것이다.
w32tm /query /source
명령어를 통해 보다 자세한 정보를 확인할 수 있으며, 로컬 시계를 사용 중일 경우 Local CMOS Clock
과 같은 출력을 볼 수 있을 것이다.
그 다음으로는, w32tm /query /configuration /verbose
명령어를 통해 현재 w32tm
의 구성 정보를 확인한다.
로컬 구성의 경우, 레지스트리의 HKLM\System\CurrentControlSet\Services\w32time\
에서도 확인할 수 있다.
이 명령어의 경우 현재 적용된 설정이 로컬에서 구성된 것인지, 그룹 정책으로 구성된 것인지를 보여주기 때문에 트러블슈팅 시 아주 유용하다.
구성에 문제가 없다면, NTP 서버와의 연결 테스트를 진행할 수 있다.
w32tm /stripchart /packetinfo /samples:5 /computer:<yourNTPserver>
만약 NTP 서버와의 통신이 실패한다면, DNS 조회 및 윈도우 방화벽과 네트워크 방화벽의 구성을 점검해 봐야 한다.
보다 자세한 원인 분석이 필요하다면, w32tm
의 디버그 로깅 옵션을 활용할 수 있다.
# 디버깅 로그 기록 시작
w32tm /debug /enable /file:C:\Windows\debug\w32tm.log /size:100000000 /entries:300
# 디버깅 로그 기록 종료
w32tm /debug /disable
디버그 모드를 활성화 한 상태로 w32tm /resync
등의 명령어를 실행하여 에러에 대한 보다 자세한 정보를 수집할 수 있다.
Microsoft에서는 배터리 방전 후 재시작 된 시스템들이 신뢰할 수 있는 시간 정보를 얻을 수 있는 방법으로, TLS 핸드쉐이크 중 수신하는 타임스탬프를 사용하기로 했습니다.
문제는 이 타임스탬프 값이 TLS 1.2부터는 랜덤한 값으로 기록된다는 점입니다. 이 MS는 이미 이 문제를 알고 있었으며, 이러한 이슈에 대응하기 위한 휴리스틱 알고리즘을 내장했으나, 모든 문제를 해결하지는 못했습니다.
이 문제를 보고하는 다수의 사용자 리포트가 있으며, 한 MS 개발자는 비공식적으로 이 기능을 비활성화 할 것을 권고하기도 했습니다.
AD 환경에서 이 기능을 비활성화하려면, System - Windodws Time Service - Global Configuration Settings
에서 UtilizeSslTimeData
를 0으로 설정하면 됩니다.
기본값은 1 (활성화) 이며, Windows Server 2016 이상과 Windows 10/11 에서 기본적으로 활성화 되어 있습니다.
2025년 4월 26일 부로, Microsoft는 Windows Server 2016 이상의 시스템에서 Secure Time Seeding을 비활성화 할 것을 권고하였습니다.
Windows Server 2025에서는 STS가 기본적으로 비활성화 됩니다.