Как и когда ktpass устанавливает соль?
Пароль пользователя и соль определяют ключи Kerberos, сгенерированные ktpass
, Я заметил что ktpass
иногда меняет соль пользователя, а иногда нет. Я смог обнаружить соль, захватив след пакета kinit
, Кажется, что соль создается на основе области Kerberos и userPrincipalName. Однако не все так просто. Если UPN позже обновляется вручную, соль не обновляется. (Я подозреваю, что ли /mapop
указанная опция может сыграть свою роль.)
- При каких обстоятельствах
ktpass
установить соль пользователя? - Как определяется соль?
- Соль хранится в AD или только в KDC?
- Есть ли простой способ узнать текущее значение соли?
- Есть ли способ вручную изменить соль?
2 ответа
- В Microsoft Windows Active Directory, которая использовала Kerberos v5 с момента ее появления в Windows 2000, команда ktpass устанавливает соль автоматически. Соль всегда используется в Kerberos v5. В Kerberos v4 соль никогда не использовалась.
- В качестве соли используется полное имя участника (включая область), например accountname/somedomain.com@SOMEDOMAIN.COM, которое затем соединяется с зашифрованным хешем пароля, чтобы обеспечить абсолютную уникальность результата в лесу AD.
- Как уже упоминалось, соль является полным основным именем (включая царство). Он хранится в файле ntds.dit, который является базой данных Active Directory. KDC запускается в процессе, порожденном kdcsvc.dll - и это относится к значениям, хранящимся в ntds.dit. Таким образом, хотя базы данных KDC и AD не являются одними и теми же в среде выполнения, они, так сказать, "объединены в одно целое". Я думаю, что когда контроллер домена отключается, все важные элементы в KDC сохраняются внутри ntds.dit. Microsoft не предоставляет точных сведений о том, как это делается. Я много смотрел, и мои частичные знания получены из тщательного изучения и выводов, сделанных из кусочков статей, найденных в Интернете. Обратите внимание, что база данных ntds.dit также является базой данных LDAP. Это также база данных DNS, если DNS интегрирован в AD. Все эти протоколы, работающие вместе, плюс еще несколько, образуют "Active Directory".
- Откройте Active Directory - пользователи и компьютеры, перейдите на вкладку "Учетная запись". "Имя входа пользователя" - это самый простой способ "прочитать" соль. Вы не видите имя области, соединенное с ним прямо здесь, но оно подразумевается. Имя участника-службы, если оно также определено, перечисляется простым способом, как вы ищете на вкладке "Редактор атрибутов" (ищите servicePrincipalName). Убедитесь, что вы выбрали Вид> Расширенные функции, чтобы открыть эту вкладку. Соответствующее имя участника-пользователя также будет указано внизу в этом же разделе, что выглядит примерно так: accountname/somedomain.com@SOMEDOMAIN.COM.
- Когда вы меняете имя учетной записи на вкладке "Учетная запись AD", вы только что изменили соль. Обратите внимание, что если есть какая-либо таблица ключей, связанная с этой учетной записью AD, вы просто аннулируете ее, поскольку ее секретный ключ внутри представляет собой хэш пароля и соль. Когда соль или пароль изменятся, ключи больше не будут совпадать между учетной записью AD и учетной записью в таблице ключей. Вы должны будете повторно сгенерировать это в этой точке.
Имеет смысл? Это действительно объяснение поля. Чтобы узнать больше о Kerberos применительно к AD, начните здесь: Руководство по выживанию Kerberos
Существует немного более простой способ прочитать текущее значение соли (это не совсем просто, но, по крайней мере, не требуется трассировка пакетов):
- Установите MITKerberos для Windows
- Откройте PowerShell и выполните:
$env:KRB5_TRACE="kinit-trace.log" 'C:\Program Files\MIT\Kerberos\bin\kinit.exe' -fV UPN-or-USER@REALM Get-Content $env:KRB5_TRACE | Select-String "salt" rm $env:KRB5_TRACE
Первоначально это решение было предложено здесь, в Stackoverflow для Linux, пользователем Spezieh.