С помощью встроенного пакета OpenSSH для Windows вы можете легко настроить безопасную передачу файлов между клиентом и серверов Windows по защищенному протоколу передачи файлов SFTP (Secure FTP). В этой статье мы покажем, как установить и настроить установить SFTP сервер в Windows 10/11 или Windows Server 2022/2019/2016/2012R2 с помощью встроенных средств (Win32-OpenSSH).
Основные преимущества протокола SFTP:
- Передача файлов и команд происходит внутри защищенной SSH-сессии;
- Для передачи файлов и команд используется одно соединение;
- Поддерживаются символические ссылки, доступны функций прерывания, возобновления передачи, удаления файла и другие;
- Обычно на каналах, где FTP работает медленно или с перебоями, SFTP-соединение работает более надежно и быстро;
- Возможность аутентификации с помощью SSH ключей.
В современные версии Windows по-умолчанию встроен порт OpenSSH для win32 (Win32-OpenSSH). Вы можете использовать его для организации защищенного SFTP сервера вместо таких сторониих продуктов как Core FTP, FileZilla, CYGWIN, OpenSSH, FTP Shell, IPSwitch и пр.
Установка OpenSSH в Windows
Пакет OpenSSH уже включен в операционную систему в современных билдах Windows 10 (начиная с 1803), Windows 11, Windows Server 2022/2019 в виде Feature on Demand (как и RSAT).
В этих версиях Windows вы можете установить сервер OpenSSH с помощью PowerShell:
Add-WindowsCapability -Online -Name OpenSSH.Server*
Или с помощью DISM:
dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0
Также можно установить OpenSSH из графического интерфейса Windows 10 (Settings -> Apps -> Optional Features -> Add a feature -> Open SSH Server -> Install).
Чтобы проверить, установлен ли пакет:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
Исполняемые файлы OpenSSH находятся в каталоге:
C:\windows\system32\OpenSSH\
Конфигурационный файл sshd_config находится в каталоге C:\ProgramData\ssh (каталог создается после первого запуска службы).
Лог — c:\windows\system32\OpenSSH\logs\sshd.log
Файл authorized_keys и ключи хранятся в каталоге %USERPROFILE%\.ssh\.
В предыдущих версиях Windows 10, в Windows 8.1 или в Windows Server 2016/2012 R2 вам придется скачать Win32-OpenSSH для Windows с GitHub и установить вручную (https://github.com/PowerShell/Win32-OpenSSH/releases). Нам нужна версия для 64 битной версии Windows: OpenSSH-Win64.zip (4,15 Мб).
- Распакуйте содержимое архива в целевой каталог, к примеру:
C:\OpenSSH-Win
- Запустите командную строку PowerShell с правами администратора и перейдите в каталог OpenSSH:
cd C:\OpenSSH-Win
- Добавьте путь к каталогу OpenSSH в переменную окружения Path;
- Установите сервер OpenSSH:
.\install-sshd.ps1
должно появиться зеленое сообщение “sshd and ssh-agent services successfully installed”).Если запуск скриптов PowerShell блокируется вашей политикой выполнения, можно запустить скрипт такой командой:powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
Настройка SFTP сервера на базе OpenSSH в Windows
Теперь вам нужно настроить OpenSSH для режима SFTP.
Включите автозапуск для службы SSHD и запустите ее с помощью следующих PowerShell команд управления службами:
Set-Service -Name sshd -StartupType ‘Automatic’
Start-Service sshd
С помошью PowerShell отройте в брандмауэре Windows порт TCP 22 для входящего трафика на SSH сервер:
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH
Откройте в любом текстовом редакторе конфигурационный файл «C:\ProgramData\SSH\sshd_config», найдите и проверьте значение директивы Subsystem sftp. Здесь должен быть указан файл sftp-server.exe.
# разрешить подключение к OpenSSH только для пользователей из этой группы
AllowGroups corp\admingroup
# включить аутентификацию по паролю (нельзя использовать ключи SSH)
AuthenticationMethods password ForceCommand internal-sftp
#каталог для SFTP пользователей (по умолчанию пользователь подключается в каталог со своим профилем в папке C:\users\username)
ChrootDirectory C:\SFTPRoot
#Для каждого пользователя можно индивидуальную chrootdirectory:
Match User user1 ChrootDirectory c:\SFTPRoot\user1 ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no
Match User user2 ChrootDirectory c:\SFTPRoot\user2 ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no
Подключение к SFTP серверу с помощью PowerShell и WinSCP
Теперь вы может подключиться к вашему SSH серверу на Windows по протоколу SFTP. Ниже мы покажем, как подключиться к SFTP серверу с помощью бесплатного клиента клиент WinSCP, консоли PowerShell и встроенной утилиты sftp.exe.
В окне настройки подключения выберите протокол передачи файлов SFTP, укажите имя сервера и данные учетной записи Windows (в формате
user@domain
для доменных пользователей), под которой осуществляется подключение (возможно также настроить авторизацию по ключам). При первом подключении появится окно с предупреждением о том, что ключ хоста отсутствует в локальном кеше.
При первом подключении появится окно с предупреждением о том, что ключ хоста отсутствует в локальном кеше.
Если все настроено правильно, клиент должен подключиться к SFTP серверу и отобразить список файлов в домашнем каталоге пользователя (по умолчанию каталог с профилем пользователя).
С помощью привычного интерфейса файлового менеджера можно безопасно копировать файлы между сервером и клиентом по защищённому протоколу SFTP.
Для подключения к SFTP серверу из PowerShell можно использовать модуль Posh-SSH. Вы можете скачать установить модуль из PowerShell Gallery или офлайн:
Install-Module -Name Posh-SSH
Для подключения к SFTP серверу с помощью пароля, нужно получить имя пользователя и пароль через Get-Credential:
$usrCreds= Get-Credential
Теперь можно подключиться к вашем SFTPS серверу:
$SFTPSession = New-SFTPSession -ComputerName 192.168.13.200 -Credential $usrCreds
Теперь вы можете вывести список файлов в удаленном каталоге на SFTP сервере. В этом примере я получу список файлов на рабочем столе пользователя (профиль пользователя в этом случае будет являться корнем)
Get-SFTPChildItem -SFTPSession $SFTPSession -Path "desktop" –Recurse
Чтобы скачать файл с удаленного SFTP сервера:
Get-SFTPItem -SessionId $SFTPSession.SessionId -Path "desktop/OpenVPNScript.log" -Destination c:\temp
Чтобы закачать файл с вашего компьютера на удаленный SFTP хост:
Set-SFTPItem -SessionId $SFTPSession.SessionId -Path C:\Temp\mytestfile.log -Destination “desktop”
Завершить SFTP сессию:
Remove-SFTPSession -SFTPSession $SFTPSession
В Windows вы можете использоваться встроенную утилиту sftp.exe (устанавливается вместе с клиентом OpenSSH) для подключения к SFTP серверу.
Подключиться к sftp серверу:
sftp [email protected]
Подключиться с помощью ssh ключа:
sftp -i .ssh/id_rsa [email protected]
Вывести список файлов в удаленном каталоге:
pwd
Скачать файл с SFTP в локальный каталог на ваш компьютер:
get file-test1.txt
Загрузить файл с вашего компьютера на SFTP сервер:
put file-test2.txt
Закрыть сессию:
exit
Настройка SFTP аутентификации по ключам
Вы можете настроить SFTP аутентификацию по ключам. В этом случае при подключении к SFTP серверу вам не нужно будет указывать пароль пользователя.
Для этого нужно:
- Создать на вашем компьютере (SFTP клиент) ключи для пользователя, под которым вы будете подключаться к серверу:
ssh-keygen -t ed25519
- Утилита сгенерирует два файла
id_ed25519
(закрытый ключ для клиента) иid_ed25519.pub
(открытый ключ для сервера); - Теперь нужно добавить ваш SSH ключ на сервер. Скопируйте файл id_ed25519.pub(или id_rsa.pub в зависимости от типа ключа) в каталог .ssh профиля пользователя, под которым вы будете подключаться к SFTP серверу. Переименуйте файл в authorized_keys (например для пользователя alex путь будет выглядеть так:
C:\Users\alex\.ssh\authorized_keys
)
Теперь вы можете использоваться файл id_ed25519 для аутентификации на SFTP сервере в настройках WinSCP (настройки подключения Advanced -> to SSH > Authentication page -> Private key file).
Если вы хотите задать SSH ключ при подключении к SFTP из PowerShell, используйте такую команду:
New-SFTPSession -ComputerName 192.168.13.200 -Credential user1 -KeyFile C:\Users\alex\.ssh\id_ed25519" -Verbose
аутентификацию по ключам дает ошибку:
.\install-sshlsa.ps1 : File C:\OpenSSH-Win32\install-sshlsa.ps1 cannot be loaded. The file
C:\OpenSSH-Win32\install-sshlsa.ps1 is not digitally signed. You cannot run this script on the current system. For
more information about running scripts and setting execution policy, see about_Execution_Policies at
http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\install-sshlsa.ps1
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
В свойствах файла install-sshlsa.ps1 нажмите кнопку «Разблокировать» (аналогично статье https://winitpro.ru/index.php/2015/03/06/otklyuchaem-preduprezhdenie-sistemy-bezopasnosti-v-windows-7/#h2_1)
Если не поможет придется либо подписать скрипт, либо разрешить выполнение неподписанных PosH скриптов (только в рамках данной
сессии)
Set-ExecutionPolicy -Scope MachinePolicy -ExecutionPolicy Bypass
Либо политикой:
Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell. “Turn on Script Execution” : Allow all scripts
спасибо за статью. все поднялось, по 22 порту доступно, а есть ссылки на статьи, как добавить авторизацию по ldap или как прописать пользователей, где прописывать шары, на которые будет выкидывать после авторизации. видимо эта статья это часть настройки с 0?
powershell.exe .\install-sshlsa.ps1
выпадает в ошибку:
Произошла ошибка при вызове метода, так как [Microsoft.Win32.RegistryKey] не со держит метод с именем "OpenBaseKey".
D:\openssh-win64\install-sshlsa.ps1:4 знак:50
+ $reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey <<<< ('LocalMachine', 0)
+ CategoryInfo : InvalidOperation: (OpenBaseKey:String) [], Runti
meException
+ FullyQualifiedErrorId : MethodNotFound
Какая ОС?
win7максимальная
у меня на релизе v0.0.14.0 , для устранение етой ошибки надо поменять название файла с C:\OpenSSH-Win32\install-sshlsa.ps1 на C:\OpenSSH-Win32\install-sshd.ps1
Добрый день!
При вооде команды возникает такая ошибка:
C:\OpenSSH-Win> .\ssh-keygen.exe -A
Подскажите как исправить?
Тоже самое
тоже была такая ошибка, решил запуском: .\FixHostFilePermissions.ps1
Решил созданием папки C:\ProgramData\ssh
Здравствуйте!
А для сервера 2008 R2 эта инструкция подойдет?
Не пробовал на 2008R2. Уже списывать пора его 🙂
Если получится — поделитесь инфой 🙂
Ставил на 10-ке «Add-WindowsCapability -Online -Name OpenSSH.Server*» не сработало использовал dism. У кого рус. 10-ка win+i — приложения — дополнительные компоненты — добавить компонент в итоге должно быть клиент openSSH и сервер openSSH. Потом использовал пункты (5 не стработал) 6, 7 из инструкции для «Установка Win32 OpenSSH на Windows Server 2016/2012 R2» только потом заработало. Хорошо бы статью обновить в частности инструкцию для windows 10.
Есть статья по настройке openssh в Windows 10/ Server 2019:
https://winitpro.ru/index.php/2019/10/17/windows-openssh-server/
Тупо обновите винду, 5 часов с этим дрочился, перелопатил пол интернета, а все оказалось на лодони.
А как ограничить доступ, чтоб только в одной папке можно файлы смотреть скачивать? И расписать авторизацию по ключам как сделать?
Ограничить доступ только одним каталогом можно, если создать ограниченного пользователя и через sshd_config перенеправить его в определенный каталог:
ChrootDirectory c:\users\myusername
SSH аутентификация по ключам в Windows:
https://winitpro.ru/index.php/2019/11/13/autentifikaciya-po-ssh-klyucham-v-windows/
Прошёл все по инструкции. При проверке через WinSCP выходит ошибка «Не получается использовать SFTP. На сервере вообще запущен SFTP?» Порт проверил telnet’ом — открыт. (win server 2012 r2)
Та же фигня.
При этому Putty успешно цепляется.
Обновления w10 сломали работающий SFTP
И откат обновлений не удается сделать, даже после редактирования C:\Windows\servicing\Packages\*.mum permanency=»permanent»
Два доменных сервера. На одном развернул openssh сервер. 22 порт открыт, телнет работает. Переменную прописал. Конфиг изменил, службы перезапустил. Создал локального админа, дал ему права на директорию openssh сервера. Со второго сервера запустил wincsp и удается подключиться только от доменной учетки, при указании созданного локального админа подключиться не могу — ошибка авторизации. Хочу обновить Брокейд коммутаторы 5022 и не получается. В cli ошибка: Failed to access sftp://gnv:**********@12.10.10.11/823/release.plist
The server is inaccessible or firmware path is invalid. Please make sure the server name/IP address and the firmware path are valid, the protocol and authentication are supported. It is also possible that the RSA host key could have been changed and please contact the System Administrator for adding the correct host key.
Подключаетесь в обоих случая с помощью SSH ключей? или пароль?
Покажите строку подключения к ssh, в каком формате указывете имя пользователя в случае доменного и локального
«Не получается использовать SFTP. На сервере вообще запущен SFTP?»
Пробовал на 2012, 10ках разных выпусков, он вообще сейчас работает в режиме сервера на windows?
В 10 встроенные OpenSSH.Server работает без нареканий. Вы ставили вручную из пакета с GitHub?
И что именно у вас не работает, логи, ошибки?
Встроенный да, а вот с GitHub не хочет, авторизация проходит, дальше рвет соединение. Telnet работает, порт открыт, putty в консоль подключается без проблем, сервер виден в сети, авторизация логин+пароль. Логи не посмотрю, стенд зайдействован под другие нужды на данный момент.