===== Смена пароля сервисной учетной записи krbtgt в Active Directory ===== {{:microsoft-windows:windows-server-2012-r2:adds:pasted:20180818-100844.png }} Специальная сервисная учетная запись пользователя **krbtgt** в домене в **Active Directory** имеет **RID 502** и создается в контейнере **Users** при развёртывании первого контроллера домена. Эта учетная запись отключена и состоит только в двух группах AD: **Domain Users** и **Denied RODC Password Replication Group**. Администраторам запрещено изменять имя этой учётной записи или включать её. Хэш пароля учётной записи **krbtgt** не хранится на контроллерах домена **RODC** (Read-Only Domain Controller), у каждого RODC имеется собственный аккаунт вида **krbtgt_***. На каждом контроллере домена запущена служба **KDC** (Kerberos Distribution Center), которая обрабатывает все запросы на получение билетов **Kerberos**. Пароль учетной записи **krbtgt** используется для создания секретного ключа, с помощью которого выполняется шифрование билетов **TGT** (Ticket-Granting Ticket) на всех **KDC** в домене. \\ ==== Вопрос безопасности ==== Захват хеша пароля **krbtgt** (например, с помощью утилиты **mimikatz**) позволяет злоумышленнику, минуя KDC, создать поддельный билет TGT - **Golden Ticket**, который, в свою очередь, позволяет аутентифицироваться от имени любой учётной записи на любом доменном сервисе, использующем аутентификацию Kerberos. В качестве защиты от атаки Golden Ticket рекомендуется периодическая (раз в год и при увольнении любого администратора домена) __смена пароля **krbtgt**__, так как сброс пароля krbtgt делает недействительными ранее выпущенные билеты Golden Ticket. Менять пароль нужно дважды (с задержкой, достаточной для выполнения репликации во всем домене), так как в домене хранится текущий и предыдущий пароль. Информацию об учётной записи **krbtgt** и дате последней смены её пароля можно получить с помощью **PowerShell**: Get-AdUser krbtgt -property created, passwordlastset, enabled {{ :microsoft-windows:windows-server-2016:adds:pasted:20250316-100117.png }} \\ ==== Первая смена пароля ==== Пароль пользователя **krbtgt** можно изменить через оснастку **ADUC**, как обычному пользователю. Рекомендуется использовать стойкий к переборам сложный пароль, но, при этом [[https://learn.microsoft.com/ru-ru/windows-server/identity/ad-ds/manage/forest-recovery-guide/ad-forest-recovery-reset-the-krbtgt-password|есть информация]], что указанный пароль не имеет значения, так как система автоматически создаёт надёжный пароль независимо от указанного пароля. {{ :microsoft-windows:windows-server-2016:adds:pasted:20250316-100938.png }} Через пару минут после первой смены пароля проверяем состояние репликации учётной записи **krbtgt** на каждый контроллер домена: Get-ADDomainController -Filter * -Server $((Get-ADDomain).DNSRoot) | ` Foreach-Object { Get-AdUser krbtgt -property passwordlastset -server $_ | ` Select -Property Name,PasswordLastSet } Следует убедиться в том, что на всех контроллерах домена дата последней смены пароля свежая, то есть репликация атрибутов учётной записи прошла успешно. {{ :microsoft-windows:windows-server-2016:adds:pasted:20250316-101819.png }} При смене пароля **krbtgt** в некоторых случаях при задержках репликации могут наблюдаться проблемы некоторых доменных служб, поэтому после смены пароля рекомендуется выполнить перезапуск службы **KDC** (Kerberos Key Distribution Center) на всех контроллерах домена: Get-ADDomainController -Filter * -Server $((Get-ADDomain).DNSRoot) | ` Foreach-Object { Write-Host $_.Name; Get-Service KDC -ComputerName $_ | ` Restart-Service -Verbose } {{ :microsoft-windows:windows-server-2016:adds:pasted:20250316-102810.png }} После этого проверяем статус службы **KDC** на всех контроллерах, чтобы убедиться, что она работает: Get-ADDomainController -Filter * -Server $((Get-ADDomain).DNSRoot) | ` Foreach-Object { Get-Service KDC -ComputerName $_ | Select Machinename,Name,Status } {{ :microsoft-windows:windows-server-2016:adds:pasted:20250316-103536.png }} \\ ==== Вторая смена пароля ==== Для выполнения второго сброса пароля учетной записи **krbtgt** требуется период ожидания в течение **10 часов** после первого сброса. Важно понимать, что если не выдержать между первой и второй сменой пароля указанный интервал времени, то у компьютеров, пользователей и служб, использующих аутентификацию Kerberos, могут начаться проблемы с аутентификацией. 10 часов - это значение по умолчанию для доменных политик **[[https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/security-policy-settings/maximum-lifetime-for-user-ticket|Maximum lifetime for user ticket]]** и **[[https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/security-policy-settings/maximum-lifetime-for-service-ticket |Maximum lifetime for service ticket]]**. В случае, если в домене эти политики менялись с бОльшую сторону, то минимальный период ожидания между сбросами должен быть больше настроенного в политиках значения. Приведём простой пример запроса PowerShell к дефолтной групповой доменной политике "Default Domain Policy", чтобы выяснить значения для политик "Maximum lifetime for user ticket" (возвращаемое значение в часах) и "Maximum lifetime for service ticket" (возвращаемое значение в минутах). Следует иметь ввиду, что обозначенные параметры GPO могут быть изменены в домене не только в дефолтной политике, но и в других политиках и тогда подобный запрос следует делать для соответствующих политик. # Default Domain Policy GUID : 31B2F340-016D-11D2-945F-00C04FB984F9 $domainName = (Get-ADDomain -ErrorAction Stop).DNSRoot [xml]$gpo = Get-GPOReport -Guid '{31B2F340-016D-11D2-945F-00C04FB984F9}' ` -ReportType Xml -ErrorAction Stop -Domain $domainName (($gpo.gpo.Computer.ExtensionData | ` Where-Object { $_.name -eq 'Security' }).Extension.ChildNodes | ` Where-Object { $_.Name -eq 'MaxTicketAge' }).SettingNumber (($gpo.gpo.Computer.ExtensionData | ` Where-Object { $_.name -eq 'Security' }).Extension.ChildNodes | ` Where-Object { $_.Name -eq 'MaxServiceAge' }).SettingNumber Другой простой способ проверки того, на какой срок выдаются билеты TGT- выполнить команду **klist tgt** и посмотреть значения StartTime и EndTime для кешированного билета TGT текущего пользователя. {{ :microsoft-windows:windows-server-2016:adds:pasted:20250316-105331.png }} После второй смены пароля учетной записи **krbtgt** в **Active Directory** процедура может считаться законченной. \\ ---- Проверено на следующих конфигурациях: ^ Версия ОС ^ | Windows Server 2016 Standard EN (10.0.14393) | ---- {{:user:blogroot.png?50&nolink |}} Автор первичной редакции:\\ [[user:blogroot|Алексей Максимов]] \\ Время публикации: 16.03.2025 09:28 {{tag>Microsoft "Windows Server" "Windows Server 2016" ADDS "Active Directory" Kerberos Security TGT "Golden Ticket" KrbTGT KDC PowerShell GPO}} ~~DISCUSSION~~