Начиная с Windows 10 1809 и Windows Server 2019 в операционной системе имеется встроенный SSH сервер, основанный на OpenSSH. В этой статье мы покажем, как установить и настроить OpenSSH сервер в Windows 10 и подключиться к нему удаленно по защищенному SSH протоколу (ну прям как в Linux 🙂 ).
Установка сервера OpenSSH в Windows
Рассмотрим, как установить компонент OpenSSH Server в Windows 10 1903 (Windows Server 2019 все выполняется аналогично).
Пакет OpenSSH (как и RSAT) уже включен в данные версии Windows в виде Feature on Demand (FoD).
При наличии прямого Интернет-подключения вы можете установить сервер OpenSSH с помощью PowerShell
Add-WindowsCapability -Online -Name OpenSSH.Server*
Или при помощи DISM:
dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0
В Windows 10 этот компонент также можно установить через панель Параметры (Приложения -> Управление дополнительными компонентами -> Добавить компонент). Найдите в списке Open SSH Server и нажмите кнопку Install).
Чтобы проверить, что OpenSSH сервер установлен, выполните:Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Ser*'
State : Installed
Настройка SSH сервера в Windows
После уставной сервера OpenSSH в Windows вам нужно изменить тип запуска службы sshd на автоматический и запустить службу с помощью PowerShell:
Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd
С помощью nestat убедитесь, что теперь в системе запущен SSH сервер и ждет подключений на 22 порту:
netstat -na| find ":22"
Проверьте, что включено правило брандмауэра (Windows Defender Firewall), разрешающее входящие подключения к Windows по порту TCP/22.
Get-NetFirewallRule -Name *OpenSSH-Server* |select Name, DisplayName, Description, Enabled
Name DisplayName Description Enabled ---- ----------- ----------- ------- OpenSSH-Server-In-TCP OpenSSH SSH Server (sshd) Inbound rule for OpenSSH SSH Server (sshd) True
Если правило отключено (состоянии Enabled=False) или отсутствует, вы можете создать новое входящее правило командой New-NetFirewallRule:
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
По умолчанию важным компоненты OpenSSH хранятся в следующих каталогах:
- Исполняемые файлы OpenSSH Server:
C:\Windows\System32\OpenSSH\
- Конфигурационный файл sshd_config (создается после первого запуска службы):
C:\ProgramData\ssh
- Журнал OpenSSH:
C:\windows\system32\OpenSSH\logs\sshd.log
- Файл authorized_keys и ключи:
%USERPROFILE%\.ssh\
При установке OpenSSH сервера в системе создается новый локальный пользователь sshd.
Sshd_config: Конфигурационный файл сервера OpenSSH
Вы можете изменить настройки сервере OpenSSH в конфигурационном файле %programdata%\ssh\sshd_config.
Например, чтобы запретить SSH подключение для определенного доменного пользователя (и всех пользователей указанного домена), добавьте в конце файле директивы:
DenyUsers winitpro\admin@192.168.1.10 DenyUsers corp\*
Чтобы разрешить подключение только для определенной доменной группы:
AllowGroups winitpro\sshadmins
Либо можете разрешить доступ для локальной группы:
AllowGroups sshadmins
Можно запретить вход под учетными записями с правами администратора, в этом случае для выполнения привилегированных действий в SSH сессии нужно делать runas.
DenyGroups Administrators
Следующие директивы разрешают SSH доступ по ключам (доступ к Windows через SSH по ключам рассмотрим подробно в следующей статье) и по паролю:
PubkeyAuthentication yes PasswordAuthentication yes
Вы можете изменить порт, на котором принимает подключения OpenSSH в конфигурационном файле sshd_config в директиве Port.
restart-service sshd
Подключение к Windows 10 через SSH
Теперь вы можете попробовать подключиться к своей Windows 10 через SSH клиент (я использую putty, но можно пользоваться встроенным ssh клиентом Windows).
При первом подключении появится стандартный запрос на добавление узла в список известных SSH хостов.
Нажимаем Да, и в открывшееся окне авторизуемся под пользователем Windows.
При успешном подключении запускается командная оболочка cmd.exe со строкой-приглашением.
admin@win10tst C:\Users\admin>
В командной строке вы можете выполнять различные команды, запускать скрипты и программы.
Я предпочитаю работать в командной строке PowerShell. Чтобы запустить интерпретатор PowerShell, выполните:
powershell.exe
Чтобы изменить Shell по умолчанию в OpenSSH с cmd.exe на PowerShell, внесите изменение в реестр такой командой:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String –Force
Осталось перезапустить SSH подключение и убедиться, что при подключении используется командный интерпретатор PowerShell (об этом свидетельствует приглашение PS C:\Users\admin>
).
В SSH сессии запустилась консоль PowerShell, в которой работают привычные функции: авто дополнение, раскраска модулем PSReadLine, история команд и т.д. Если текущий пользователь входит в группу локальных администраторов, то все команды в его сессии выполняются с повышенными правами даже при включенном UAC.
В статье нет ничего про авторизацию по ключам и про поддержку проброса портов. Т.е. я конечно, понимаю, что раз есть SSH сервер, то и проброс портов должен быть. Но это же делало M$, а у них свой взгляд на то что является стандартом. Тоже самое касаемо авторизацию по ключам — M$ могли «изобрести велосипед» с фирменными квадратными колесами, потому что «так лучше». Вспомним как они изобрели висту, а потом win8 с интерфейсом «метро». В обоих случаях уверяли как это удобно и классно.
В тексте я упомянул, что в следующей статье покажу авторизацию по ключам. Она работает в OpenSSH. Есть нюансы — но все довольно логично и достойно.
Как и проброс портов. Он тоже заводится. Беру на заметку и зту тему.
Подписывайтесь на обновления 🙂
Как и обещал, вот статья о пробросе портов в SSH туннеле под Windows с помощью OpenSSH. Все работает из коробки: https://winitpro.ru/index.php/2019/10/29/windows-ssh-tunneling/
Авторизация в Windows по SSH ключам: https://winitpro.ru/index.php/2019/11/13/autentifikaciya-po-ssh-klyucham-v-windows/
Подскажите, если прописываю
DenyUsers corp\*
AllowGroups corp\sshadmins
то зайти никто не может, если только группу с разрешением AllowGroups corp\sshadmins, то зайти могут все пользователи.
Как правильно прописать, если необходимо, чтобы подключиться могла только определенная группа с правами администратора, а обычные сотрудники не могли.
Спасибо.
По умолчанию могут к openssh могут подключаться все. Директивы обрабатываются в следуюшем порядке: DenyUsers, AllowUsers, DenyGroups,AllowGroups.
Если вы разрешили доступ только одной группе, остальные должны быть запрешен.
Согласно man вроде все ок:
AllowGroups
This keyword can be followed by a list of group name patterns,
separated by spaces. If specified, login is allowed only for
users whose primary group or supplementary group list matches one
of the patterns.
Попробуте создать локальную группу и добавить в нее доменную группу:
AllowGroups localsshadmin
Или попробуйте еще такой формат:
AllowGroups domain?admins
При подключении появляется упомянутое в статье окно запрос на добавление ключа. После требует авторизацию через пароль. Ввожу свой пароль, но он почему то оказывается неверным. Проверил несколько раз, ошибки точно нет. Под этим паролем я в систему вхожу. У меня пароль и пин код, не подходит ни то ни другое
Какая версия Windows 10 и ssh (Get-Command ssh.exe)?
Пробовали подключиться к разным хостам? Пароль не на русском:
Вопрос все настроил установил по умолчанию shell на powershell
Только не работает автокомплит в удаленной сесии.
Это решается как то?
Windows 10 1909 ssh клиент к Win 10 1909 ssh-сервер, автокомплит для powershell шела работает. Проверил.
Не подскажите как выводить информацию в out-gridview из ssh подключения! Окно не появляется.
get-credential выводиться в консоль, а всё что окном не увидеть. Или есть какой обход отобразить окно?pwsh 7 версия тоже не помогла.
Насколько я помню, вывод графических диалоговых окна через OpenSSH сессию не поддерживается, такие как Out-GridView, Show-Command
Но можно переключить powershell на получение параметров из консоли. Например, для Get-Credential работает такой трюк:
$key = “HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds”
Set-ItemProperty $key ConsolePrompting True
Get-Credential
А где файл для настройки клиента? (ssh_config) как на UNIX хостах.
Не могу настроить X11 н сервере.
Пользовательский конфиг
%USERPROFILE%\.ssh\config
Глобальный конфиг:
%PROGRAMDATA%\ssh\ssh_config
Настроил OpenSSH. Когда я запускаю команды git pull, push на самом компьютере все отлично работает, а когда подключаюсь через ssh удаленно и запускаю эти же команды компьютер ничего не отвечает. Не подскажете как можно решить эту проблему?
Профиль пользователя один и тот же?
ЛОги какие-то есть?
Не нашел конфигов. Только дефолтный в system32. 20H4.
SSH(Windows) штука полезная, спору нет. Настроил для себя под все наши корпоративные изолированные сети. Собственно пользую по сути только команду ping для проверки связи с локальными ip устройствами. Есть идея дать доступ выездным сотрудникам и иметь возможность так же проверять связь, НО! Сколько не искал в сети информации, всё тщетно. Как ограничить пользователя только лишь определённым перечнем вводимых команд? Логин и ping(с возвратом результата естественно) к примеру. Очень много времени отнимет банальная проверка связи, особенно когда наяривают по 50 раз за день 😉
Не понял, вы хотите ограничить команды в удаленной SSH сессии?
Как вариант PowerShell JEA — но тут нужно потроить схему, подходящую под ваши цели: _https://winitpro.ru/index.php/2020/09/29/powershell-just-enough-administration-jea-delegirovaniye-admin-prav-polzovatelyam/