SSH в Windows
В новых версиях Windows можно использовать SSH для подключения к узлу Windows. Это альтернативный вариант подключения к WinRM.
Примечание
Хотя Ansible может использовать плагин подключения SSH с узлами Windows начиная с Ansible 2.8, официальная поддержка появилась только в версии 2.18.
Настройка SSH
Начиная с Windows Server 2019, Microsoft предоставляет реализацию OpenSSH в качестве компонента Windows. Её также можно установить из upstream-пакета Win32-OpenSSH. Ansible официально поддерживает только реализацию OpenSSH, поставляемую с Windows, но не upstream-пакет. Минимально необходима версия OpenSSH 7.9.0.0. Фактически это означает, что официальная поддержка начинается с Windows Server 2022, поскольку в Server 2019 поставляется версия 7.7.2.1. Использование более старых версий Windows или upstream-пакета может работать, но не поддерживается.
Чтобы установить компонент OpenSSH в Windows Server 2022 и более поздних версиях, используйте следующую команду PowerShell:
Get-WindowsCapability -Name OpenSSH.Server* -Online |
Add-WindowsCapability -Online
Set-Service -Name sshd -StartupType Automatic -Status Running
$firewallParams = @{
Name = 'sshd-Server-In-TCP'
DisplayName = 'Inbound rule for OpenSSH Server (sshd) on TCP port 22'
Action = 'Allow'
Direction = 'Inbound'
Enabled = 'True' # This is not a boolean but an enum
Profile = 'Any'
Protocol = 'TCP'
LocalPort = 22
}
New-NetFirewallRule @firewallParams
$shellParams = @{
Path = 'HKLM:\SOFTWARE\OpenSSH'
Name = 'DefaultShell'
Value = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
PropertyType = 'String'
Force = $true
}
New-ItemProperty @shellParams
Настройка оболочки по умолчанию
По умолчанию OpenSSH в Windows использует cmd.exe в качестве оболочки по умолчанию. Ansible может работать с этой оболочкой, однако рекомендуется изменить её на powershell.exe, поскольку она лучше протестирована и, как ожидается, работает быстрее, чем при использовании cmd.exe в качестве оболочки по умолчанию. Чтобы изменить оболочку по умолчанию, можно использовать следующий сценарий PowerShell:
# Set default to powershell.exe
$shellParams = @{
Path = 'HKLM:\SOFTWARE\OpenSSH'
Name = 'DefaultShell'
Value = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
PropertyType = 'String'
Force = $true
}
New-ItemProperty @shellParams
# Set default back to cmd.exe
Remove-ItemProperty -Path HKLM:\SOFTWARE\OpenSSH -Name DefaultShell
Новая настройка оболочки по умолчанию вступит в силу при следующем подключении SSH; перезапускать службу sshd не нужно. Также можно настроить оболочку по умолчанию с помощью Ansible:
- name: set the default shell to PowerShell
ansible.windows.win_regedit:
path: HKLM:\SOFTWARE\OpenSSH
name: DefaultShell
data: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
type: string
state: present
- name: reset SSH connection after shell change
ansible.builtin.meta: reset_connection
- name: set the default shell to cmd
ansible.windows.win_regedit:
path: HKLM:\SOFTWARE\OpenSSH
name: DefaultShell
state: absent
- name: reset SSH connection after shell change
ansible.builtin.meta: reset_connection
Параметр meta: reset_connection важен, чтобы последующие задачи использовали новую оболочку по умолчанию.
Настройка Ansible
Чтобы настроить Ansible для использования SSH с узлами Windows, необходимо задать две переменные подключения:
- установите
ansible_connectionв значениеssh - установите
ansible_shell_typeв значениеpowershellилиcmd
Значение переменной ansible_shell_type должно соответствовать DefaultShell, настроенной на узле Windows. Для узла Windows также можно задать другие параметры SSH, описанные в документации по ssh.
Аутентификация SSH
Аутентификация Win32-OpenSSH в Windows аналогична аутентификации SSH на узлах Unix/Linux. Хотя можно использовать множество методов аутентификации, в Windows обычно применяются три:
Вариант | Локальные учётные записи | Учётные записи Active Directory | Делегирование учётных данных |
|---|---|---|---|
Ключ | Да | Да | Нет |
GSSAPI | Нет | Да | Да |
Пароль | Да | Да | Да |
В большинстве случаев рекомендуется использовать аутентификацию по ключу или GSSAPI вместо аутентификации по паролю.
Аутентификация по ключу
Аутентификация SSH по ключу в Windows работает так же, как аутентификация SSH по ключу на узлах POSIX. С помощью команды ssh-keygen можно создать пару ключей и добавить открытый ключ в файл authorized_keys в каталоге профиля пользователя. Закрытый ключ следует хранить в безопасном месте и никому не передавать.
Одно отличие состоит в том, что файл authorized_keys для пользователей с правами администратора находится не в каталоге .ssh в каталоге профиля пользователя, а в C:\ProgramData\ssh\administrators_authorized_keys. Расположение файла authorized_keys для пользователей с правами администратора можно изменить на каталог профиля пользователя, удалив или закомментировав строки в C:\ProgramData\ssh\sshd_config и перезапустив службу sshd.
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
Ключи SSH работают как с локальными, так и с доменными учётными записями, однако у них есть проблема двойного перехода. Это означает, что при использовании аутентификации SSH по ключу с Ansible удалённый сеанс не будет иметь доступа к учётным данным пользователя и завершится с ошибкой при попытке обратиться к сетевому ресурсу. Чтобы обойти эту проблему, можно применить become к задаче, указав учётные данные пользователя, которому необходим доступ к удалённому ресурсу.
Аутентификация GSSAPI
Для аутентификации пользователя на узле Windows GSSAPI использует Kerberos. Чтобы использовать аутентификацию GSSAPI с Ansible, на сервере Windows необходимо разрешить аутентификацию GSSAPI, отредактировав файл C:\ProgramData\ssh\sshd_config. Добавьте следующую строку или измените существующую:
GSSAPIAuthentication yes
После внесения изменений перезапустите службу sshd с помощью Restart-Service -Name sshd.
На управляющем узле Ansible необходимо установить Kerberos и настроить его для домена, к которому принадлежит узел Windows. Настройка Kerberos выходит за рамки этого документа. После настройки области Kerberos можно использовать команду kinit, чтобы получить билет для пользователя, от имени которого выполняется подключение, и команду klist, чтобы проверить доступные билеты:
> kinit username@REALM.COM
Password for username@REALM.COM
> klist
Ticket cache: KCM:1000
Default principal: username@REALM.COM
Valid starting Expires Service principal
29/08/24 13:54:51 29/08/24 23:54:51 krbtgt/REALM.COM@REALM.COM
renew until 05/09/24 13:54:48
Получив действительный билет, можно использовать переменную хоста ansible_user, чтобы указать имя пользователя UPN. При подключении по SSH Ansible автоматически использует билет Kerberos этого пользователя.
Также можно включить неограниченное делегирование с помощью аутентификации GSSAPI, чтобы узел Windows мог обращаться к сетевым ресурсам. Для работы делегирования GSSAPI билет, полученный командой kinit, должен допускать перенаправление, а команду ssh необходимо вызвать с параметром -o GSSAPIDelegateCredentials=yes. Чтобы получить билет, допускающий перенаправление, используйте флаг -f с командой kinit или добавьте forwardable = true в раздел [libdefaults] файла /etc/krb5.conf.
> kinit -f username@REALM.COM
Password for username@REALM.COM
# -f will show the ticket flags, we want to see F
> klist -f
Ticket cache: KCM:1000
Default principal: username@REALM.COM
Valid starting Expires Service principal
29/08/24 13:54:51 29/08/24 23:54:51 krbtgt/REALM.COM@REALM.COM
renew until 05/09/24 13:54:48, Flags: FRIA
Параметр GSSAPIDelegateCredentials=yes можно задать в файле ~/.ssh/config или в инвентаре как переменную хоста:
ansible_ssh_common_args: -o GSSAPIDelegateCredentials=yes
В отличие от плагинов подключения psrp или winrm, плагин подключения SSH не может получить билет Kerberos TGT при указании имени пользователя и пароля. Это означает, что перед запуском плейбука у пользователя должен быть действительный билет Kerberos.
Дополнительные сведения о настройке, использовании и устранении неполадок аутентификации Kerberos см. в разделе Аутентификация Kerberos.
Аутентификация по паролю
Аутентификация по паролю — наименее безопасный метод аутентификации, поэтому использовать её не рекомендуется. Тем не менее аутентификацию по паролю можно использовать с SSH в Windows. Чтобы использовать аутентификацию по паролю с Ansible, задайте переменную ansible_password в файле инвентаря или плейбуке. Для аутентификации по паролю на управляющем узле Ansible должен быть установлен пакет sshpass.
Аутентификация по паролю работает подобно аутентификации WinRM CredSSP: имя пользователя и пароль передаются узлу Windows, который выполняет неограниченное делегирование для доступа к сетевым ресурсам.
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/os_guide/windows_ssh.html