А АSaturday, 18 December 2021

Синхронизация времени в Active Directory.

Всем привет.

Синхронизация времени - важный и во многом достаточно критичный аспект работы Active Directory, особенно сегодня, когда широко используется взаимодействие с внешними системами и работа с сотрудниками, которые могут находиться в различных часовых поясах. Применение систем виртуализации вносит дополнительные особенности, которые также следует учитывать. Поэтому данный вопрос может оказаться не столь простым, как кажется, а синхронизация с внешним источником точного времени становится одной из актуальных задач.

Прежде всего вспомним, как происходит синхронизация времени в Active Directory. В качестве эталона времени выступает контроллер, владеющий ролью эмулятора PDC. Это FSMO-роль и эмулятором PDC может являться только один контроллер в каждом домене. С ним синхронизируют время остальные контроллеры домена. Доменные ПК и рядовые серверы сверяют часы с ближайшим контроллером домена.

Сам эмулятор PDC в качестве источника точного времени может использовать либо аппаратные часы материнской платы, либо внешний источник точного времени, при нахождении в виртуальной среде также может быть использовано время хоста виртуализации.

С приходом виртуализации все изменилось, появился еще один источник времени - время хоста виртуализации. Многие гипервизоры по умолчанию имеют включенной настройку синхронизации времени гостевых систем и при попадании в виртуальную среду контроллера может возникнуть следующая коллизия: контроллер синхронизирует время с хостом, но сам хост, являясь членом домена, в свою очередь синхронизируется с контроллером.


Еще хуже, если в виртуальную среду попадает эмулятор PDC, в силу особенностей таймера виртуальных машин, время внутри может достаточно сильно плавать, поэтому виртуальный эмулятор PDC всегда должен синхронизировать время с внешним источником, а синхронизация времени с хостом должна быть отключена, последнее касается и всех остальных виртуальных членов домена.

Давайте перейдем от теории к практике. Моделируем ситуацию когда PDC крутиться на Hyper-V. Начнем с того, что выясним кто из контроллеров является эмулятором PDC и эталоном времени для домена. Это можно сделать на любом контроллере домена командой:

 netdom query fsmo

В выводе будут показаны все хозяева операций, нас интересует только эмулятор PDC. 


Затем перейдем на указанный контроллер и узнаем источник времени для него, для этого выполните команду:

w32tm /query /source

Если в выводе вы увидите:

Local CMOS Clock

то источником времени являются аппаратные часы. Это может быть справедливо для самого сервера Hyper-V, но для сервера PDC это таже эмуляция. Это та самая коллизия, про которую писали выше.

Если в выводе вы увидите:

Free running system clock

то источником времени являются.., непонятно кто. Тут как минимум необходим перезапуск службы w32time, а возможно и ее полная перерегистрация.

Ну а если там будет:

VM IC Time Synchronization Provider

то вы имеете дело с виртуальной машиной, которая синхронизирует время с хостом, т.е. с сервером Hyper-V. Здесь уже важно как синхронизируется время самого сервера Hyper-V. Будем полагать что он является членом домена где рулит PDC.

Поэтому далее будем править настройки самого PDC. 

Настройку можно исправить в настройках виртуальной машины, отключив синхронизацию времени с хостом (смотрим выше), либо в самой системе, для этого откройте ветвь реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\VMICTimeProvider

и установите для параметра Enabled значение 0.


После данного изменения следует перезапустить Службу времени Windows (net stop w32time, net start w32time) или перезагрузить компьютер. 

Получить список всех VM с HyperV-сервера, к примеру,  srv-hyperv01, которые нуждаются в перенастройке можно так:

$Hyper = "srv-hyperv01"

$servers = Get-VM -ComputerName $Hyper | Where-Object {$_.State -eq 'Running'}

foreach ($server in $servers)

{ Get-VMIntegrationService -ComputerName $Hyper -VMName $Server.Name -Name 'Синхронизация времени' | Where-Object {($_.Enabled -eq $True)} | Select VMName,Enabled | fl }

Следующим шагом будет настройка нашего эмулятора PDC на работу с внешними источниками точного времени. Все изменения также будут вноситься через реестр. Прежде всего изменим тип сервера на NTP, для этого откроем ветку

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

и для параметра Type укажем строковое значение NTP.  Для клиентов домена лучше ставить значение NT5DS. Ежели наблюдаете проблемы, то можете начать с AllSync. А для параметра NtpServer зададим адреса серверов точного времени, после каждого из которых, через запятую укажем 0x8, если мы хотим работать как стандартный NTP-клиент или 0x1 если будем использовать собственные параметры, например:

0.ru.pool.ntp.org,0x1 1.ru.pool.ntp.org,0x1 2.ru.pool.ntp.org,0x1

После чего в

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer

Параметр Enabled установим в значение 1.

Затем перейдем в

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

и установим для параметра AnnounceFlags значение A.

Следующие параметры будут работать, только если мы при указании серверов добавили 0x1, иначе будут использоваться настройки, предлагаемые сервером. Чтобы задать период синхронизации откройте ветку

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient

и для параметра SpecialPollInterval укажите десятичное значение в секундах.

Вернемся в

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

и зададим максимальное время опережения и отставания часов, после которых синхронизация производиться не будет. Для этого используются параметры MaxPosPhaseCorrection (опережение) и MaxNegPhaseCorrection (отставание) для которых также следует задать десятичное значение в секундах. По умолчанию стоит 48 часов. Это значит, что если время на эмуляторе PDC уйдет от точного источника более чем на 48 часов в любую сторону, то синхронизация производиться не будет.

Если вы хотите, чтобы время синхронизировалось всегда, то установите в оба параметра шестнадцатеричное значение FFFFFFFF.

Выполнив настройки перезапустите Службу времени Windows, это также можно сделать в командной строке:

net stop w32time

net start w32time

После чего еще раз выполним

w32tm /query /source

и убедимся, что источником времени для эмулятора PDC является внешний сервер.


Затем выполним данную команду на рядовых контроллерах домена, в качестве источника времени там должен быть указан эмулятор PDC, и на обычных ПК, где в выводе будет присутствовать любой из контроллеров домена. Обязательно выполните контроль для виртуальных машин, чтобы быть уверенным, что они используют время домена, а не хоста виртуализации.

Правку параметров синхронизации можно выполнить и одной строкой: 

w32tm /config /manualpeerlist:"0.ru.pool.ntp.org" /syncfromflags:manual /reliable:yes /update

или через GPO:


Как лучше, смотрите по результатам работы, но обязательно проверяйте чтобы не было накладок где, к примеру, вы правите значения вручную, а следом или после ребута прибегает GPO.

Удачи.


No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное