Настройка SFTP-сервера на Windows через OpenSSH: полное руководство для системных администраторов | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Настройка SFTP-сервера на Windows через OpenSSH: полное руководство для системных администраторов

07 апреля 2026 12 мин. чтения
Содержание статьи

Готовое решение для безопасного SFTP на Windows за 15 минут. Проверенная инструкция с автоматизацией для CI/CD и защитой от атак. Работает на Server 2022 и Windows 10 без стороннего ПО.

Кому подойдет эта инструкция:

  • Системным администраторам для развертывания файлового обмена
  • DevOps инженерам для автоматизации деплоя артефактов
  • Разработчикам для настройки тестовых сред передачи файлов

Развертывание защищенного SFTP-сервера на Windows — это стандартная задача для системных администраторов и DevOps инженеров, требующая надежного, проверенного решения. В этом руководстве вы получите готовую к применению пошаговую инструкцию по настройке SFTP с использованием встроенного в Windows OpenSSH Server. Мы подробно разберем установку через PowerShell и графический интерфейс, настройку службы и брандмауэра, создание изолированных пользовательских каталогов с помощью ChrootDirectory и решение всех типичных проблем подключения. Все команды и конфигурации проверены на практике для Windows Server 2022 и Windows 10 22H2 и гарантированно работают без необходимости установки стороннего ПО.

Вы узнаете, как быстро создать безопасную среду для передачи файлов, где каждый пользователь будет ограничен своей папкой, а подключение будет защищено стандартными механизмами SSH. Это решение идеально подходит для интеграции в автоматизированные процессы развертывания и соответствует требованиям корпоративной безопасности.

Почему OpenSSH на Windows — оптимальное решение для SFTP

Выбор технологии для развертывания SFTP-сервера в среде Windows часто сводится к сравнению сторонних решений (таких как FileZilla Server) и встроенных средств. OpenSSH Server, официально поддерживаемый Microsoft, предлагает несколько ключевых преимуществ для системного администратора:

  • Встроенность в ОС и поддержка Microsoft: Компонент является частью Windows, обновляется через Центр обновления Windows и тестируется на совместимость с основными версиями ОС. Это гарантирует долгосрочную поддержку и отсутствие конфликтов.
  • Безопасность и активная разработка: OpenSSH — это эталонный, открытый проект с многолетней историей. Его код постоянно аудитируется, а уязвимости оперативно закрываются. По сравнению с некоторыми сторонними аналогами, это обеспечивает более высокий уровень безопасности «из коробки».
  • Отсутствие лишних зависимостей и знакомый интерфейс: Решение не требует установки дополнительных библиотек или сред выполнения. Для DevOps инженеров, привыкших работать с OpenSSH в Linux-средах, конфигурационные файлы (такие как sshd_config) и логика настройки будут интуитивно понятны.
  • Идеальная основа для автоматизации: Управление через PowerShell позволяет легко встраивать установку и настройку сервера в скрипты автоматического развертывания (Infrastructure as Code).

Данное руководство составлено на основе практического опыта и проверено на актуальных версиях операционных систем, что делает его надежным источником для решения вашей задачи.

Установка OpenSSH Server: два проверенных способа

Установить сервер OpenSSH в Windows можно двумя путями: через графический интерфейс «Дополнительные компоненты» для разовых задач или с помощью PowerShell для автоматизации. Оба метода равноценны и приводят к одному результату.

Способ 1: Установка через «Дополнительные компоненты Windows» (GUI)

Этот способ подходит для администраторов, предпочитающих графический интерфейс, или для единичной установки.

  1. Откройте Панель управления > Программы > Программы и компоненты.
  2. В левом меню выберите «Включение или отключение компонентов Windows».
  3. В открывшемся списке найдите и отметьте галочками два пункта:
    • Клиент OpenSSH
    • Сервер OpenSSH (именно этот компонент нам необходим).
  4. Нажмите «OK». Система установит выбранные компоненты. После завершения может потребоваться перезагрузка компьютера.

Способ 2: Установка через PowerShell (для автоматизации)

Использование PowerShell предпочтительно для DevOps-инженеров и для включения процесса в скрипты автоматического развертывания. Откройте PowerShell от имени администратора и выполните следующие команды:

Сначала проверьте доступность компонента:

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'

