# **OpenSSH на Windows** ###### tags: `OpenSSH` `Windows` `OpenVPN` *** ## ==Настраиваем OpenSSH сервер== 1. **Установить OpenSSH через команду PowerShell** ```bash Add-WindowsCapability -Online -Name OpenSSH.Server* ``` или через систему развёртывания образова (DISM) ```bash dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0 ``` 2. **Чтобы проверить что OpenSSH сервер установлен** ```bash Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Ser* ``` 3. **Ставим SSH службу на автозапуск** ```bash= Set-Service -Name sshd -StartupType 'Automatic' Start-Service sshd ``` 4. **Проверяем что сервер запущен и слушает 22 порт** ```bash netstat -na| Select-String ":22" ``` 5. **Брандмауэр** Проверяем активность разрешающего правила межсетевого экрана ```bash Get-NetFirewallRule -Name *OpenSSH-Server* |select Name, DisplayName, Description, Enabled ``` Если правила нет - создаём новое ```bash New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 ``` *** ## ==Настраиваем OpenSSH клиент== 1. **Проверяем что OpenSSH установлен** ```bash Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*' ``` 2. **Если клиент OpenSSH отсутствует его необходимо установить** Командой PowerShell ```bash Add-WindowsCapability -Online -Name OpenSSH.Client* ``` или через DISM ```bash dism /Online /Add-Capability /CapabilityName:OpenSSH.Client~~~~0.0.1.0 ``` 3. **Подключаемя к серверу SSH** Примеры команды для подключения по SSH ```bash ssh username@host -p port ssh root@192.168.1.202 ssh root@192.168.1.92 -i "C:\Users\username\.ssh\id_rsa" ``` *** ## ==Если вы планируете использовать для аутентификации сертификаты== **Явное указания пути к закрытому ключу** ```bash ssh root@192.168.1.92 -i "C:\Users\username\.ssh\id_rsa" ``` **Добавление закрытого ключа в SSH-Agent.** Нужно включить службу ssh-agent и настроить ее автозапуск: ```bash set-service ssh-agent StartupType ‘Automatic’ Start-Service ssh-agent ``` **Добавляем закрытый ключ в базу SSH-agent** ```bash ssh-add "C:\Users\username\.ssh\id_rsa" ``` :::info :information_source: Теперь вы можете подключиться к серверу по SSH без указания пути к RSA ключу, он будет использоваться автоматически. Пароль для подключения не запрашивается (если только вы не защитили ваш RSA ключ отдельным паролем) ::: :::info :information_source: Бинарные файлы OpenSSH находятся в каталоге `c:\windows\system32\OpenSSH\` ssh.exe – это исполняемый файл клиента SSH; scp.exe – утилита для копирования файлов в SSH сессии; ssh-keygen.exe – утилита для генерации ключей аутентификации; ssh-agent.exe – используется для управления ключами; ssh-add.exe – добавление ключа в базу ssh-агента. ::: > Еще несколько полезных аргументов SSH: > -C – сжимать трафик между клиентом и сервером (полезно на медленных и нестабильных подключениях); > -v – вывод подробной информации обо всех действия клиента ssh; > -R/-L – можно использовать для проброса портов через SSH туннель. *** ## ==Тонкие настройки SSH сервера== :::info :information_source: **Настройки SSH хранятся в конфигурационном файле %programdata%\ssh\sshd_config** ::: :eye: Чтобы изменить 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 ``` :eye: Чтобы **запретить SSH подключение для определенного доменного пользователя** (и всех пользователей указанного домена), добавьте в конце файле директивы: `DenyUsers winitpro\admin@192.168.1.10 DenyUsers corp\*` :eye: **Чтобы разрешить подключение только для определенной доменной группы:** `AllowGroups winitpro\sshadmins` :eye: Либо можете разрешить доступ **для локальной группы**: `AllowGroups sshadmins` :eye: Можно **запретить вход под учетными записями с правами администратора**, в этом случае для выполнения привилегированных действий в SSH сессии нужно делать runas. `DenyGroups Administrators` :eye: Следующие директивы разрешают **SSH доступ по ключам** и по паролю: `PubkeyAuthentication yes PasswordAuthentication yes` :eye: Вы можете **изменить порт**, на котором принимает подключения OpenSSH в конфигурационном файле sshd_config в директиве Port. **sshd - смена порта ssh 22** :::info :information_source: **После любых изменений в конфигурационном файле sshd_config нужно перезапускать службы sshd:** `restart-service sshd` ::: *** ## ==Проброс портов через SSH туннель== ====RDP доступ через SSH туннель (local TCP forwarding)==== Выполните подключение к серверу по SSH и введите команду в PowerShell по такому принципу ```Bash ssh -L 8888:локальный-IP:3389 root@удалённый-IP ``` Чтобы SSH туннель работал в **фоновом режиме**, нужно добавить **параметр –f.** Теперь, чтобы подключится к удаленному компьютеру через SSH туннель, вам нужно подключится RDP-клиентом mstsc.exe на локальный порт 8888 своего компьютера: `127.0.0.1:8888` :::danger :no_entry: **Компьютеры в вашей локальной сети тоже смогут подключиться к удаленному RDP серверу, даже если у них полностью заблокирован прямой доступ к удаленному серверу (как по SSH, так и по RDP).** Для этого, они должны подключиться RDP клиентом к порту 8888 на вашем компьютере, на котором создан SSH туннель: `mstsc.exe /v ваш-ip-адрес:8888` ::: :::success :warning: Т.е. используя проброс портов вы должны понимать что доступ по RDP к пк с которого проводится проброс должен быть ограничен! ::: *** ## ==Проброс удаленного порта на локальную машину (Remote TCP forwarding)== :::info :information_source: Прежде всего используется для публикации внутренних ресурсов на сторону удалённого пользователя через не безопасную сеть ::: Для создания обратного туннеля, используйте такую команду: ```bash ssh -R 8080:internalwebsever:80 user@192.168.1.90 ``` Теперь, чтобы на удаленном SSH сервер получить доступ к веб серверу internalwebsever достаточно в браузере набрать адрес http://localhost:8080. :::info :information_source: Во всех версиях Windows можно создать правила перенаправления портов с помощью команды `netsh interface portproxy`. ::: **Включить или отключить SSH туннелирование можно в конфигурационном файле sshd_config директивами:** ```bash AllowStreamLocalForwarding yes AllowTcpForwarding remote ``` **Для запрета тунелирования трафика нужно еще в sshd_config добавить директиву:** ```bash PermitTunnel no ``` *** :::success :alien: Системный администратор ### Паламарчук Антон :e-mail: Email: mrpalamarchuk93@gmail.com :airplane: Telegram Channel [@ipraptor_blog](https://t.me/ipraptor_blog) :incoming_envelope: Telegram [@IPraptor](https://t.me/IPraptor)** ::: *** <style> a.back{ border-radius: 4px; color: black; display:block; width:100px; text-align: center; font-weight:bold; font-family: Arial, Helvetica, sans-serif; font-size: 14px; padding: 8px 16px; margin: left; margin-top: 50px; text-decoration: none; background-color: rgb(255,237,55); } </style> <br/> <a href="/homepage/it/itmanuals" class="back">Назад</a>