
Вы можете использовать встроенный в Windows пакет OpenSSH, чтобы легко обеспечить безопасную передачу файлов между клиентом и сервером Windows с помощью функции SFTP (Безопасный FTP) протокол. В этой статье мы покажем, как установить и настроить SFTP-сервер на Windows 10 или Windows Server 2022/2019/2016/2012R2.
Основные преимущества SFTP:
- Файлы и команды передаются в рамках защищенного сеанса SSH;
- Одно соединение используется для передачи и файлов, и команд;
- Поддерживаются символические ссылки, прерывание/возобновление передачи, функции удаления файлов и т.д;
- SFTP-соединение намного быстрее и надежнее на WAN-каналах, где FTP работает медленно или с перебоями;
- Возможность аутентификации с помощью ключей SSH.
Win32-порт OpenSSH (Win32-OpenSSH) встроен во все современные версии Windows по умолчанию. Вы можете использовать его для настройки безопасного SFTP-сервера вместо использования сторонних продуктов, таких как Core FTP, FileZilla, CYGWIN, 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 (Настройки -> Приложения -> Дополнительные функции -> Добавить функцию -> Открытый SSH-сервер -> Установить).
Чтобы проверить, установлен ли пакет:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
- Исполняемые файлы OpenSSH находятся в каталоге:
c:\windows\system32\OpenSSH\
; - The sshd_config файл конфигурации находится в
C:\ProgramData\ssh
(этот каталог создается после первого запуска службы sshd); - Файл журнала:
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). Нам нужна версия для Windows x64: OpenSSH-Win64.zip (4,15 МБ).
- Распакуйте архив в целевую папку: C:\OpenSSH-Win;
- Откройте повышенную строку PowerShell и переключитесь на папку OpenSSH:
Cd C:\OpenSSH-Win
- Добавьте путь к каталогу OpenSSH в поле Путь переменная окружения (Свойства системы -> вкладка Дополнительно -> Переменные окружения -> выберите и отредактируйте параметр Path системная переменная -> Добавьте путь к папке OpenSSH);
- Установите сервер OpenSSH:
.\install-sshd.ps1
(должно появиться зеленое сообщение «службы sshd и ssh-agent успешно установлены«);Если запуск сценариев PowerShell на вашем компьютере заблокирован политикой выполнения PowerShell, вы можете запустить сценарий с помощью этой команды:powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
Как настроить SFTP-сервер в Windows с помощью OpenSSH?
Теперь вам нужно настроить OpenSSH в Windows для работы в режиме SFTP.
Включите автозапуск для службы SSHD и запустите ее с помощью следующих команд PowerShell:
Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd
С помощью PowerShell откройте TCP порт 22 в брандмауэре Windows для входящего трафика SSH:
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH
netsh advfirewall firewall add rule name="SSH Port" dir=in action=allow protocol=TCP localport=22
Откройте файл конфигурации SSHD (C:\ProgramData\SSH\sshd_config
) в любом текстовом редакторе. Найдите и проверьте значение параметра Подсистема sftp директива. Директива sftp-server.exe файл должен быть указан здесь.
# only allow users in this domain group to connect to OpenSSH AllowGroups corp\sftp_users # enable password authentication (SSH keys cannot be used) AuthenticationMethods password #default (chrooot) directory for SFTP users (by default, the user connects to the directory with his profile in the C:\users\username folder) ChrootDirectory C:\SFTP ForceCommand internal-sftp #You can set an individual chrootdirectory for each user: Match User abrown ChrootDirectory c:\SFTP\abrown ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no Match User jsmith ChrootDirectory c:\SFTP\jsmith ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no
Подключение к SFTP-серверу с помощью WinSCP или PowerShell
Теперь вы можете подключиться к SSH-серверу Windows с помощью протокола SFTP. Далее мы покажем вам, как подключиться к SFTP-серверу с помощью бесплатной программы WinSCP клиент PowerShell консоль, а также встроенный sftp.exe инструмент.
В окне конфигурации соединения выберите SFTP в качестве протокола передачи файлов, укажите имя сервера и учетные данные учетной записи Windows (используйте параметр user@domain
формат для доменных пользователей), которая используется для подключения (также можно настроить аутентификацию с открытым ключом).
При первой попытке подключения появляется следующее сообщение о том, что ключ хоста не найден в локальном кэше.
Если все настроено правильно, клиент должен подключиться к SFTP-серверу и отобразить список файлов в домашнем chroot-каталоге пользователя (по умолчанию это каталог профиля пользователя).
Используя привычный интерфейс файлового менеджера (например, Total Commander), вы можете копировать файлы между сервером и клиентом, используя безопасный протокол SFTP.
Вы можете использовать Posh-SSH модуль для подключения к SFTP-серверу из PowerShell. Вы можете загрузить и установить модуль из галереи PowerShell или в автономном режиме:
Install-Module -Name Posh-SSH
Чтобы подключиться к SFTP-серверу с помощью пароля, необходимо получить имя пользователя и пароль через Get-Credential:
$usrCreds= Get-Credential
SecretManagement
для безопасного получения сохраненного пароля из менеджера учетных данных Windows или внешнего хранилища (KeePass, HashiCorp Vault, Azure Key Vault, Bitwarden и т. д.).Теперь вы можете подключиться к SFTP-серверу:
$SFTPSession = New-SFTPSession -ComputerName 192.168.3.20 -Credential $usrCreds
Теперь вы можете получить список файлов в удаленной директории на SFTP-сервере. В этом примере я получу список файлов на рабочем столе пользователя (в данном случае профилем пользователя будет корневая папка пользователя/chroot)
Get-SFTPChildItem -SFTPSession $SFTPSession -Path "desktop" –Recurse
Загрузите файл с удаленного SFTP-сервера:
Get-SFTPItem -SessionId $SFTPSession.SessionId -Path "desktop/OpenVPNScript.log" -Destination c:\PS
Чтобы загрузить файл с вашего компьютера на удаленный SFTP-хост:
Set-SFTPItem -SessionId $SFTPSession.SessionId -Path C:\PS\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 download_this_file_from_sftp.txt
Загрузите файл с компьютера на SFTP-сервер:
put file_to_uplodad.txt
Закрыть сессию:
exit
Настройка аутентификации с открытым ключом SFTP
В Windows можно включить аутентификацию SFTP на основе ключа. В этом случае вы можете аутентифицироваться на SFTP-сервере без ввода пароля.
- Создайте SSH-ключи на своем компьютере (SFTP-клиент) для пользователя, под которым вы будете подключаться к серверу:
ssh-keygen -t ed25519
- Инструмент ssh-keygen создаст два файла id_ed25519 (закрытый ключ для клиентского компьютера) и id_ed25519.pub (открытый ключ для SFTP-сервера);
- Теперь необходимо добавить SSH-ключ на сервер Windows (SFTP-хост). Скопируйте файл id_ed25519.pub (или id_rsa.pub в зависимости от типа ключа) в каталог .ssh профиля пользователя, под которым вы будете подключаться к SFTP. Переименуйте файл в authorized_keys (например, для пользователя используется следующий файл ключей
max1
:C:\Users\max1\.ssh\authorized_keys
)
Теперь вы можете использовать id_ed25519
файл для аутентификации на SFTP-сервере. Вы можете задать свой ключ в настройках WinSCP (Дополнительно -> Настройки SSH-соединения > Страница аутентификации -> Файл закрытого ключа).
Если вы хотите использовать SSH-ключ при подключении к SFTP из PowerShell, выполните следующую команду:
New-SFTPSession -ComputerName 192.168.3.20 -Credential remoteuser1 -KeyFile C:\Users\max1\.ssh\id_ed25519" -Verbose