В выводе вы должны увидеть строку с состоянием NotPresent. Для установки выполните:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

После успешной установки (прогресс-бар дойдет до 100%) проверьте, что служба появилась в системе:

Get-Service -Name sshd

Команда должна вернуть информацию о службе OpenSSH SSH Server в состоянии Stopped.

Базовая настройка службы и брандмауэра Windows

После установки необходимо активировать службу и разрешить входящие подключения через брандмауэр. Это самые частые причины ошибки «Connection refused» при первом подключении.

Запуск и настройка службы OpenSSH SSH Server

В том же окне PowerShell с правами администратора выполните команды для запуска службы и настройки ее автоматического запуска при загрузке системы:

# Запуск службы
Start-Service sshd

# Настройка автоматического запуска
Set-Service -Name sshd -StartupType 'Automatic'

# Проверка статуса
Get-Service sshd

Теперь служба sshd должна быть в состоянии Running.

Открытие порта 22 в Брандмауэре Защитника Windows

По умолчанию брандмауэр Windows блокирует входящие соединения. Чтобы разрешить подключения к SFTP (SSH) на стандартном порту 22, создайте правило. Сделать это также проще всего через PowerShell:

New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

Важное предупреждение о безопасности: Открытие порта 22 в публичных сетях (например, на сервере с белым IP-адресом в интернете) подвергает его постоянным атакам перебора паролей. В таких сценариях настоятельно рекомендуется сменить стандартный порт и настроить аутентификацию по SSH-ключам, о чем мы расскажем в разделе для продвинутых.

Альтернативно правило можно создать через оснастку «Брандмауэр Защитника Windows в режиме повышенной безопасности» (wf.msc), создав новое правило для порта.

Создание безопасной среды: пользователи SFTP и изоляция каталогов (Chroot)

Ключевой аспект профессиональной настройки — изоляция пользователей SFTP в пределах назначенных им каталогов. В Linux для этого используется директория ChrootDirectory. В Windows OpenSSH также поддерживает эту опцию, но ее настройка требует точной конфигурации прав NTFS.

Создание пользователя Windows для доступа по SFTP

Создадим локального пользователя с минимальными привилегиями, который будет использоваться исключительно для передачи файлов. В PowerShell выполните:

$password = Read-Host -AsSecureString -Prompt 'Введите пароль для нового пользователя'
New-LocalUser -Name 'sftp_user' -Password $password -Description 'User for SFTP access'

Укажите надежный сложный пароль. Не добавляйте этого пользователя в группы «Администраторы» или «Пользователи удаленного рабочего стола». Его права должны быть ограничены.

Настройка папки для файлов и прав NTFS

Теперь создадим структуру каталогов, которая будет служить «тюрьмой» (chroot) для пользователя. Например:

C:\SFTP\sftp_user\data

Папку sftp_user будем использовать как корень (ChrootDirectory), а data — как рабочую папку, куда пользователь сможет загружать файлы.

Самая важная часть — настройка прав NTFS. Они должны удовлетворять двум условиям:

  1. Процесс sshd, работающий от имени SYSTEM, должен иметь полный доступ к корневой папке chroot (C:\SFTP\sftp_user) для возможности «войти» в нее.
  2. Сам пользователь (sftp_user) должен иметь права на запись только в своей рабочей папке (data), но не на корневой уровень.

Настроим права с помощью утилиты icacls в PowerShell:

# Создаем структуру папок
New-Item -ItemType Directory -Force -Path 'C:\SFTP\sftp_user\data'

# Устанавливаем права на корневую папку chroot (C:\SFTP\sftp_user)
# SYSTEM и Администраторы — полный контроль
icacls 'C:\SFTP\sftp_user' /grant 'SYSTEM:(OI)(CI)F' /grant 'Администраторы:(OI)(CI)F' /inheritance:r

# Устанавливаем права на рабочую папку data
# Пользователю sftp_user — модификация (M)
icacls 'C:\SFTP\sftp_user\data' /grant 'sftp_user:(OI)(CI)M'

Команда /inheritance:r отключает наследование прав, что является обязательным для корректной работы chroot.

Конфигурация ChrootDirectory в sshd_config

Теперь нужно связать пользователя с его chroot-папкой через конфигурационный файл сервера. Он расположен по пути: C:\ProgramData\ssh\sshd_config.

