• Статья
  • Чтение занимает 3 мин

Область применения Windows Server 2019, Windows 10: Windows Server 2022,

Чаще всего при аутентификации в 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 будет автоматически создана пара ключей для узла.

По умолчанию служба 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:ProgramDatassh.

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

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

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

ssh-keygen -t ed25519

Эта команда возвращает такие выходные данные (username заменяется вашим именем пользователя):

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:Usersusername.sshid_ed25519):

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

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:Usersusername.sshid_ed25519.
Your public key has been saved in C:Usersusername.sshid_ed25519.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@server@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 в указанном расположении. Файлы PUB являются открытыми ключами, а файлы без расширения — закрытыми.

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

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

# By default the ssh-agent service is disabled. Allow it to be manually started for the next step to work.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Manual

# 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 ~.sshid_ed25519

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

Важно!

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

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

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

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

Содержимое открытого ключа (~.sshid_ed25519.pub) нужно разместить на сервере в текстовом файле authorized_keys в папке C:Usersusername.ssh. Клиентский компонент OpenSSH включает scp (служебная программа безопасной передачи файлов) для упрощения этого процесса.

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

# Make sure that the .ssh directory exists in your server's user account home folder
ssh username@domain1@contoso.com mkdir C:Usersusername.ssh

# Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
scp C:Usersusername.sshid_ed25519.pub user1@domain1@contoso.com:C:Usersusername.sshauthorized_keys

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

Содержимое открытого ключа (~.sshid_ed25519.pub) нужно разместить на сервере в текстовом файле administrators_authorized_keys в папке C:ProgramDatassh. Клиентский компонент OpenSSH включает scp (служебная программа безопасной передачи файлов) для упрощения этого процесса. Список управления доступом для этого файла должен быть настроен на предоставление доступа только администраторам и системе.

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

Примечание

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

# Make sure that the .ssh directory exists in your server's user account home folder
ssh user1@domain1@contoso.com mkdir C:ProgramDatassh

# Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
scp C:Usersusername.sshid_ed25519.pub user1@domain1@contoso.com:C:ProgramDatasshadministrators_authorized_keys

# Appropriately ACL the authorized_keys file on your server
ssh --% user1@domain1@contoso.com icacls.exe "C:ProgramDatasshadministrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

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