Введение
Безопасный обмен файлами — обязательное требование при работе с конфиденциальными данными, серверной инфраструктурой или в соответствии с политиками информационной безопасности. Linux предоставляет мощные встроенные инструменты, использующие криптографию SSH для защиты передаваемой информации от перехвата и подделки. В этом руководстве вы освоите три основных метода: SCP (простое копирование), SFTP (интерактивный протокол) и предварительное шифрование файлов. Все методы работают на стандартных дистрибутивах без установки дополнительного ПО.
Требования к системе
Перед началом убедитесь, что:
- На удалённом сервере установлен и запущен SSH-сервер (
sshd). Проверьте:sudo systemctl status ssh # Ubuntu/Debian sudo systemctl status sshd # CentOS/RHEL/Fedora - На локальной машине есть SSH-клиент (обычно предустановлен).
- У вас есть учётные данные (логин и пароль или доступ по ключу) на удалённом сервере.
- Порт 22 (или кастомный SSH-порт) открыт в фаерволе сервера.
- Для шифрования GPG установите
gnupg:sudo apt install gnupg # Debian/Ubuntu sudo dnf install gnupg # Fedora/CentOS
Шаг 1: Установка и настройка SSH-сервера
Если на целевом сервере ещё не работает SSH, выполните установку:
Для Debian/Ubuntu:
sudo apt update
sudo apt install openssh-server
sudo systemctl enable --now ssh
sudo ufw allow 22/tcp # Если используете UFW
Для RHEL/CentOS/Fedora:
sudo dnf install openssh-server
sudo systemctl enable --now sshd
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload
Проверка: Подключитесь с локальной машины:
ssh пользователь@адрес_сервера
Если подключение успешно — сервер готов.
Шаг 2: Настройка аутентификации по ключам SSH
Аутентификация по паролю уязвима для брутфорса. Ключи обеспечивают безопасный автоматический вход.
2.1 Генерация ключевой пары
На локальной машине выполните:
ssh-keygen -t ed25519 -C "ваш_email@example.com"
Или для совместимости со старыми системами:
ssh-keygen -t rsa -b 4096 -C "ваш_email@example.com"
Нажмите Enter для сохранения ключа в ~/.ssh/id_ed25519 (или id_rsa). Рекомендуется задать парольную фразу (passphrase) для дополнительной защиты ключа.
2.2 Копирование публичного ключа на сервер
Самый простой способ:
ssh-copy-id пользователь@адрес_сервера
Если команды нет, скопируйте вручную:
cat ~/.ssh/id_ed25519.pub | ssh пользователь@адрес_сервера "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
2.3 Проверка и защита прав доступа
На сервере выполните:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Теперь вход должен работать без пароля (только по ключу). Проверьте:
ssh пользователь@адрес_сервера
Шаг 3: Передача файлов через SCP (Secure Copy)
SCP идеален для разовых операций копирования. Синтаксис аналогичен cp, но с указанием удалённого хоста.
3.1 Копирование с локальной машины на сервер
scp /локальный/путь/файл.txt пользователь@адрес_сервера:/удалённый/путь/
Пример с сжатием (флаг -C ускоряет передачу текстовых файлов):
scp -C archive.tar.gz user@192.168.1.10:/backup/
3.2 Копирование с сервера на локальную машину
scp пользователь@адрес_сервера:/удалённый/файл.log /локальный/путь/
3.3 Рекурсивное копирование директорий
scp -r /локальная/папка пользователь@адрес_сервера:/удалённая/папка
3.4 Копирование через нестандартный порт SSH
scp -P 2222 файл.txt user@server:/path/
⚠️ Важно: Флаг
-P(заглавная P) задаёт порт для SCP. В SSH-клиенте используется-p(строчная).
Шаг 4: Управление файлами через SFTP
SFTP даёт больше контроля: просмотр, удаление, переименование файлов в интерактивном режиме.
4.1 Подключение
sftp пользователь@адрес_сервера
Или с указанием порта:
sftp -P 2222 пользователь@адрес_сервера
4.2 Основные команды SFTP
| Команда (на сервере) | Команда (локально) | Описание |
|---|---|---|
ls | lls | Список файлов (удалённо/локально) |
cd /путь | lcd /путь | Смена директории |
put локальный_файл [удалённый_путь] | Загрузка файла на сервер | |
get удалённый_файл [локальный_путь] | Скачивание файла | |
rm файл | Удаление на сервере | |
rename старое новое | Переименование | |
mkdir папка | Создание директории | |
pwd | lpwd | Показать текущую директорию |
bye / exit | Завершить сессию |
Пример сессии:
sftp user@example.com
sftp> lcd ~/Downloads
sftp> put report.pdf /var/www/backups/
sftp> get /etc/config.yaml ~/config_backup/
sftp> bye
Шаг 5: Дополнительное шифрование файлов (GPG/OpenSSL)
Если файлы содержат сверхконфиденциальные данные (ключи, персональные данные), шифруйте их до передачи, даже если используется SSH.
5.1 Шифрование с помощью GPG (рекомендуется)
Шифрование для конкретного получателя (требуется его открытый ключ):
gpg --encrypt --recipient получатель@email.com файл.txt
Результат: файл.txt.gpg. Получатель расшифрует своим закрытым ключом:
gpg --decrypt файл.txt.gpg > файл.txt
Шифрование паролем (симметричное):
gpg -c файл.txt
Вам предложат ввести пароль. Расшифровка:
gpg -d файл.txt.gpg > файл.txt
5.2 Шифрование через OpenSSL (альтернатива)
Симметричное шифрование AES-256:
openssl enc -aes-256-cbc -salt -in файл.txt -out файл.txt.enc
Введите пароль. Расшифровка:
openssl enc -d -aes-256-cbc -in файл.txt.enc -out файл.txt
💡 Совет: Для автоматизации используйте переменные окружения или скрипты с запросом пароля через
read -s. Никогда не храните пароли в открытом виде в скриптах!
Проверка результата
После передачи убедитесь, что файлы не повреждены и зашифрованы (если использовали дополнительное шифрование).
- Проверка целостности через хеши:
На локальной машине:
sha256sum файл.txt
На сервере (после передачи):sha256sum файл.txt
Сравните вывод. Хеши должны совпадать. - Проверка шифрования:
Попробуйте открыть переданный файл (например,
.gpgили.enc). Система должна запросить пароль или ключ. Если файл открывается без пароля — шифрование не применено. - Проверка прав доступа:
Убедитесь, что на сервере у файла правильные владелец и права:
ls -l /удалённый/путь/файл.txt
Возможные проблемы и решения
Проблема 1: Permission denied (publickey,password)
Причина: Сервер не принимает ваш ключ или требует пароль. Решение:
- Проверьте, что публичный ключ добавлен в
~/.ssh/authorized_keysна сервере. - Убедитесь в правильности прав:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys. - Проверьте, что в
/etc/ssh/sshd_configразрешена аутентификация по ключу:PubkeyAuthentication yes. - Перезапустите SSH:
sudo systemctl restart ssh.
Проблема 2: Connection refused или Timeout
Причина: SSH-сервер не запущен, порт закрыт фаерволом или сервер недоступен. Решение:
- Проверьте запуск службы (см. Шаг 1).
- Проверьте фаервол:
sudo ufw status(Ubuntu) илиsudo firewall-cmd --list-all. - Убедитесь, что сервер отвечает на пинги:
ping адрес_сервера. - Если используете нестандартный порт, укажите его через
-P(SCP) или-p(SFTP).
Проблема 3: Передача прерывается на больших файлах
Причина: Нестабильное соединение, таймауты SSH. Решение:
- Включите сжатие в SCP/SFTP: добавьте флаг
-C. - Увеличьте таймауты в
~/.ssh/configна клиенте:Host * ServerAliveInterval 60 ServerAliveCountMax 3 - Разбейте файл на части:
split -b 1G большой_файл.iso часть_. - Используйте
rsyncс опцией--partialдля возобновления.
Проблема 4: Низкая скорость передачи
Причина: Ограничения сети, высокая нагрузка на диск, отсутствие сжатия. Решение:
- Используйте сжатие (
-Cв SCP, в SFTP настройте-C). - Проверьте загрузку сети:
iftopилиnethogs. - Для локальной сети убедитесь в скорости интерфейсов:
ethtool eth0. - Если передаёте множество мелких файлов, упакуйте их в архив:
tar czf archive.tar.gz папка/.
Проблема 5: Ошибки шифрования GPG/OpenSSL
Причина: Отсутствует ключ получателя, неверный пароль, повреждённый файл. Решение:
- Для GPG: проверьте наличие открытого ключа получателя:
gpg --list-keys. - Если ключа нет, запросите у получателя или импортируйте из ключевого сервера:
gpg --keyserver hkps://keys.openpgp.org --search-keys email. - Для OpenSSL: убедитесь, что используете тот же алгоритм (
-aes-256-cbc) и пароль. - Проверьте целостность зашифрованного файла:
file файл.txt.gpgдолжен показать "GPG encrypted data".
Проблема 6: SFTP не позволяет удалять/переименовывать файлы
Причина: Недостаточно прав на сервере. Решение:
- Убедитесь, что пользователь имеет права на запись в директорию:
ls -ld /путь/. - Измените владельца/права:
sudo chown пользователь:группа файлиchmod 644 файл. - Если используется
chrootв SSH, проверьте настройки вsshd_config.
Этот набор решений покрывает 90% типичных ситуаций. В остальных случаях смотрите логи SSH на сервере:
sudo tail -f /var/log/auth.log # Debian/Ubuntu
sudo tail -f /var/log/secure # CentOS/RHEL