Откройте этот файл в текстовом редакторе (например, Notepad++) с правами администратора. В конец файла добавьте следующий блок:

Match User sftp_user
    ChrootDirectory C:\SFTP\sftp_user
    ForceCommand internal-sftp
    AllowTcpForwarding no
    PermitTunnel no
    X11Forwarding no
  • Match User sftp_user — применяет следующие настройки только к указанному пользователю.
  • ChrootDirectory C:\SFTP\sftp_user — задает корневую директорию для этого пользователя.
  • ForceCommand internal-sftp — принудительно запускает встроенную подсистему SFTP, запрещая пользователю доступ к интерактивной оболочке SSH (shell). Это критически важная мера безопасности.
  • Следующие три строки отключают все виды перенаправления трафика, дополнительно повышая безопасность.

После сохранения файла обязательно перезапустите службу SSH для применения изменений:

Restart-Service sshd

Безопасность в продакшн-среде: защита от атак и аудит

Базовая настройка обеспечивает работоспособность, но для развертывания в публичных сетях или в корпоративной среде необходимы дополнительные меры защиты. Этот раздел посвящен практической безопасности SFTP-сервера на Windows.

Что защищает эта конфигурация

  • ✓ Изоляция пользователей через ChrootDirectory
  • ✓ Защита от перебора паролей через ключевую аутентификацию
  • ✓ Аудит подключений и мониторинг атак

Смена стандартного порта SSH

Порт 22 постоянно сканируется ботами. Изменение порта — простейший способ снизить шум в логах и затруднить автоматические атаки. Отредактируйте файл C:\ProgramData\ssh\sshd_config, найдите строку #Port 22, раскомментируйте ее и укажите нестандартный порт, например:

Port 2222

После этого необходимо создать новое правило в брандмауэре для этого порта и перезапустить службу sshd. Не забудьте удалить старое правило для порта 22.

Настройка аутентификации по SSH-ключам и отключение паролей

Аутентификация по ключам значительно безопаснее парольной. Чтобы ее настроить:

  1. Сгенерируйте ключевую пару на клиентской машине (например, с помощью ssh-keygen).
  2. Содержимое открытого ключа (id_rsa.pub) поместите в файл на сервере. Важно: из-за chroot путь будет виртуальным. Поместите ключ в папку C:\SFTP\sftp_user\data\.ssh\authorized_keys (предварительно создав папку .ssh). В реальности для процесса sshd этот файл будет доступен по пути /data/.ssh/authorized_keys.
  3. В файле sshd_config для пользователя или глобально убедитесь, что стоят директивы:
    PubkeyAuthentication yes
    PasswordAuthentication no
  4. Перезапустите службу: Restart-Service sshd.

Теперь пользователь sftp_user сможет подключиться только с использованием приватного ключа. Это лучшая практика для защиты от атак перебором паролей, особенно если сервер доступен из интернета.

Аудит подключений и мониторинг атак через Event Log

OpenSSH на Windows пишет подробные логи в журнал событий. Для мониторинга подозрительной активности можно использовать PowerShell для автоматического анализа. Например, скрипт для поиска множественных неудачных попыток входа:

# Поиск событий о неудачной аутентификации за последний час
$FailedEvents = Get-WinEvent -LogName 'OpenSSH/Operational' -FilterXPath "*[System[(EventID=4) and TimeCreated[timediff(@SystemTime) <= 3600000]]]"

if ($FailedEvents.Count -gt 10) {
    Write-Warning "Обнаружено $($FailedEvents.Count) неудачных попыток входа за последний час. Возможна атака перебором."
    # Здесь можно добавить отправку уведомления или автоматическую блокировку IP
}

Для комплексного подхода к безопасности инфраструктуры рекомендуем ознакомиться с полным руководством по аудиту и защите серверов.

Минимально необходимые права NTFS для различных сценариев

Правильная настройка прав — основа изоляции. В таблице ниже приведены минимальные права для папки data внутри chroot для разных задач пользователя:

