Spec-Zone.ru › Ansible

SSH в Windows

В новых версиях Windows можно использовать SSH для подключения к узлу Windows. Это альтернативный вариант подключения к WinRM.

Примечание

Хотя Ansible может использовать плагин подключения SSH с узлами Windows начиная с Ansible 2.8, официальная поддержка появилась только в версии 2.18.

  • Настройка SSH

    • Настройка оболочки по умолчанию
  • Настройка Ansible
  • Аутентификация SSH

    • Аутентификация по ключу
    • Аутентификация GSSAPI
    • Аутентификация по паролю

Настройка 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API