PSRemoting для Linux и Windows: Руководство по использованию

Одна из замечательных вещей в том, как PowerShell изменился за последние несколько лет, заключается в том, что он принимает множество способов взаимодействия с машинами, не использующими Windows. Одним из таких изменений стала поддержка PSRemoting через SSH. PSRemoting через SSH также означает наличие PSRemoting на Linux!

Хотя настройка PSRemoting для работы с SSH и Linux требует небольшой настройки для начала работы, это позволяет вам использовать PowerShell для взаимодействия с машинами на Linux нативно.

В этом руководстве вы узнаете, как настроить клиент Windows для подключения к компьютеру Linux (CentOS) с использованием PSRemoting через SSH и наоборот. Вы узнаете, как аутентифицироваться, используя как пароль так и сертификат.

Связано: PowerShell Remoting: Полное руководство

Предварительные требования

Это руководство будет пошаговым. Если вы хотите следовать за ним, убедитесь, что у вас есть следующее заранее:

  • A Windows 10 build 1809 or greater machine. The tutorial will use Windows Server 2019 Standard as the remote server.
  • A Linux machine that supports PowerShell 7. The tutorial will use CentOS 8.
  • Права Sudo на Linux-машине и права локального администратора на Windows-машине. После начальной настройки некоторые из прав можно отозвать.

Настройка Windows (клиент) для PSRemoting через SSH

Сначала вам нужно настроить клиент PSRemoting (PowerShell) на вашем Windows-клиенте. Для этого вам нужно настроить и сконфигурировать как PowerShell 7+, так и OpenSSH.

Установка PowerShell 7+

Сначала установите PowerShell 7+. Это руководство не будет охватывать этот процесс. Чтобы узнать, как это сделать, ознакомьтесь со ссылкой ниже.

Установка OpenSSH

Вы также должны установить OpenSSH. OpenSSH – это пакет, который будет использоваться PSRemoting для подключения к удаленному компьютеру с Linux. Вы можете установить OpenSSH с помощью PowerShell, используя cmdlet Get-WindowsCapability, как показано ниже.

В зависимости от того, является ли ваш хост Windows клиентом, и/или сервером, зависит от того, какую функцию Windows вы должны установить. Если вы подключаетесь с сервера Windows к Linux, вам нужен только клиент OpenSSH. Если вы подключаетесь с Linux к серверу Windows, вам нужен только сервер OpenSSH.

Команда ниже находит все функции Windows с именем, начинающимся с OpenSSH и устанавливает их, поэтому будут установлены как клиент, так и сервер.

Get-WindowsCapability -Online | Where-Object {$_.Name -like 'OpenSSH*'} | Add-WindowsCapability -Online

Если вы хотите установить только клиент, измените фильтр в блоке сценария Where-Object на OpenSSH.Client*, а для сервера фильтр должен быть OpenSSH.Server*.

Связано: Начало работы с SSH и PowerShell

Запуск сервера SSH

После установки OpenSSH он откроет брандмауэр Windows на порту 22, но не запустит службу сервера OpenSSH для прослушивания порта. Чтобы запустить сервер OpenSSH на Windows Server, выполните следующую команду PowerShell для запуска сервера OpenSSH и установки службы на автозагрузку.

Start-Service sshd
Set-Service sshd -StartupType Automatic

Настройка конфигурации OpenSSH

Следующим шагом является изменение файла конфигурации демона sshd_config. Внутри этого файла вам необходимо сначала подтвердить, что аутентификация по паролю включена, а также добавить подсистему PowerShell.

В этой части руководства настраивается самый простой метод использования паролей. Позже в этом руководстве вы узнаете, как настроить аутентификацию SSH с использованием сертификатов.

  1. Откройте файл конфигурации в вашем любимом текстовом редакторе по адресу C:\ProgramData\ssh\sshd_config.

2. Подтвердите, что аутентификация по паролю включена, где либо строка PasswordAuthentication закомментирована символом # в начале, либо установлена в значение yes.

