# **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>