Проверка подлинности на основе ключей в OpenSSH для Windows
Чаще всего при аутентификации в Windows используется пара "имя пользователя — пароль", что подходит для систем с общим доменом. При работе между доменами, например, между локальными и системами, размещенными в облаке, этот тип проверки подлинности становится особенно уязвимым для атак методом перебора.
По сравнению с средами Linux обычно используются пары открытых и закрытых ключей для проверки подлинности, которая не требует использования угадываемых паролей. OpenSSH включает средства для поддержки проверки подлинности на основе ключей, в частности:
- ssh-keygen для создания безопасных ключей.
- ssh-agent и ssh-add для безопасного хранения закрытых ключей.
- scp и sftp для безопасного копирования файлов открытого ключа во время первоначального использования сервера.
В этом документе представлен обзор использования этих средств в Windows для начала использования проверки подлинности на основе ключей с помощью Secure Shell (SSH). Если вы не знакомы с управлением ключами SSH, настоятельно рекомендуем ознакомиться с документе NIST IR 7966, который называется Безопасность интерактивного и автоматического управления доступом с помощью secure Shell (SSH).
Пары ключей
Парой ключей называются файлы открытого и закрытого ключей, которые используются в некоторых протоколах аутентификации.
Проверка подлинности открытого ключа SSH использует асимметричные алгоритмы шифрования для создания двух файлов ключей — один частный и другой общедоступной. Каждый файл закрытого ключа является эквивалентом пароля и должен оставаться защищенным при всех обстоятельствах. Если кто-то получает закрытый ключ, он может войти как вы на любой сервер SSH, к который у вас есть доступ. Открытый ключ — это то, что размещается на сервере SSH и может быть предоставлен общий доступ без ущерба для закрытого ключа.
Сервер SSH и клиент могут использовать проверку подлинности на основе ключей для сравнения открытого ключа для имени пользователя, предоставленного с закрытым ключом. Если открытый ключ на стороне сервера не может быть проверен на основе закрытого ключа на стороне клиента, проверка подлинности завершается ошибкой.
Многофакторная проверка подлинности может быть реализована с помощью пар ключей, введя парольную фразу при создании пары ключей. Дополнительные сведения см. в разделе создание ключей пользователей. Пользователь запрашивает парольную фразу во время проверки подлинности. Парольная фраза в сочетании с наличием закрытого ключа используется на клиенте SSH для проверки подлинности пользователя.
Внимание
Удаленный сеанс, открытый через проверку подлинности на основе ключей, не имеет связанных учетных данных пользователя. В результате сеанс не может выполнять исходящую проверку подлинности в качестве пользователя. Это поведение является намеренным.
Создание ключей хоста
Открытые ключи имеют определенные требования к списку управления доступом (ACL), которые в Windows приравниваются только к разрешениям доступа к администраторам и системным пользователям. При первом использовании службы sshd
пара ключей для узла создается автоматически.
Внимание
Перед выполнением команд, приведенных в этой статье, необходимо установить Сервер OpenSSH. Дополнительные сведения см. в статье Начало работы с OpenSSH для Windows.
По умолчанию необходимо запустить sshd
вручную. Чтобы настроить его автоматически при каждом перезапуске сервера, выполните следующие команды из командной строки PowerShell с повышенными привилегиями на сервере:
# Set the sshd service to be started automatically.
Get-Service -Name sshd | Set-Service -StartupType Automatic
# Start the sshd service.
Start-Service sshd
Так как нет пользователя, связанного со службой sshd
, ключи узла хранятся в C:\ProgramData\ssh.
Создание ключей пользователя
Чтобы использовать аутентификацию на основе ключей, необходимо заранее создать для клиента одну или несколько пар открытого и закрытого ключей. Вы можете использовать ssh-keygen.exe
для создания файлов ключей и указать следующие алгоритмы создания ключей:
- Алгоритм цифровой подписи (DSA)
- Ривст-Шамир-Адлеман (RSA)
- Алгоритм цифровой подписи на базе эллиптической кривой (ECDSA)
- Эд25519
Если алгоритм не указан, используется Ed25519. Следует использовать надежный алгоритм и длину ключа, например ECDSA в этом примере.
Чтобы создать файлы ключей с помощью алгоритма ECDSA, выполните следующую команду в окне PowerShell или командной строки клиента:
ssh-keygen -t ecdsa
Выходные данные команды должны выглядеть следующим образом, за исключением того, что username
заменено вашим именем пользователя:
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):
На экране запроса вы можете нажать Enter, чтобы принять путь к файлу по умолчанию, или указать путь или имя файла для ключей, которые вы создадите.
Затем вам будет предложено использовать парольную фразу для шифрования файлов закрытого ключа. Как правило, мы не рекомендуем использовать пустую парольную фразу, так как парольная фраза работает с файлом ключа для предоставления двухфакторной проверки подлинности. Но в этом примере можно оставить парольную фразу пустой.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ecdsa.
Your public key has been saved in C:\Users\username/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME
The key's randomart image is:
+--[ECDSA 256]--+
| . |
| o |
| . + + . |
| o B * = . |
| o= B S . |
| .=B O o |
| + =+% o |
| *oo.O.E |
|+.o+=o. . |
+----[SHA256]-----+
Теперь у вас есть пара ключей ECDSA (публичный и приватный) в указанном расположении. Pub-файл является открытым ключом, и файл без расширения является закрытым ключом:
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/3/2021 2:55 PM 464 id_ecdsa
-a---- 6/3/2021 2:55 PM 103 id_ecdsa.pub
Файл закрытого ключа эквивалентен паролю и должен быть защищен таким же образом, как и пароль.
Вы можете использовать ssh-agent
для безопасного хранения закрытых ключей в контексте безопасности Windows, связанном с учетной записью Windows. Чтобы настроить службу ssh-agent
для автоматического запуска при каждом перезапуске компьютера и использовать ssh-add
для хранения закрытого ключа, выполните следующие команды в командной строке PowerShell с повышенными привилегиями на сервере:
# By default, the ssh-agent service is disabled. Configure it to start automatically.
# Run the following command as an administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic
# Start the service.
Start-Service ssh-agent
# The following command should return a status of Running.
Get-Service ssh-agent
# Load your key files into ssh-agent.
ssh-add $env:USERPROFILE\.ssh\id_ecdsa
После добавления ключа в службу ssh-agent
на клиенте служба ssh-agent
автоматически извлекает локальный закрытый ключ и передает его клиенту SSH.
Внимание
Рекомендуется создать резервную копию закрытого ключа в безопасном расположении, а затем удалить его из локальной системы после его добавления в службу ssh-agent
. Закрытый ключ нельзя извлечь из агента при использовании строгого алгоритма, например ECDSA в этом примере. Если вы теряете доступ к закрытому ключу, необходимо создать новую пару ключей и обновить открытый ключ во всех системах, с которыми вы взаимодействуете.
Разверните открытый ключ
Чтобы использовать ранее созданный ранее ключ пользователя, необходимо поместить содержимое открытого ключа (\.ssh\id_ecdsa.pub) на сервере в текстовый файл. Имя и расположение файла зависят от того, является ли учетная запись пользователя членом локальной группы администраторов или стандартной учетной записи пользователя. В следующих разделах рассматриваются как стандартные, так и административные пользователи.
Обычный пользователь
Вам необходимо разместить содержимое вашего открытого ключа (\.ssh\id_ecdsa.pub) на сервере в текстовом файле с именем authorized_keys
в C:\Users\username\.ssh\. Вы можете скопировать открытый ключ с помощью программы openSSH scp
безопасной передачи файлов или с помощью PowerShell для записи ключа в файл.
Для копирования открытого ключа на сервер можно использовать следующий код. В последней строке замените username
именем пользователя. Изначально вам будет предложено ввести пароль для учетной записи пользователя сервера.
# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell
Администраторский пользователь
Необходимо поместить содержимое открытого ключа (\.ssh\id_ecdsa.pub) на сервер в текстовый файл с именем administrators_authorized_keys
в C:\ProgramData\ssh\. Вы можете скопировать открытый ключ с помощью программы openSSH scp
безопасной передачи файлов или с помощью PowerShell для записи ключа в файл. ACL в этом файле необходимо настроить, чтобы разрешить доступ только администраторам и системным пользователям.
Следующий код можно использовать для копирования открытого ключа на сервер и настройки ACL. В последней строке замените username
именем пользователя. Изначально вам будет предложено ввести пароль для учетной записи пользователя сервера.
Примечание.
В этом примере показаны шаги по созданию administrators_authorized_keys
файла. Этот файл применяется только к учетным записям администратора. Его следует использовать вместо файла, определенного пользователем, в расположении профиля пользователя.
# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell
Для локализованных версий операционной системы без английского языка скрипт необходимо изменить, чтобы отразить имена групп соответствующим образом. Чтобы предотвратить ошибки, которые могут возникать при предоставлении разрешений именам групп, вместо имени группы можно использовать идентификатор безопасности (SID). Идентификатор безопасности можно получить, выполнив Get-LocalGroup | Select-Object Name, SID
. При использовании идентификатора безопасности вместо имени группы перед ним должна стоять звездочка (*). В следующем примере Группа Администраторов использует SID S-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
из любого клиента с закрытым ключом.