Opt-In Software Blog

Software, dvelopment, and practical insights

Как Windows OpenSSH сломал мне мозг

Читать на другом языке: English | Русский

Бывают ошибки, которые гуглятся за две секунды, а бывают те, из-за которых теряешь много времени. К последним как раз относится сбой подключения по SSH к Windows Server, когда служба OpenSSH выдает в журнал событий сообщения:

sshd: error: get_user_token - unable to generate token on 2nd attempt for user administrator
sshd: fatal: ga_init, unable to resolve user administrator

Эти сообщения говорят о том, что подсистема аутентификации Windows вообще не может распознать пользователя на уровне ОС или не способна создать для него маркер безопасности (security token). Вроде бы всё настроено правильно, а сервер упорно сбрасывает соединение.

Куда уходит время (Ложные следы)

Если вы начнете гуглить эту ошибку, 90% советов в интернетах поведут вас по двум путям:

  1. Права на файлы ключей. Вам предложат настраивать ACL (права доступа) через icacls для файла administrators_authorized_keys в C:\ProgramData\ssh, убирать наследование и оставлять доступ только для SYSTEM и Administrators.
  2. Конфиг sshd_config. Посоветуют закомментировать блок Match Group administrators в самом низу конфига, чтобы заставить OpenSSH читать ключи из стандартного профиля пользователя (.ssh/authorized_keys).

Я перепробовал всё из этого списка. Права и конфиги проверены, службы перезапущены. Результат — ноль. Сервер упорно сбрасывал сессию сразу после успешной проверки ключа.

Неочевидная разгадка

Причина оказалась банальной, но скрытой за спецификой работы OpenSSH в Windows.
Как работает SSH в Linux? Если ключ подошел — ты внутри.
Как работает SSH в Windows? Даже если ключ подошел, службе OpenSSH (которая работает под учеткой SYSTEM) нужно создать полноценную рабочую сессию для Windows и сгенерировать токен безопасности пользователя через системное API (LsaLogonUser).
И вот в этот момент Windows “дает отлуп”.
Вбиваю в консоль сервера проверку:

net user Administrator

И вижу строчку: Account Active: Locked (или Учетная запись заблокирована).
Оказывается, аккаунт Администратора был заблокирован! Скорее всего, из-за банального брутфорса (роботы ломились на 22 порт, сработала Windows-политика блокировки паролей, и учетка «заморозилась»). При этом SSH-сервер ключ-то проверил и подтвердил (ведь файл на диске лежит), а вот сама ОС Windows создать токен для заблокированного юзера не дала. Отсюда и абсолютно невнятный лог про unable to generate token.

Как это лечится за 5 секунд

Если вы наступили на те же грабли, решение простое. Заходим на сервер под другой админской учеткой (или локально) и разблокируем Администратора.

Через PowerShell:

Unlock-LocalUser -Name "Administrator"

Через старый добрый CMD:

net user Administrator /active:yes

После этого чудеса прекращаются, и клиент получает доступ к серверу по SSH.

Search