Настройка SFTP-сервера на Centos 7
- Подготовьте облако к работе
- Создайте виртуальную машину для SFTP-сервера
- Настройте SFTP-сервер
- Создайте SFTP-пользователя
- Создайте виртуальную машину для SFTP-клиента
- Создайте резервную копию конфигурационных файлов на SFTP-сервере
- Настройте расписание для резервного копирования
- Проверьте работоспособность резервного копирования
- Восстановите настройки из резервной копии
- Проверьте корректность восстановления
- Удалите созданные облачные ресурсы
С помощью этой инструкции вы научитесь:
- разворачивать SFTP-сервер в инфраструктуре Yandex.Cloud;
- выполнять резервное копирование конфигурационных файлов с SFTP-клиента на SFTP-сервер по расписанию.
Чтобы развернуть нужную инфраструктуру, следуйте инструкциям:
- Подготовьте облако к работе.
- Создайте виртуальную машину для SFTP-сервера.
- Настройте SFTP-сервер.
- Создайте SFTP-пользователя.
- Создайте виртуальную машину для SFTP-клиента.
- Сделайте бэкап конфигурационных файлов на SFTP-сервер.
- Настройте расписание для бэкапа.
- Проверьте работоспособность бэкапа.
- Восстановите настройки из бэкапа.
- Проверьте корректность восстановления.
- Удалите созданные облачные ресурсы.
Подготовьте облако к работе
Перед тем, как разворачивать сервер, нужно зарегистрироваться в Yandex.Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex.Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша виртуальная машина. Перейдите на страницу облака и выберите или создайте каталог, в котором вы хотите создать виртуальную машину для вашего сервера. Подробнее об иерархии ресурсов Yandex.Cloud.
Необходимые платные ресурсы
В стоимость инфраструктуры для примера входит:
- плата за две постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud):
- виртуальная машина для SFTP-клиента;
- виртуальная машина для SFTP-сервера.
- плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Создайте виртуальную машину для SFTP-сервера
Чтобы создать виртуальную машину:
-
На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите пункт Виртуальная машина.
-
В поле Имя введите имя виртуальной машины, например
sftp-server
.- Длина — от 3 до 63 символов.
- Может содержать строчные буквы латинского алфавита, цифры и дефисы.
- Первый символ — буква. Последний символ — не дефис.
-
Выберите зону доступности, в которой должна находиться виртуальная машина.
-
В блоке Образы из Cloud Marketplace выберите образ Centos 7.
-
В блоке Вычислительные ресурсы выберите следующую конфигурацию:
- Платформа — Intel Cascade Lake.
- Гарантированная доля vCPU — 20%.
- vCPU — 2.
- RAM — 2 ГБ.
-
В блоке Сетевые настройки выберите сеть и подсеть, к которым нужно подключить виртуальную машину. Если нужной сети или подсети еще нет, вы можете создать их на странице создания виртуальной машины.
-
В поле Публичный адрес оставьте значение Автоматически, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Yandex.Cloud. Чтобы внешний IP-адрес не изменялся после остановки виртуальной машины, сделайте его статическим.
-
Укажите данные для доступа на виртуальную машину:
- В поле Логин введите имя пользователя.
- В поле SSH-ключ вставьте содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно, см. раздел о подключении к виртуальным машинам по SSH.
Внимание
IP-адрес и имя хоста (FQDN) для подключения к машине будут назначены ей при создании. Если вы выбрали вариант Без адреса в поле Публичный адрес, вы не сможете обращаться к виртуальной машине из интернета.
-
Нажмите кнопку Создать ВМ.
Создание виртуальной машины может занять несколько минут.
Настройте SFTP-сервер
Функционал SFTP-сервера включен в стандартную программу SSH, которая поставляется с дистрибутивом Centos 7. Для настройки SFTP-сервера отредактируйте конфигурационный файл /etc/ssh/sshd_config
:
-
Откройте конфигурационный файл в редакторе vi. Этот редактор поставляется с дистрибутивом и не требует установки. Если вы не знакомы с этим редактором, то подробности вы можете узнать в официальной документации.
$ sudo vi /etc/ssh/sshd_config
-
Добавьте следующие строчки в конец файла:
Match User fuser ForceCommand internal-sftp PasswordAuthentication no ChrootDirectory /var/sftp PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
Назначение параметров:
Match User fuser
- указывает на то, что все последующие строчки будут применены только при подключении пользователяfuser
.ForceCommand internal-sftp
— подключать пользователя только в режиме SFTP и не разрешать доступ в shell.PasswordAuthentication no
— отключить доступ по логину и паролю.ChrootDirectory /var/sftp
— ограничить доступ пользователя только в рамках папки/var/sftp
.PermitTunnel no
,AllowAgentForwarding no
,AllowTcpForwarding no
,X11Forwarding no
- отключить туннелирование, проброс портов и графических приложений через SSH-сессию.
-
Сохраните файл.
-
Выведите конфигурационный файл без закомментированных и пустых строк:
$ cat /etc/ssh/sshd_config | grep -v -e '^#' -e '^$'
-
Убедитесь, что вывод предыдущей команды совпадает с данными строками:
HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server Match User fuser ForceCommand internal-sftp PasswordAuthentication no ChrootDirectory /var/sftp PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
-
Сохраните файл.
-
Перезагрузите SFTP-сервис, чтобы настройки вступили в силу:
$ sudo systemctl restart sshd
-
Создайте группу для SFTP-пользователей:
$ sudo groupadd ftpusers
-
Создайте папки для сохранения файлов:
$ sudo mkdir -p /var/sftp/backups
sftp
— корневая папка SFTP-сервера.backups
— папка для хранения резервных копий на SFTP-сервере.
-
Установите разрешения на папки таким образом, чтобы все пользователи, входящие в состав группы
ftpusers
могли записывать и читать файлы на SFTP-сервере:$ sudo chown root:ftpusers /var/sftp/backups $ sudo chmod 770 /var/sftp/backups
-
Проверьте корректность выставленных разрешений:
$ ls -la /var | grep sftp $ ls -la /var/sftp
Результат должен быть следующим:
drwxr-xr-x. 4 root root 37 Aug 7 11:35 sftp drwxrwx---. 2 root ftpusers 80 Aug 7 08:41 backups
Создайте SFTP-пользователя
-
Создайте SFTP-пользователя, например
fuser
:$ sudo useradd fuser
-
Создайте пароль для SFTP-пользователя
$ sudo passwd fuser
-
Создайте SSH-ключи для пользователя
fuser
. Команда должна выполняться от имени пользователяfuser
:$ sudo runuser -l fuser -c 'ssh-keygen'
Процесс генерации ключа приведен ниже. Поле
passphrase
оставьте пустым.[yc-user@ftp-server ~]$ sudo runuser -l fuser -c 'ssh-keygen' Generating public/private rsa key pair. Enter file in which to save the key (/home/fuser/.ssh/id_rsa): Created directory '/home/fuser/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/fuser/.ssh/id_rsa. Your public key has been saved in /home/fuser/.ssh/id_rsa.pub. The key fingerprint is: SHA256:S2jRD3/A6ClHW/RZUOeOrl6BsK3pfWdhusGBGZiHE44 fuser@ftp-server.ru-central1.internal The key's randomart image is: +---[RSA 2048]----+ | .. .oo .| | .o+=. o o | | .E=*=oo .| | = Bo=+. o | | + S +o+.o .| | . + . +...+ | | . o o= .| | . . +o o| | ..+o.o | +----[SHA256]-----+
-
Создайте файл для сохранения публичных SSH-ключей SFTP-клиента. Поставьте нужные разрешения.
$ sudo touch /home/fuser/.ssh/authorized_keys $ sudo chmod 600 /home/fuser/.ssh/authorized_keys $ sudo chown fuser:fuser /home/fuser/.ssh/authorized_keys
-
Убедитесь, что разрешения выставлены верно:
$ ls -la /home/fuser/.ssh/
Вывод должен быть таким:
-rw-------. 1 fuser fuser 421 Aug 7 08:31 authorized_keys -rw-------. 1 fuser fuser 1675 Aug 7 08:29 id_rsa -rw-r--r--. 1 fuser fuser 419 Aug 7 08:29 id_rsa.pub
-
Добавьте SFTP-пользователя в SFTP-группу:
$ sudo usermod -G ftpusers fuser
Создайте виртуальную машину для SFTP-клиента
Процесс создания виртуальной машины для SFTP-клиента полностью совпадает с созданием виртуальной машины для SFTP-сервера.
-
Выполните пункты 1-9 из раздела создание виртуальной машины для SFTP-сервера (в качестве имени машины укажите, например,
sftp-client
). -
Создайте пару SSH-ключей на SFTP-клиенте. Процесс аналогичен описанному для пользователя
fuser
в предыдущем разделе:$ ssh-keygen
-
Выведите публичный ключ на экране SFTP-клиента:
$ cat ~/.ssh/id_rsa.pub
-
Зайдите на SFTP-сервер и откройте файл
/home/fuser/.ssh/authorized_keys
:$ sudo vi /home/fuser/.ssh/authorized_keys
-
Скопируйте SSH-ключ, полученный на SFTP-клиенте, в конец файла.
-
Сохраните файл.
-
Убедитесь, что виртуальная машина SFTP-клиента доступна с SFTP-сервера, и наоборот:
-
Зайдите по SSH на SFTP-сервер.
-
Найдите публичный или внутренний IP адрес SFTP-клиента в консоли Yandex.Cloud в разделе настроек виртуальной машины.
Важно
Внутренние адреса SFTP-клиента и SFTP-сервера должны находиться в одной подсети или быть связаны через настройки маршрутизации.
-
Введите команду в терминале SFTP-сервера, подставив соответствующее значение:
$ ping <IP адрес SFTP-клиента>
-
Убедитесь, что пакеты отправляются и получаются успешно:
$ ping 84.201.170.171 PING 84.201.170.171 (84.201.170.171) 56(84) bytes of data. 64 bytes from 84.201.170.171: icmp_seq=1 ttl=55 time=8.59 ms 64 bytes from 84.201.170.171: icmp_seq=2 ttl=55 time=6.32 ms 64 bytes from 84.201.170.171: icmp_seq=3 ttl=55 time=5.95 ms ^C --- 84.201.170.171 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 5.955/6.959/8.595/1.168 ms
-
Повторите проверку на SFTP-клиенте.
-
Создайте резервную копию конфигурационных файлов на SFTP-сервере
В инструкции рассмотрено резервное копирование конфигурационных файлов (с расширением .conf
) из папки /etc
.
Процесс резервного копирования:
- Упакуйте все нужные конфигурационные файлы в архив.
- Передайте архив на SFTP-сервер.
- Удалите архив на SFTP-клиенте.
Чтобы настроить процесс резервного копирования:
-
Зайдите по SSH на виртуальную машину SFTP-клиента таким же способом, как это было проделано для SFTP-сервера.
-
Установите переменные окружения для корректной работы скрипта. Для этого откройте файл
~/.bash_profile
$ vi ~/.bash_profile
-
Добавьте следующие строчки в конец файла, подставив нужные значения:
$ export SFTP_SERVER=<IP адрес SFTP-клиента> $ export SFTP_USER='fuser'
-
Примените настройки:
$ source ~/.bash_profile
-
Проверьте, что у вас появились данные переменные:
$ env | grep SFTP
На экране должно появиться:
SFTP_USER=fuser SFTP_SERVER=10.128.0.5
-
Запакуйте все конфигурационные файлы в один архив:
$ sudo find /etc -type f -name *.conf -print0 | sudo tar -czf backup.tar.gz --null -T -
sudo find /etc -type f -name *.conf -print0
— поиск всех файлов.conf
из папки/etc
.sudo tar -czf backup.tar.gz --null -T -
— перемещение конфигурационных файлов в архивbackup.tar.gz
.
-
Перешлите полученный архив на SFTP-сервер:
$ url -T backup.tar.gz sftp://$SFTP_SERVER/backups/backup_$(hostname)_$(date "+%Y%m%d_%H%M%S").tar.gz --insecure --user $SFTP_USER:
-
-T
— загрузить файлbackup.tar.gz
на удаленный сервер. -
$SFTP_SERVER
– переменная, которая автоматически примет значение IP адреса SFTP-сервера. -
backup_$(hostname)_$(date "+%Y%m%d_%H%M%S").tar.gz
— добавить к названию архива название компьютера, а также дату и время, когда был создан архив. Это позволит не потеряться в навигации по списку резервных копий на сервере.Например, имя архива на сервере может выглядеть так:
backup_ftp-server.ru-central1.internal_20190803_180228.tar.gz
. -
--insecure
— отключить проверку SSL сертификатов со стороны SFTP-сервера. При этом трафик в рамках SSH-сессии все равно шифруется. -
$SFTP_USER
– переменная, которая автоматически примет значение SFTP-пользователя.
-
-
Удалите архив на SFTP-клиенте:
$ sudo rm -f backup.tar.gz
Все действия для создания резервной копии можно выполнить одной командой:
$ sudo find /etc -type f -name *.conf -print0 | sudo tar -czf backup.tar.gz --null -T -&& curl -T backup.tar.gz sftp://$SFTP_SERVER/backups/backup_$(hostname)_$(date "+%Y%m%d_%H%M%S").tar.gz --insecure --user $SFTP_USER: && sudo rm -f backup.tar.gz
Настройте расписание для резервного копирования
Для создания регулярных резервных копий ваших настроек можно использовать встроенную программу crontab
.
-
Откройте файл
crontab
для редактирования:$ crontab -e
-
Добавьте следующую строку, чтобы запускать резервное копирование каждый день в 11 часов вечера:
0 23 * * * sudo find /etc -type f -name *.conf -print0 | sudo tar -czf backup.tar.gz --null -T -&& curl -T backup.tar.gz sftp://$SFTP_SERVER/backups/backup_$(hostname)_$(date "+%Y%m%d_%H%M%S").tar.gz --insecure --user $SFTP_USER: && sudo rm -f backup.tar.gz
Проверьте работоспособность резервного копирования
Чтобы убедиться в том, что резервная копия создается нужным образом, запустите копирование и найдите копию на сервере:
-
Запустите на SFTP-клиенте команду для резервного копирования:
$ sudo find /etc -type f -name *.conf -print0 | sudo tar -czf backup.tar.gz --null -T -&& curl -T backup.tar.gz sftp://$SFTP_SERVER/backups/backup_$(hostname)_$(date "+%Y%m%d_%H%M%S").tar.gz --insecure --user $SFTP_USER: && sudo rm -f backup.tar.gz
-
Зайдите на SFTP-сервер и убедитесь, что файл вида
backup_ftp-server.ru-central1.internal_20190803_180228.tar.gz
появился в домашнем каталоге SFTP-пользователя. Для этого на SFTP-сервере запустите команду:$ sudo ls /var/sftp/backups
Восстановите настройки из резервной копии
Процесс восстановления настроек:
- Скачайте резервную копию с SFTP-сервера на SFTP-клиент.
- Распакуйте архив.
- Скопируйте конфигурационные файлы из архива в систему.
- Удалите архив.
Чтобы восстановить настройки из резервной копии:
-
На SFTP-сервере в папке
/var/sftp/backups
выберите резервную копию, из которой следует восстановить конфигурационные файлы. Например, это будетbackup_ftp-server.ru-central1.internal_20190803_180228.tar.gz
. -
На SFTP-клиенте сделайте переменную окружения для названия файла резервной копии:
SFTP_BACKUP='backup_ftp-server.ru-central1.internal_20190803_180228.tar.gz'
-
Скачайте резервную копию с SFTP-сервера на SFTP-клиент:
$ sftp $SFTP_USER@$SFTP_SERVER:/backups/$SFTP_BACKUP .
-
Распакуйте архив:
$ tar -xzf $SFTP_BACKUP
-
Скопируйте конфигурационные файлы из архива в систему (
yes
— избегать ввода подтверждения при перезаписи файлов):$ yes | cp -rfp etc /
-
Удалите архив и распакованное содержимое:
$ rm -f $SFTP_BACKUP $ rm -rfd etc
Все действия для восстановления из резервной копии можно выполнить одной командой:
$ sftp $SFTP_USER@$SFTP_SERVER:/backups/$SFTP_BACKUP . && tar -xzf $SFTP_BACKUP && yes | cp -rfp etc / && rm -rfd etc && rm -f $SFTP_BACKUP
Проверьте корректность восстановления
Чтобы проверить, что конфигурационные файлы из архива успешно попадают в файловую систему, добавьте проверочный блок в команду полученную выше:
$ sftp $SFTP_USER@$SFTP_SERVER:/backups/$SFTP_BACKUP . && tar -xzf $SFTP_BACKUP && echo "## this is from backup" >> etc/yum.conf && yes | cp -rfp etc / && rm -rfd etc && rm -f $SFTP_BACKUP
Команда echo "## this is from backup" >> etc/yum.conf
записывает тестовую фразу "## this is from backup" в конец файла etc/yum.conf
, распакованного из архива.
После восстановления из резервной копии выполните следующую команду:
$ cat /etc/yum.conf | grep backup
Убедитесь, что на экране отображается тестовая фраза:
## this is from backup
Удалите созданные облачные ресурсы
Если вам больше не нужны SFTP-сервер и SFTP-клиент:
- Удалите виртуальные машины для SFTP-клиента и SFTP-сервера (в примере они названы
sftp-server
иsftp-client
). - Удалите статический IP адрес, если он был вами создан.