===== Смена пароля сервисной учетной записи 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~~