Проверка подлинности на основе ключей в OpenSSH для Windows

Применимо к Windows Server 2022, Windows Server 2019, Windows 10 (сборка 1809 и более поздние версии)

Чаще всего при аутентификации в Windows используется пара "имя пользователя — пароль", что подходит для систем с общим доменом. При работе с несколькими доменами, например с локальными и облачными системами, возникает риск атак методом перебора.

По сравнению с средами Linux обычно используются пары открытых ключей и закрытых ключей для проверки подлинности, которая не требует использования угадываемых паролей. OpenSSH включает средства для поддержки проверки подлинности на основе ключей, в частности:

  • ssh-keygen для создания защищенных ключей;
  • ssh-agent и ssh-add для защищенного хранения закрытых ключей;
  • scp и sftp для защищенного копирования файлов открытого ключа при первом использовании сервера.

В этом документе описано, как использовать эти средства в Windows для перехода на аутентификацию на основе ключей по протоколу SSH. Если вы не знакомы с управлением ключами SSH, настоятельно рекомендуем ознакомиться с документом NIST IR 7966 под названием "Безопасность интерактивного и автоматического управления доступом с помощью Secure Shell (SSH)".

Сведения о парах ключей

Парой ключей называются файлы открытого и закрытого ключей, которые используются в некоторых протоколах аутентификации.

При аутентификации SSH на основе открытого ключа используются асимметричные алгоритмы шифрования для создания двух файлов ключей, один из которых считается закрытым, а второй открытым. Файлы закрытых ключей выполняют функцию паролей, а значит, должны быть постоянно защищены. Если кто-то получает закрытый ключ, он может войти как вы на любой сервер SSH, к который у вас есть доступ. Открытый ключ размещается на сервере SSH. Его можно свободно распространять, не компрометируя закрытый ключ.

Проверка подлинности на основе ключей позволяет серверу SSH и клиенту сравнить открытый ключ для имени пользователя, предоставленного с закрытым ключом. Если открытый ключ на стороне сервера не может быть проверен на основе закрытого ключа на стороне клиента, проверка подлинности завершается ошибкой.

Многофакторную проверку подлинности можно реализовать с помощью пар ключей, введя парольную фразу при создании пары ключей (см. раздел о создании пользовательских ключей ниже). Пользователю будет предложено ввести парольную фразу во время проверки подлинности. Парольная фраза используется вместе с наличием закрытого ключа на клиенте SSH для проверки подлинности пользователя.

Внимание

Удаленный сеанс, открытый с помощью проверки подлинности на основе ключей, не имеет связанных учетных данных пользователя, поэтому он не может выполнять исходящую проверку подлинности в качестве пользователя.

Создание ключей узла

Для открытых ключей действуют определенные требования к ACL, которые в среде Windows соответствуют предоставлению доступа только администраторам и системной учетной записи. При первом использовании sshd будет автоматически создана пара ключей для узла.

Внимание

Сначала необходимо установить OpenSSH Server. См. статью о начале работы с OpenSSH.

По умолчанию служба sshd настроена для запуска вручную. Чтобы запускать ее каждый раз при перезагрузке сервера, выполните следующие команды в командной строке PowerShell с повышенными привилегиями на сервере:

# Set the sshd service to be started automatically
Get-Service -Name sshd | Set-Service -StartupType Automatic

# Now start the sshd service
Start-Service sshd

Так как нет пользователя, связанного со службой sshd, ключи узла хранятся в C:\ProgramData\ssh.

Создание ключей пользователя

Чтобы использовать аутентификацию на основе ключей, необходимо заранее создать для клиента одну или несколько пар открытого и закрытого ключей. Программа ssh-keygen.exe используется для создания файлов ключей, при этом вы можете задать алгоритмы DSA, RSA, ECDSA или Ed25519. Если алгоритм не указан, используется RSA. Необходимо использовать надежный алгоритм и соответствующую длину ключа, например Ed25519 в этом примере.

Чтобы создать файлы ключей с помощью алгоритма Ed25519, выполните следующую команду из powerShell или командной строки на клиенте:

ssh-keygen -t ed25519

Выходные данные команды должны отображать следующие выходные данные (где имя пользователя заменено вашим именем пользователя):

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ed25519):

Можно нажать клавишу ВВОД, чтобы принять вариант по умолчанию, или указать путь и (или) имя файла для создания файлов ключей. На этом этапе вам будет предложено указать парольную фразу для шифрования файлов закрытого ключа. Парольная фраза может быть пустой, но не рекомендуется. Парольная фраза в сочетании с файлом ключа позволяет выполнить двухфакторную аутентификацию. В этом примере мы покидаем парольную фразу пустым.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ed25519.
Your public key has been saved in C:\Users\username/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME

