Как безопасно передавать файлы с помощью SCP и SFTP через SSH

Передавайте файлы безопасно с помощью SCP и SFTP через SSH, включая практические команды, аутентификацию по ключам и более безопасные серверные средства контроля доступа.

Как безопасно передавать файлы с помощью SCP и SFTP через SSH

Передача файлов между локальными и удаленными системами является фундаментальной задачей системного администрирования и разработки. Однако использование незашифрованных протоколов, таких как стандартный FTP или R-команды, подвергает конфиденциальные данные перехвату и атакам. Протокол Secure Shell (SSH) предоставляет два надежных зашифрованных метода для передачи файлов: протокол Secure Copy (SCP) и протокол SSH File Transfer (SFTP).

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

Понимание основы: SSH

И SCP, и SFTP используют SSH (обычно работающий на порту 22) в качестве базового транспортного уровня. Когда вы инициируете передачу с помощью любого из протоколов, SSH сначала устанавливает безопасный зашифрованный туннель между клиентом и сервером. Все данные, включая учетные данные для аутентификации и содержимое файлов, передаются через этот туннель, что делает оба метода высокобезопасными альтернативами устаревшим протоколам передачи файлов.

Ключевые функции, предоставляемые основой SSH:

  • Шифрование: Все данные шифруются сквозным шифрованием.
  • Аутентификация: Поддерживает как аутентификацию по паролю, так и гораздо более безопасную аутентификацию с помощью пары открытого/закрытого ключа.
  • Целостность: Использует криптографическое хеширование для обеспечения того, чтобы файлы не были изменены во время передачи.

Протокол Secure Copy (SCP)

SCP — это сетевой протокол, основанный на протоколе удаленного копирования (rcp), но обернутый безопасностью SSH. Он разработан для простоты и скорости, что делает его идеальным для быстрых неинтерактивных передач, особенно в скриптах или автоматизации.

Особенности и характеристики SCP

  1. Простота: Использует синтаксис, очень похожий на стандартную команду Unix cp.
  2. Скорость: Часто быстр для простых одноразовых копий, хотя производительность зависит от реализации SSH, шифра, сети и набора файлов.
  3. Неинтерактивность: После запуска передача выполняется до завершения без возможности управлять сеансом или прерывать состояние передачи.

Практические команды SCP

Общий синтаксис SCP: scp [опции] [источник] [назначение].

1. Копирование файла с локального на удаленный сервер

Чтобы отправить локальный файл в домашний каталог удаленного пользователя:

scp /path/to/local/file.txt user@remote_host:/home/user/destination/

2. Копирование файла с удаленной системы на локальную

Чтобы скачать файл с сервера в текущий каталог:

scp user@remote_host:/var/log/system.log . 
# Примечание: '.' указывает на текущий локальный каталог

3. Копирование целого каталога (рекурсивно)

Используйте флаг -r (рекурсивный) для копирования каталогов и всего их содержимого:

scp -r /path/to/local/folder/ user@remote_host:/data/backups/

4. Указание нестандартного порта

Если ваш демон SSH работает на порту, отличном от 22, используйте флаг -P (обратите внимание на заглавную P):

scp -P 2222 local_file.zip user@remote_host:/tmp/

Примечание о SCP: Традиционное поведение протокола SCP имеет историю рисков, связанных с обработкой имен файлов и путей. Некоторые современные клиенты OpenSSH по умолчанию используют SFTP под капотом для scp, но не все клиенты или серверы ведут себя одинаково. Для новых рабочих процессов предпочитайте SFTP или rsync через SSH, если вам специально не нужна совместимость с SCP.

Протокол SSH File Transfer (SFTP)

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

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

  1. Интерактивный сеанс: Передачи происходят в рамках выделенного интерактивного сеанса оболочки.
  2. Надежность: Поддерживает поиск, возобновление и управление отдельными передачами в рамках сеанса.
  3. Полное управление: Позволяет выводить список (ls), менять каталоги (cd) и манипулировать удаленными и локальными файлами с помощью команд сеанса (put, get, lcd, lmkdir).
  4. Безопасность: Использует SSH для транспорта и является лучшим выбором по умолчанию для современных интерактивных передач файлов.

Практические команды SFTP

1. Инициирование SFTP-соединения

Запустите интерактивный сеанс с удаленным сервером:

sftp user@remote_host

При использовании определенного порта:

sftp -P 2222 user@remote_host

2. Интерактивные команды SFTP