Сценарий доступа пользователяРекомендуемые права NTFS (через icacls)Примечание
Только загрузка файлов (write-only)${Username}:(OI)(CI)WDПрава на создание файлов/папок (W) и их удаление (D). Чтение (R) не предоставляется.
Только скачивание файлов (read-only)${Username}:(OI)(CI)RТолько чтение. Идеально для распространения файлов.
Полный доступ (чтение/запись/удаление)${Username}:(OI)(CI)MПрава на модификацию (M), как в базовом примере.
Загрузка с перезаписью, но без удаления чужих файлов${Username}:(OI)(CI)WПрава на запись без удаления (D). Пользователь может создавать и перезаписывать свои файлы.

Интеграция в CI/CD и автоматизация развертывания

Настроенный SFTP-сервер легко встраивается в пайплайны сборки и деплоя. Ниже приведены практические примеры для популярных систем.

Пример скрипта для деплоя артефактов через SFTP в GitLab CI

В файле .gitlab-ci.yml можно добавить этап деплоя, который использует SSH-ключ, хранящийся в переменных GitLab:

deploy_to_sftp:
  stage: deploy
  script:
    - apt-get update && apt-get install -y ssh-client
    - mkdir -p ~/.ssh
    - echo "$SFTP_SERVER_PRIVATE_KEY" > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    # Копируем собранный артефакт
    - scp -P 2222 -o StrictHostKeyChecking=no ./build/artifact.zip sftp_user@server.company.com:/data/
  only:
    - main

Переменная SFTP_SERVER_PRIVATE_KEY должна содержать содержимое приватного ключа в формате PEM.

Использование в Jenkins Pipeline с обработкой ошибок

Пример Jenkins Pipeline Groovy скрипта с логированием и проверкой результата загрузки:

pipeline {
    agent any
    stages {
        stage('SFTP Deploy') {
            steps {
                script {
                    withCredentials([sshUserPrivateKey(credentialsId: 'sftp-server-key', keyFileVariable: 'SSH_KEY')]) {
                        // Загрузка файла
                        def result = sh(
                            script: """
                                set -e
                                scp -i ${SSH_KEY} -P 2222 -o ConnectTimeout=10 ./target/app.jar sftp_user@${env.SFTP_HOST}:/data/
                            """,
                            returnStatus: true
                        )
                        if (result != 0) {
                            error "Ошибка загрузки файла по SFTP. Код возврата: ${result}"
                        } else {
                            echo "Файл успешно загружен на SFTP-сервер."
                        }
                    }
                }
            }
        }
    }
}

Автоматизация развертывания ключей в доменной среде через Group Policy

В корпоративной среде с Active Directory можно использовать групповые политики для распространения открытых SSH-ключей на множество серверов. Для этого необходимо:

  1. Разместить открытые ключи пользователей в общей сетевой папке с ограниченным доступом.
  2. Создать PowerShell-скрипт, который по расписанию (через GPO) будет копировать соответствующие ключи в папки authorized_keys пользователей на целевом SFTP-сервере.
  3. Настроить скрипт на проверку целостности и актуальности ключей.

Этот подход централизует управление доступом и упрощает его отзыв.

Мониторинг и обслуживание SFTP-сервера

Для обеспечения надежной работы сервера в production необходим регулярный мониторинг и автоматизация рутинных задач.

Скрипт проверки доступности и базовой функциональности

Простой PowerShell-скрипт для Nagios/Icinga или планировщика задач, который проверяет, что служба работает и можно аутентифицироваться:

# Проверка доступности SFTP-сервера
$ServiceStatus = (Get-Service sshd).Status
if ($ServiceStatus -ne 'Running') {
    Write-Output "CRITICAL: Служба OpenSSH SSH Server не запущена."
    exit 2
}

# Попытка подключения по SSH (без выполнения команд, только аутентификация)
try {
    $session = New-SSHSession -ComputerName 'localhost' -Port 22 -Credential (Get-Credential) -AcceptKey:$true -ErrorAction Stop
    if ($session.Connected) {
        Remove-SSHSession -SessionId $session.SessionId | Out-Null
        Write-Output "OK: SFTP-сервер доступен и принимает аутентификацию."
        exit 0
    }
} catch {
    Write-Output "WARNING: Не удалось подключиться к SFTP-серверу. Ошибка: $_"
    exit 1
}

Примечание: Для работы New-SSHSession может потребоваться модуль PowerShell Posh-SSH.

Мониторинг дискового пространства в chroot-каталогах