Password Authentication

3. Добавьте подсистему PowerShell. Для PowerShell 7 добавьте строку: Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo.

  • Опция -sshs используется для запуска PowerShell 7 внутри SSH в качестве подсистемы.
  • Опция -NoLogo делает так, чтобы при запуске PowerShell скрывалась информация о авторских правах, что гарантирует отсутствие неожиданного вывода при запуске сеанса SSH.

4. Сохраните и закройте файл конфигурации.

5. Перезапустите службу sshd Windows. Вы можете сделать это с помощью PowerShell, выполнив команду Restart-Service sshd.

Теперь у вас должно быть все настроено для подключения к этому серверу Windows с использованием PSRemoting через SSH с (клиента) и на (сервера).

Настройка Linux (сервера) для PSRemoting через SSH

Следующим шагом является установка PowerShell и настройка OpenSSH на Linux с аналогичной конфигурацией.

Обратите внимание, что поскольку мы используем CentOS, некоторые команды могут отличаться, если вы используете другое распределение.

Установка PowerShell 7+

Сначала установите PowerShell 7. В этом руководстве не будет описано, как это сделать. Вместо этого обязательно ознакомьтесь со следующей ссылкой.

Связано: Как скачать и установить PowerShell 7 на Windows, macOS и Linux

Настройка OpenSSH

Как и в Windows Server, вам понадобится OpenSSH. В отличие от Windows, OpenSSH, вероятно, уже установлен. В этом руководстве для CentOS 8 на Linux-машине уже установлены как клиент, так и сервер по умолчанию, но вы можете проверить это, используя следующую команду:

rpm -qa openssh*

Если клиент и сервер установлены, вы должны получить что-то подобное выводу ниже.

Configuring OpenSSH

Настройте файл конфигурации SSH:

  1. Откройте файл sshd_config, запустив sudo vi /etc/ssh/sshd_config.

2. Добавьте подсистему PowerShell, аналогично Windows Server, добавив следующую строку в файл конфигурации.

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

3. Выйдите из vi и сохраните файл.

4. Перезапустите службу ssh daemon, чтобы применить изменения, выполнив sudo systemctl restart sshd.

По умолчанию в большинстве случаев, включая CentOS 8, будут включены аутентификация по паролю и по открытому ключу. Нет необходимости добавлять их здесь.

Подключение к/из Windows/Linux с аутентификацией по паролю

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

Аутентификация на основе пароля выглядит и ощущается так же, как при использовании SSH с именем пользователя и паролем.

Команды подключения

Чтобы протестировать подключение с помощью PSRemoting через SSH с Windows на Linux или с Linux на Windows, давайте использовать как “временную” сессию с помощью cmdlet Invoke-Command, так и постоянную сессию с помощью New-PSSession.

Связанные: Invoke-Command: Лучший способ запуска удаленного кода

Протестируйте подключение PSRemoting с помощью Invoke-Command, выполнив следующие шаги:

  1. 1. Откройте консоль PowerShell 7.

2. Установите параметры для cmdlet Invoke-Command. В этом случае параметры ниже будут подключаться к компьютеру с именем SRV1 с использованием локальной учетной записи на SRV1 с именем User.

$SessionParams = @{
     HostName = SRV1
     UserName = user
     SSHTransport = $true
 }

3. Выполните Invoke-Command, передав параметры и запустив команду (в данном случае Get-Process) внутри scriptblock.

Связано: PowerShell Splatting: что это и как это работает?

Invoke-Command @SessionParams -ScriptBlock {Get-Process}

Затем вы должны увидеть список всех запущенных процессов на компьютере SRV1.

Вы также можете установить постоянное соединение, которое позволяет вам подключаться и взаимодействовать с командной строки, выполняя команды:

  1. Предоставляя вышеуказанные параметры и передавая их командлету New-PSSession.

2. Подключение к этой сессии интерактивно с использованием командлета Enter-PSSession.

