1. Зафиксируйте исходную ошибку
Сохраните время, систему, название клиента и безопасный фрагмент сообщения. Не переносите в справочник пароли, токены, cookies или SAML assertions. Запишите, на каком экране или endpoint произошёл отказ и достиг ли запрос IdP. Сбой TLS, неверный redirect и ошибка пароля относятся к разным этапам. Не запускайте повторную попытку до понимания политики блокировки и назначения запроса.
2. Выберите ветку по наблюдаемым данным
При Windows Security 4625 разберите тип входа и Status/SubStatus на узле назначения. Для Kerberos на DC откройте 4768/4771, затем 4769 при запросе службы. LDAP resultCode 49 ведёт к ответу bind и необязательной диагностике AD. Для Keycloak определите OIDC или SAML и точный этап. Это альтернативные ветви: один вход не обязан порождать все перечисленные записи.
3. Установите область связи
Зафиксируйте учётную базу, SID или realm и правила сопоставления между приложением и каталогом. Ненулевой LogonGuid может помочь связать 4769 с 4624, тогда как LogonId используется в границах узла. У IdP и приложения собственные идентификаторы. При отсутствии общего ключа оформите сопоставление как гипотезу с временным окном; одинаковый логин и IP не дают гарантии.
4. Прочитайте учебную цепочку
Авторский JSON показывает 4771, 4740 и LDAP 49 рядом по времени: состояние учётной записи может объяснять часть отказов, но нужно подтвердить узел, identity и маршрут bind. Отдельный Keycloak invalid_redirect_uri относится к настройке OIDC клиента и не доказывает блокировку AD. Не выбирайте одну причину только потому, что сообщения появились в одной минуте. Сохраняйте независимые наблюдения.
5. Проверьте права после аутентификации
Успешный TGT, TGS или сеанс 4624 не означает разрешение нужного действия. Если пользователь вошёл и получил 403, исследуйте авторизацию приложения и изменения доступа. Для Windows смотрите релевантное членство или изменение AD, для Keycloak — административный аудит и фактическое сопоставление ролей. Текущее состояние само не доказывает, какие права действовали в исследуемый момент.
6. Завершите проверяемым выводом
Сформулируйте факт: какой этап, источник, код, identity и период подтверждены. Затем отдельно перечислите возможную причину, её подтверждения и недостающие данные. Не меняйте политики, пароли, SPN или защитные проверки как часть этого маршрута. Если нет нужного журнала, зафиксируйте ограничение; отсутствие записи не превращается в успех или доказательство атаки.
Примеры записей
Данные в примерах условные. Состав полей зависит от версии и настроек источника.
Учебный журнал наблюдений по этапам
Поясняющая схема. Схема сопоставления событий Windows, LDAP и Keycloak. Названия обозначают роли данных, а не нативные поля SIEM.
{
"notice": "Авторская схема сопоставления, не нативный формат продукта и не автоматическое доказательство причинности.",
"observations": [
{
"utc": "2026-11-04T07:00:00Z",
"source": "DC Security4771",
"account": "EXAMPLE/demo.user",
"status": "0x18",
"role": "pre-auth rejected"
},
{
"utc": "2026-11-04T07:03:00Z",
"source": "DC Security4740",
"account": "EXAMPLE/demo.user",
"role": "account locked"
},
{
"utc": "2026-11-04T07:03:01Z",
"source": "application LDAP BindResponse",
"resultCode": 49,
"diagnostic": "data775 if supplied; nonstandard debug suffix",
"role": "separate protocol result, possible state correlation"
},
{
"utc": "2026-11-04T07:03:02Z",
"source": "Keycloak LOGIN_ERROR",
"client": "demo-web",
"error": "invalid_redirect_uri",
"role": "separate client configuration failure; not proved to be account lockout"
}
],
"conclusion": "Близость по времени не объединяет четыре наблюдения в одну попытку входа."
}
Команды и способы проверки
Укажите свой узел, путь к журналу и временной интервал. Требуемая среда указана рядом с командой.
PowerShell 7.5 / Windows: чтение разрешённой локальной копии EVTX. Заменить путь и учебное UTC-окно.
$referenceStartUtc = [DateTimeOffset]::Parse('2026-11-04T06:55:00Z').UtcDateTime
$referenceEndUtc = [DateTimeOffset]::Parse('2026-11-04T07:10:00Z').UtcDateTime
Get-WinEvent -FilterHashtable @{
Path='C:\Evidence\Security.evtx'
ProviderName='Microsoft-Windows-Security-Auditing'
Id=4624,4625,4740,4768,4769,4771
StartTime=$referenceStartUtc
EndTime=$referenceEndUtc
} | ForEach-Object {
$referenceEvent = $_
[xml]$referenceXml = $referenceEvent.ToXml()
$referenceNs = [System.Xml.XmlNamespaceManager]::new($referenceXml.NameTable)
$referenceNs.AddNamespace('e','http://schemas.microsoft.com/win/2004/08/events/event')
$referenceData = @{}
foreach ($referenceNode in $referenceXml.SelectNodes('/e:Event/e:EventData/e:Data',$referenceNs)) {
$referenceData[$referenceNode.GetAttribute('Name')] = $referenceNode.InnerText
}
[pscustomobject]@{
TimeCreatedUtc = $referenceEvent.TimeCreated.ToUniversalTime().ToString('o')
Computer = $referenceEvent.MachineName
Provider = $referenceEvent.ProviderName
EventId = $referenceEvent.Id
RecordId = $referenceEvent.RecordId
Version = $referenceXml.SelectSingleNode('/e:Event/e:System/e:Version',$referenceNs).InnerText
TargetUserName = $referenceData['TargetUserName']
TargetDomainName = $referenceData['TargetDomainName']
TargetSid = $referenceData['TargetSid']
ServiceName = $referenceData['ServiceName']
Status = $referenceData['Status']
IpAddress = $referenceData['IpAddress']
PreAuthType = $referenceData['PreAuthType']
LogonGuid = $referenceData['LogonGuid']
TicketEncryptionType = $referenceData['TicketEncryptionType']
SessionKeyEncryptionType = $referenceData['SessionKeyEncryptionType']
SubjectUserSid = $referenceData['SubjectUserSid']
SubjectUserName = $referenceData['SubjectUserName']
SubjectLogonId = $referenceData['SubjectLogonId']
CallerComputerName = $referenceData['CallerComputerName']
}
}
Не каждый вход проходит все перечисленные протоколы; близкие время/имя/IP не доказывают общий запрос. Схема маршрута не выполняет автоматическую корреляцию.