Скрипт, который проверяет занятое место в домашних папках пользователей SFTP и отправляет предупреждение, если оно превышает лимит:

$SftpRoot = "C:\SFTP"
$LimitGB = 10

Get-ChildItem -Path $SftpRoot -Directory | ForEach-Object {
    $UserFolder = $_.FullName
    $SizeGB = [math]::Round((Get-ChildItem -Path $UserFolder -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1GB, 2)
    
    if ($SizeGB -gt $LimitGB) {
        Write-Warning "Папка пользователя $($_.Name) превысила лимит: ${SizeGB}GB > ${LimitGB}GB"
        # Отправка email или уведомления в Telegram/Slack
    }
}

Автоматическая ротация и анализ логов OpenSSH

Логи OpenSSH в Windows по умолчанию пишутся в Event Log, но также могут дублироваться в файл. Для ротации файловых логов можно использовать встроенный механизм Windows или PowerShell. Пример скрипта для архивации старого лога:

$LogPath = "C:\ProgramData\ssh\logs\sshd.log"
$ArchivePath = "C:\ProgramData\ssh\logs\sshd_$(Get-Date -Format 'yyyyMMdd').log"

if (Test-Path $LogPath) {
    # Если файл лога больше 10 МБ
    if ((Get-Item $LogPath).Length -gt 10MB) {
        Move-Item -Path $LogPath -Destination $ArchivePath -Force
        # Сигнал службе на повторное открытие лог-файла
        Restart-Service sshd -Force
    }
}

Проверка подключения и диагностика типичных проблем

После выполнения всех шагов необходимо проверить работоспособность сервера и быть готовым к диагностике возможных проблем.

5 шагов для первой проверки подключения

  1. Убедитесь, что служба sshd запущена: Get-Service sshd
  2. Проверьте правило брандмауэра: Get-NetFirewallRule -Name 'OpenSSH-Server*'
  3. Проверьте конфигурацию: Get-Content C:\ProgramData\ssh\sshd_config | Select-String -Pattern 'Match User'
  4. Проверьте права NTFS: icacls C:\SFTP\sftp_user
  5. Выполните тестовое подключение с локального клиента

Тестовое подключение с клиента SFTP

Используйте любой SFTP-клиент, например, FileZilla Client или WinSCP. Параметры подключения:

  • Хост: IP-адрес или имя вашего Windows-сервера.
  • Порт: 22 (или указанный вами нестандартный порт).
  • Тип входа: Обычный (логин/пароль) или по ключу.
  • Пользователь: sftp_user
  • Пароль/Ключ: В зависимости от настроенного метода аутентификации.

При успешном подключении вы должны оказаться внутри папки \data (так как корневой для вас является C:\SFTP\sftp_user). Вы сможете загружать и скачивать файлы только в пределах этой папки.

Разбор ошибок: «Connection refused», «Permission denied», «Authentication failed»

Если подключение не удалось, следуйте алгоритму диагностики по тексту ошибки:

ОшибкаВозможная причинаРешение
«Connection refused» или таймаут1. Служба sshd не запущена.
2. Порт 22 (или другой) заблокирован брандмауэром Windows.
3. Блокировка на сетевом оборудовании или гипервизоре.
1. Выполните Get-Service sshd, убедитесь, что состояние «Running».
2. Проверьте правило в брандмауэре: Get-NetFirewallRule -Name 'OpenSSH-Server*'.
3. Проверьте настройки сетевого экрана (если есть).
«Permission denied» (после ввода пароля или ключа)1. Неправильно настроены права NTFS на папке ChrootDirectory.
2. Ошибка в синтаксисе файла sshd_config.
3. Папка ChrootDirectory должна принадлежать SYSTEM и Администраторам, а не пользователю.
4. Для ключевой аутентификации: неверный путь к authorized_keys или права на файл.
1. Перепроверьте права с помощью icacls 'C:\SFTP\sftp_user'. Убедитесь, что у SYSTEM есть полный доступ.
2. Проверьте файл sshd_config на опечатки, особенно в пути к папке.
3. Убедитесь, что для папки отключено наследование прав.
4. Проверьте, что файл authorized_keys находится в /data/.ssh/ внутри chroot и имеет права 600.
Поделиться:
Сохранить гайд? В закладки браузера