Create a persistent session
 $session = New-PSSession @SessionParams
 Connect interactively
 Enter-PSSession -Session $session

3. После выполнения команды Enter-PSSession вы будете предложены ввести пароль для пользователя. После успешной аутентификации вы будете подключены к другой машине в рамках PowerShell.

Обратите внимание, что ни одна из указанных выше команд не требует общего параметра Credential для предоставления имени пользователя и пароля для подключения. Вместо этого мы использовали параметр SSHTransport. SSH не использует тот же процесс аутентификации, который использует Windows для перехода с одного компьютера под управлением Windows на другой, поэтому он не может интерпретировать объекты PSCredential.

Связано: Использование командлета Get-Credential в PowerShell и все, что касается учетных данных.

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

Настройка аутентификации на основе открытого ключа

Хотя аутентификация на основе пароля проста в настройке и использовании, у нее есть две проблемы.

  • Нет способа провести аутентификацию без того, чтобы кто-то вручную выполнял команды в безопасном режиме.
  • Вы отправляете пароль по сети.

Хотя пароль в данном случае зашифрован в рамках SSH-соединения, сервер получает пароль в открытом виде. Если сервер каким-то образом скомпрометирован, это может стать проблемой безопасности.

Генерация публичных/личных ключей

При использовании аутентификации с помощью открытого ключа любого типа сначала необходимо сгенерировать открытый ключ с клиента. Это требование применимо как к Linux, так и к Windows.

На машине с Linux или Windows Server:

  1. Запустите ssh-keygen для генерации пары ключей.

Если вы запускаете ssh-keygen на Linux, знайте, что по умолчанию будет сгенерирована пара ключей RSA. Многие новые операционные системы Linux по умолчанию не позволяют использовать пары ключей RSA для аутентификации. Чтобы исправить это, используйте ssh-keygen -t ed25519.

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

3. Только для Windows: Выполните следующие команды из PowerShell, где <ProfilePath> – это путь к вашему профилю (вероятно, C:\Users\UserName).

Set-Service ssh-agent -StartupType Automatic
 Start-Service ssh-agent
 ssh-add .ssh\id_ed25519
 Remove-Item ~.ssh\id_ed25519

В реализации OpenSSH для Windows есть служба ssh-agent, которая позволяет сохранять закрытые ключи в контексте безопасности Windows пользователя, под которым вы вошли в систему. Это позволит вам импортировать ваш закрытый ключ SSH в ssh-agent, а затем удалить ключ из файловой системы для его дополнительной защиты.

4. Теперь скопируйте сгенерированный открытый ключ (<домашняя директория пользователя>\.ssh\id_ed25519.pub) на сервер, к которому вы собираетесь подключиться. Windows не предоставляет инструмент для выполнения этой операции, поэтому ее можно завершить с помощью SCP. Запустите следующую команду для копирования открытого ключа на машину с Linux.

scp C:\Users\Username.ssh\id_ed25519.pub username@ServerB:~/.ssh/authorized_keys

Для копирования с Linux на Windows:

scp ~/.ssh/id_ed25519.pub administrator@ServerA:.ssh/authorized_keys

5. Введите пароль вошедшего в систему пользователя. После ввода PowerShell/Bash скопирует ключ, и вы будете отключены от удаленной машины.

Подключение к/от Windows/Linux с аутентификацией по открытому ключу

После того как вы настроили открытый и закрытый ключи, подключение к/от Windows и Linux должно быть простым. Оно практически идентично аутентификации на основе пароля.

Чтобы подключиться с открытым ключом на Windows, используйте те же команды, что и показано в Командах подключения выше. Вы заметите только одно отличие: вас не будут просить ввести учетные данные.

Ниже приведен пример подключения с Linux к Windows с использованием переключателя -v для просмотра происходящего во время подключения.

Example of connecting from Linux to Windows using the -v switch

Source:
https://adamtheautomator.com/psremoting-linux/