Настройка SFTP-сервера на Centos 7

С помощью этой инструкции вы научитесь:

  • разворачивать SFTP-сервер в инфраструктуре Яндекс.Облака;
  • выполнять резервное копирование конфигурационных файлов с SFTP-клиента на SFTP-сервер по расписанию.

Чтобы развернуть нужную инфраструктуру, следуйте инструкциям:

  1. Подготовьте облако к работе.
  2. Создайте виртуальную машину для SFTP-сервера.
  3. Настройте SFTP-сервер.
  4. Создайте SFTP-пользователя.
  5. Создайте виртуальную машину для SFTP-клиента.
  6. Сделайте бэкап конфигурационных файлов на SFTP-сервер.
  7. Настройте расписание для бэкапа.
  8. Проверьте работоспособность бэкапа.
  9. Восстановите настройки из бэкапа.
  10. Проверьте корректность восстановления.
  11. Удалите созданные облачные ресурсы.

Подготовьте облако к работе

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

  1. Перейдите в консоль управления, затем войдите в Облако или зарегистрируйтесь, если вы еще не зарегистрированы.
  2. На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша виртуальная машина. Перейдите на страницу облака и выберите или создайте каталог, в котором вы хотите создать виртуальную машину для вашего сервера. Подробнее об иерархии ресурсов Облака.

Необходимые платные ресурсы

В стоимость инфраструктуры для примера входит:

  • плата за две постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud):
    • виртуальная машина для SFTP-клиента;
    • виртуальная машина для SFTP-сервера.
  • плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud).

Создайте виртуальную машину для SFTP-сервера

Чтобы создать виртуальную машину:

  1. На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите пункт Виртуальная машина.

  2. В поле Имя введите имя виртуальной машины, например sftp-server.

    • Длина — от 3 до 63 символов.
    • Может содержать строчные буквы латинского алфавита, цифры и дефисы.
    • Первый символ — буква. Последний символ — не дефис.
  3. Выберите зону доступности, в которой должна находиться виртуальная машина.

  4. В блоке Публичные образы выберите образ Centos 7.

  5. В блоке Вычислительные ресурсы выберите следующую конфигурацию:

    • Платформа — Intel Cascade Lake.
    • Гарантированная доля vCPU — 20%.
    • vCPU — 2.
    • RAM — 2 ГБ.
  6. В блоке Сетевые настройки выберите сеть и подсеть, к которым нужно подключить виртуальную машину. Если нужной сети или подсети еще нет, вы можете создать их на странице создания виртуальной машины.

  7. В поле Публичный адрес оставьте значение Автоматически, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Яндекс.Облака. Чтобы внешний IP-адрес не изменялся после остановки виртуальной машины, сделайте его статическим.

  8. Укажите данные для доступа на виртуальную машину:

    Предупреждение

    IP-адрес и имя хоста (FQDN) для подключения к машине будут назначены ей при создании. Если вы выбрали вариант Без адреса в поле Публичный адрес, вы не сможете обращаться к виртуальной машине из интернета.

  9. Нажмите кнопку Создать ВМ.

Создание виртуальной машины может занять несколько минут.

Настройте SFTP-сервер

Функционал SFTP-сервера включен в стандартную программу SSH, которая поставляется с дистрибутивом Centos 7. Для настройки SFTP-сервера отредактируйте конфигурационный файл /etc/ssh/sshd_config:

  1. Откройте конфигурационный файл в редакторе vi. Этот редактор поставляется с дистрибутивом и не требует установки. Если вы не знакомы с этим редактором, то подробности вы можете узнать в официальной документации.

    $ sudo vi /etc/ssh/sshd_config
    
  2. Добавьте следующие строчки в конец файла:

    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-сессию.
  3. Сохраните файл.

  4. Выведите конфигурационный файл без закомментированных и пустых строк:

    $ cat /etc/ssh/sshd_config | grep -v -e '^#' -e '^$'
    
  5. Убедитесь, что вывод предыдущей команды совпадает с данными строками:

    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
    
  6. Сохраните файл.

  7. Перезагрузите SFTP-сервис, чтобы настройки вступили в силу:

    $ sudo systemctl restart sshd
    
  8. Создайте группу для SFTP-пользователей:

    $ sudo groupadd ftpusers
    
  9. Создайте папки для сохранения файлов:

    $ sudo mkdir -p /var/sftp/backups
    
    • sftp — корневая папка SFTP-сервера.
    • backups — папка для хранения резервных копий на SFTP-сервере.
  10. Установите разрешения на папки таким образом, чтобы все пользователи, входящие в состав группы ftpusers могли записывать и читать файлы на SFTP-сервере:

    $ sudo chown root:ftpusers /var/sftp/backups
    $ sudo chmod 770 /var/sftp/backups
    
  11. Проверьте корректность выставленных разрешений:

    $ 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-пользователя

  1. Создайте SFTP-пользователя, например fuser:

    $ sudo useradd fuser
    
  2. Создайте пароль для SFTP-пользователя

    $ sudo passwd fuser
    
  3. Создайте 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]-----+
    
  4. Создайте файл для сохранения публичных 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
    
  5. Убедитесь, что разрешения выставлены верно:

    $ 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
    
  6. Добавьте SFTP-пользователя в SFTP-группу:

    $ sudo usermod -G ftpusers fuser
    