The key's randomart image is:
+--[ED25519 256]--+
|        .        |
|         o       |
|    . + + .      |
|   o B * = .     |
|   o= B S .      |
|   .=B O o       |
|  + =+% o        |
| *oo.O.E         |
|+.o+=o. .        |
+----[SHA256]-----+

Теперь у вас есть пара ключей ed25519 public/private ed2519 в указанном расположении. Файлы PUB являются открытыми ключами, а файлы без расширения — закрытыми.

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2021   2:55 PM            464 id_ed25519
-a----         6/3/2021   2:55 PM            103 id_ed25519.pub

Помните, что файлы закрытых ключей выполняют функцию пароля и должны защищаться так же тщательно. Используйте ssh-agent для безопасного хранения закрытых ключей в контексте безопасности Windows, связанном с учетной записью Windows. Чтобы запустить службу ssh-agent при каждой перезагрузке компьютера и использовать ssh-add для хранения закрытого ключа, выполните следующие команды из командной строки PowerShell с повышенными привилегиями на сервере:

# By default the ssh-agent service is disabled. Configure it to start automatically.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Start the service
Start-Service ssh-agent

# This should return a status of Running
Get-Service ssh-agent

# Now load your key files into ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

После добавления ключа в агент ssh-agent на клиенте агент ssh-agent автоматически извлекает локальный закрытый ключ и передает его клиенту SSH.

Внимание

Мы настоятельно рекомендуем создать резервную копию закрытого ключа в безопасном расположении, а затем удалить его из локальной системы после добавления в ssh-agent. Закрытый ключ нельзя получить из агента, если использовался надежный алгоритм, например Ed25519 в этом примере. Если вы утратите доступ к закрытому ключу, вам нужно будет создать новую пару ключей и обновить открытый ключ во всех системах, с которыми вы работаете.

Развертывание открытого ключа

Чтобы использовать созданный выше ключ пользователя, необходимо поместить содержимое открытого ключа (\.ssh\id_ed25519.pub) на сервер в текстовый файл. Имя и расположение файла зависят от того, является ли учетная запись пользователя членом группы локальных администраторов или стандартной учетной записью пользователя. В следующих разделах рассматриваются как стандартные, так и административные пользователи.

Обычный пользователь

Содержимое открытого ключа (\.ssh\id_ed25519.pub) должно быть помещено на сервер в текстовый файл authorized_keys с именем C:\Users\username\.ssh\. Вы можете скопировать открытый ключ с помощью программы безопасной передачи файлов OpenSSH или с помощью PowerShell для записи ключа в файл.

В приведенном ниже примере на сервер копируется открытый ключ (где имя пользователя заменяется именем пользователя). Сначала необходимо использовать пароль для учетной записи пользователя сервера.

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

Администратор

Содержимое открытого ключа (\.ssh\id_ed25519.pub) должно быть помещено на сервер в текстовый файл administrators_authorized_keys с именем C:\ProgramData\ssh\. Вы можете скопировать открытый ключ с помощью программы безопасной передачи файлов OpenSSH или с помощью PowerShell для записи ключа в файл. Список управления доступом для этого файла должен быть настроен на предоставление доступа только администраторам и системе.

В приведенном ниже примере открытый ключ копируется на сервер и настраивает список управления доступом (username заменяется именем пользователя). Сначала необходимо использовать пароль для учетной записи пользователя сервера.

Примечание.

В этом примере показаны шаги по созданию administrators_authorized_keys файла. Это относится только к учетным записям администратора и должно использоваться вместо каждого файла пользователя в расположении профиля пользователя.

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

Для локализованных версий операционной системы, не являющихся английскими, скрипт должен быть изменен, чтобы отразить имена групп соответствующим образом. Чтобы предотвратить ошибки при предоставлении разрешений для имен групп, идентификатор безопасности (SID) можно использовать на своем месте. Идентификатор безопасности можно получить, выполнив команду Get-LocalGroup | Select-Object Name, SID. При использовании идентификатора безопасности вместо имени группы он должен предшествовать звездочку (*). В следующем примере группа Администратор istrator использует sidS-1-5-32-544:

$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""*S-1-5-32-544:F"" /grant ""SYSTEM:F"""

Эти действия завершают настройку, которая требуется для использования аутентификации OpenSSH на основе ключей в среде Windows. После выполнения примеров команд PowerShell пользователь может подключиться к узлу sshd от любого клиента, имеющего закрытый ключ.