После подключения вы по умолчанию работаете в удаленной среде. Используйте команды для управления передачами и каталогами:

Команда Описание Пример
ls Вывести список удаленных файлов ls -l
cd Сменить удаленный каталог cd /var/www/html
put Загрузить файл (Локальный -> Удаленный) put local_data.zip
get Скачать файл (Удаленный -> Локальный) get server_backup.tar.gz
lcd Сменить локальный каталог lcd /Users/me/downloads
lpwd Показать локальный рабочий каталог lpwd
mkdir Создать удаленный каталог mkdir new_project
quit Выйти из сеанса SFTP quit

Пример: Загрузка и скачивание в рамках сеанса SFTP

$ sftp [email protected]
sftp> cd /data/backups
sftp> lcd /home/local/reports
sftp> put daily_report.csv  # Загружает файл
Uploading daily_report.csv to /data/backups/daily_report.csv
daily_report.csv                                      100% 512KB   4.3MB/s   00:00    
sftp> get configuration.yaml  # Скачивает файл
Fetching /data/backups/configuration.yaml to configuration.yaml
configuration.yaml                                    100% 20KB    1.1MB/s   00:00    
sftp> quit

SCP против SFTP: выбор правильного инструмента

Хотя оба протокола безопасны, они служат разным операционным потребностям:

Особенность Secure Copy Protocol (SCP) SSH File Transfer Protocol (SFTP)
Механизм Простой протокол копирования (Неинтерактивный) Интерактивный протокол управления файлами (С сохранением состояния)
Случай использования Быстрые, одиночные передачи файлов; скриптинг/автоматизация. Сложные передачи; управление каталогами; интерактивные сеансы.
Скорость Часто хороша для простых копий. Обычно достаточно быстро, с большим количеством функций управления файлами.
Возобновление Ограничено; используйте другой инструмент для надежного возобновления. Поддерживает более контролируемые операции передачи, но поведение возобновления у клиентов различается.
Статус безопасности Инструмент совместимости; традиционный протокол имеет проблемы с дизайном. Лучший выбор по умолчанию для управляемой передачи файлов через SSH.

Когда использовать SCP: Используйте SCP, когда вам нужна максимальная скорость для простой передачи файлов и вы выполняете команду в скрипте, где предпочтительна неинтерактивность.

Когда использовать SFTP: Используйте SFTP практически для всех ручных передач файлов, когда вам нужно управлять несколькими файлами, менять каталоги или требуется надежность сеанса и современные функции безопасности.

Лучшие практики для безопасной передачи файлов

Использование SCP или SFTP — это только первый шаг. Правильная настройка безопасности на SSH-сервере необходима для защиты удаленной среды.

1. Отдавайте приоритет аутентификации по SSH-ключам

Аутентификация на основе пароля уязвима для атак методом перебора. Всегда используйте пары открытого/закрытого SSH-ключей для аутентификации передачи файлов. Использование ключей устраняет риск компрометации пароля во время автоматизированных или ручных передач.

Генерация ключей (при необходимости):

ssh-keygen -t ed25519 -C "file-transfer"

Использование определенного ключа для передачи:

scp -i ~/.ssh/my_transfer_key file.txt user@remote_host:/tmp/
# или
sftp -i ~/.ssh/my_transfer_key user@remote_host

2. Отключите вход root

Никогда не разрешайте прямую передачу файлов с использованием пользователя root. Передачи всегда должны выполняться выделенной учетной записью пользователя с низкими привилегиями. Если требуется административный доступ, файлы можно переместить в соответствующее место после передачи, используя sudo локально на удаленной машине.

3. Ограничьте доступ с помощью ChrootDirectory (SFTP)

Для систем, предоставляющих доступ SFTP внешним или ненадежным пользователям, реализуйте ограничения ChrootDirectory в файле sshd_config. Это изолирует пользователя SFTP в определенном каталоге, предотвращая просмотр остальной файловой системы.

Пример конфигурации в /etc/ssh/sshd_config:

Match User sftp_external_user
  ForceCommand internal-sftp
  ChrootDirectory /var/sftp/%u
  AllowTcpForwarding no
  X11Forwarding no

4. Ограничьте разрешения

Убедитесь, что учетная запись пользователя, используемая для передачи, имеет только минимальные разрешения, необходимые для ее задачи (Принцип наименьших привилегий). Если пользователю нужно только загружать файлы в /data/uploads, убедитесь, что он не может удалять файлы в /etc/config.

Вывод

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