SFTP (SSH FTP) на Windows Server 2012 R2

Продолжаем разговор о способах безопасной передачи файлов между клиентом и сервером на базе Windows Server 2012 R2. В прошлый раз мы рассмотрели применение протокола FTPS, как безопасного расширения протокола передачи файлов FTP. Сегодня мы остановимся на особенностях протокола передачи файлов SFTP (Secure FTP) и его применения в ОС семейства Windows Server.

Особенности протокола SFTP

Протокол SFTP (Secret File Transfer Protocol , Secure FTP или SSH FTP) является расширением протокола SSH, являющимся стандартом мира UNIX/Linux систем. Хотя с точки зрения пользователей он похож на FTP, но на самом деле это абсолютно другой протокол, не имеющий с FTP ничего общего. Данные между клиентом и сервером передаются по порту 22 через SSH туннель.

Основные преимущества протокола SFTP:

  • Передача файлов и команд происходит внутри защищенной SSH-сессии
  • Для передачи файлов и команд используется одно соединение
  • Поддержка символических ссылок, функций прерывания, возобновления передачи, удаления файла и пр.
  • Как правило, на каналах, где FTP работает медленно или с перебоем, SFTP-соединение работает более надежно и быстро
  • Возможность аутентификации с помощью SSH ключей

Реализация SFTP в системах Windows

Операционные системы Microsoft не предоставляют встроенных средств организации защищенного SFTP сервера. Для этих целей обычно использовались открытые или коммерческие решения, к примеру, Core FTP, FileZilla, CYGWIN, OpenSSH, FTP Shell, IPSwitch и пр.

Однако в октябре 2015 команда разработчиков Microsoft по направлению PowerShell анонсировала выход предварительной версии OpenSSH для Windows, являющейся портом OpenSSH для win32.

Примечание. На данный момент проект Win32-OpenSSH имеет предрелизный статус. По планам разработчиков в течении этого года проект будет выпущен финальный релиз.

Рассмотрим процесс настройки SFTP сервера на Windows Server 2012 R2 с помощью пакета Win32 OpenSSH.

Установка Win32 OpenSSH на Windows Server 2012 R2

Скачать скомпилированную версию пакета можно здесь: https://github.com/PowerShell/Win32-OpenSSH/releases. Нам нужна версия для 64 битной версии Wndows: OpenSSH-Win64.zip (4 Мб)

  1. Распаковываем содержимое архива в целевой каталог, к примеру: C:\OpenSSH-Win
  2. Запускаем командную строку PowerShell с правами администратора и переходим в каталог OpenSSH:

    Cd C:\OpenSSH-Win

  3. Сгенерируем SSH ключи сервера (нужны для запуска службы sshd):

    ssh-keygen.exe -AУстановка OpenSSH на Windows Server

    generating new host keys: RSA DSA ECDSA ED25519

  4. Разрешим в файерволе Windows входящий трафик на порт 22 (наш SSH сервер):

    New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSHПравило файервола для SSHD порт 22

    Примечание. Предыдущая команда не будет работать на клиентской ОС. В этом случае используется другая команда:

    netsh advfirewall firewall add rule name='SSH Port' dir=in action=allow protocol=TCP localport=22

  5. Чтобы разрешить аутентификацию по ключам:

    powershell.exe .\install-sshlsa.ps1

  6. Перезагрузите сервер:

    Restart-Computer

  7. Откройте в любом текстовом редакторе конфигурационный файл C:\OpenSSH-Win\sshd_config, найдите и измените значение директивы Subsystem sftp на C:\OpenSSH-Win\sftp-server.exe Subsystem sftp
  8. Установим службу sshd

    .\sshd.exe install
    Установка службы sshd.exe

  9. Укажем, что она должна запускаться автоматически при старте системы и запустим ее:

    Set-Service sshd -StartupType Automatic

    Start-Service sshd

Примечание. В моем случае служба SSHD на Windows Server 2012 R2 отказалась запускаться с ошибкой:

net start sshd

The SSHD service is starting.
The SSHD service could not be started.
A system error has occurred.
System error 1067 has occurred.
The process terminated unexpectedly.

The SSHD service could not be started System error 1067 has occurred

При ручном запуске файла sshd.exe без параметров ошибка более информативная, но все равно не достаточная для решения проблемы.

.\sshd.exe

[Build Mar 19 2016 22:36:41]
key_load_private: insufficient buffer space
Could not load host key: ssh_host_rsa_key
key_load_private: insufficient buffer space
Could not load host key: ssh_host_dsa_key
key_load_private: insufficient buffer space
Could not load host key: ssh_host_ecdsa_key
key_load_private: insufficient buffer space
Could not load host key: ssh_host_ed25519_key
Disabling protocol version 2. Could not load host key

key_load_private: insufficient buffer space

Как оказалось, это известная бага релиза от 19.03.2016. Разработчики обещают исправить ее в следующих релизах. Пока рекомендуется использовать версию OpenSSH-Win64-1.1.

Тестируем SFTP подключение

Попробуем подключиться к поднятому нами SSH серверу по протоколу SFTP. Для этих целей воспользуемся свободным клиентом WinSCP.

В окне настройки подключения выберем протокол передачи файлов SFTP, укажем им сервера и авторизационные данные учетной записи Windows, под которой осуществляется подключение (возможно также настроить авторизацию по ключам).

winscp настройки sftp подключенияПри первом подключении появится окно с предупреждением о том, что ключ хоста отсутствует в локальном кеше.

key-warningЕсли все настроено правильно, клиент должен подключиться к SFTP серверу и отобразить список файлов в домашнем каталоге пользователя (по умолчанию каталог с профилем пользователя).

С помощью привычного интерфейса файлового менеджера можно безопасно копировать файлы между сервером и клиентом. Передача файлов будет осуществляться по защищённому протоколу SFTP.

sftp подключение в winscp

Удаление службы Win32 OpenSSH

Чтобы корректно удалить службу Win32 OpenSSH из системы:

  1. Откроем консоль Powershell с правами администратора
  2. Остановим службу SSHD:

    Stop-Service sshd

  3. Удалим службу:

    .\sshd.exe uninstall

  4. Удалим ключи:

    powershell .\uninstall-sshlsa.ps1


Предыдущая статья Следующая статья

Комментариев: 7 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)