Создайте виртуальную машину для SFTP-клиента

Процесс создания виртуальной машины для SFTP-клиента полностью совпадает с созданием виртуальной машины для SFTP-сервера.

  1. Выполните пункты 1-9 из раздела создание виртуальной машины для SFTP-сервера (в качестве имени машины укажите, например, sftp-client).

  2. Создайте пару SSH-ключей на SFTP-клиенте. Процесс аналогичен описанному для пользователя fuser в предыдущем разделе:

    $ ssh-keygen
    
  3. Выведите публичный ключ на экране SFTP-клиента:

    $ cat ~/.ssh/id_rsa.pub
    
  4. Зайдите на SFTP-сервер и откройте файл /home/fuser/.ssh/authorized_keys:

    $ sudo vi /home/fuser/.ssh/authorized_keys
    
  5. Скопируйте SSH-ключ, полученный на SFTP-клиенте, в конец файла.

  6. Сохраните файл.

  7. Убедитесь, что виртуальная машина SFTP-клиента доступна с SFTP-сервера, и наоборот:

    1. Зайдите по SSH на SFTP-сервер.

    2. Найдите публичный или внутренний IP адрес SFTP-клиента в консоли Яндекс.Облака в разделе настроек виртуальной машины.

      Важная информация

      Внутренние адреса SFTP-клиента и SFTP-сервера должны находиться в одной подсети или быть связаны через настройки маршрутизации.

    3. Введите команду в терминале SFTP-сервера, подставив соответствующее значение:

      $ ping <IP адрес SFTP-клиента>
      
    4. Убедитесь, что пакеты отправляются и получаются успешно:

      $ 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
      
    5. Повторите проверку на SFTP-клиенте.

Создайте резервную копию конфигурационных файлов на SFTP-сервере

В инструкции рассмотрено резервное копирование конфигурационных файлов (с расширением .conf) из папки /etc.

Процесс резервного копирования:

  1. Упакуйте все нужные конфигурационные файлы в архив.
  2. Передайте архив на SFTP-сервер.
  3. Удалите архив на SFTP-клиенте.

Чтобы настроить процесс резервного копирования:

  1. Зайдите по SSH на виртуальную машину SFTP-клиента таким же способом, как это было проделано для SFTP-сервера.

  2. Установите переменные окружения для корректной работы скрипта. Для этого откройте файл ~/.bash_profile

    $ vi ~/.bash_profile
    
  3. Добавьте следующие строчки в конец файла, подставив нужные значения:

    $ export SFTP_SERVER=<IP адрес SFTP-клиента>
    $ export SFTP_USER='fuser'
    
  4. Примените настройки:

    $ source ~/.bash_profile
    
  5. Проверьте, что у вас появились данные переменные:

    $ env | grep SFTP
    

    На экране должно появиться:

    SFTP_USER=fuser
    SFTP_SERVER=10.128.0.5
    
  6. Запакуйте все конфигурационные файлы в один архив:

    $ 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.
  7. Перешлите полученный архив на 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-пользователя.

  8. Удалите архив на 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.

  1. Откройте файл crontab для редактирования:

    $ crontab -e
    
  2. Добавьте следующую строку, чтобы запускать резервное копирование каждый день в 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
    

Проверьте работоспособность резервного копирования

Чтобы убедиться в том, что резервная копия создается нужным образом, запустите копирование и найдите копию на сервере:

  1. Запустите на 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
    
  2. Зайдите на SFTP-сервер и убедитесь, что файл вида backup_ftp-server.ru-central1.internal_20190803_180228.tar.gz появился в домашнем каталоге SFTP-пользователя. Для этого на SFTP-сервере запустите команду:

    $ sudo ls /var/sftp/backups
    

Восстановите настройки из резервной копии

Процесс восстановления настроек:

  1. Скачайте резервную копию с SFTP-сервера на SFTP-клиент.
  2. Распакуйте архив.
  3. Скопируйте конфигурационные файлы из архива в систему.
  4. Удалите архив.

Чтобы восстановить настройки из резервной копии:

  1. На SFTP-сервере в папке /var/sftp/backups выберите резервную копию, из которой следует восстановить конфигурационные файлы. Например, это будет backup_ftp-server.ru-central1.internal_20190803_180228.tar.gz.

  2. На SFTP-клиенте сделайте переменную окружения для названия файла резервной копии:

    SFTP_BACKUP='backup_ftp-server.ru-central1.internal_20190803_180228.tar.gz'
    
  3. Скачайте резервную копию с SFTP-сервера на SFTP-клиент:

    $ sftp $SFTP_USER@$SFTP_SERVER:/backups/$SFTP_BACKUP .
    
  4. Распакуйте архив:

    $ tar -xzf $SFTP_BACKUP
    
  5. Скопируйте конфигурационные файлы из архива в систему (yes — избегать ввода подтверждения при перезаписи файлов):

    $ yes | cp -rfp etc / 
    
  6. Удалите архив и распакованное содержимое:

    $ 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-клиент: