Резервирование конфигов удалённых серверов при помощи rsync и stunnel

Давно уже назрел вопрос о способе резервирования конфигов удалённых серверов. Основным требованием было сброс бекапов по шифрованому каналу. Всяческие поиски по этой теме привели к rsync’у. Действительно удачный софт, может работать как в качестве клиента, так и сервера. При повторном бекапе копирует не весь файл, а изменённые блоки. Может шифровать траффик при помощи ssh. Однако смущал постоянный ввод пароля.

В инете есть описания кучи способов о том как можно настроить rsync с авторизацией по ключам ssh, но я не считаю подобный способ секьюрным, помятуя о взломе серверов апача. Данная статья является вольным переводом статьи Daniel Teklu с моими изменениями. Все указанные команды касаются freebsd, думаю на остальных никсах проблем возникнуть не должно. Имеется два сервера bs-бекап сервер, сюда конфиги сливаем и rsync/stunnel настраиваются как сервер. И cl-клиент, с него конфиги копируются на bs и софт работает в режиме клиента

Итак начнем пожалуй

На bs и cl делаем

portinstall rsync stunnel

после установки stunnel из портов, рекомендовано сделать make cert, но в нашем случае это не нужно. Сертификаты сгенерируем потом

настройка bs

rsyncd

открываем rsyncd.conf и пишем туда

pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd/rsyncd.log
transfer logging = true
use chroot = yes
address = 127.0.0.1
uid = root
gid = wheel
max connections = 10
read only = no
ignore nonreadable = yes
dont compress = *

address — на localhost, порт 873 — дифолтный для rsyncd
uid/gid — задают пользователя/группу с правами которых будет происходить трансфер файлов
read only — ставим в no, нам нужно записывать
dont compress — заливаем как есть, без сжатия, на жирных каналах нет смыла что-то сжимать

далее задаем имя и путь куда будем принимать

### cl01 ###
[cl01_etc]
path = /disk3/cl01/etc/
[cl01_usr_local_etc]
path = /disk3/cl01/usr_local_etc/

записываем

stunnel

открываем stunnel.conf  и немного его подправим

client = no
cert = /etc/ssl/certs/server-cert.pem
key = /etc/ssl/certs/server-key.pem
[rsync]
accept = ext.ip.of.bs:873
connect = 127.0.0.1:873

client — ставим в no, это ясно, bs работает как сервер
accept — внешний адрес bs. Обратите внимание, указан порт rsync’а на котором на самом деле будет висеть stunnel

создаем папку /var/tmp/stunnel, даём ей владельца stunnel, далее в /etc/rc.conf.local пишем

rsyncd_enable="YES"
stunnel_enable="YES"
stunnel_pidfile="/var/tmp/stunnel/stunnel.pid"

stunnel_pidfile — указываем обязательно, иначе при отстановке через rc.d/stunnel кидает ошибку

настройка cl

rsync в качестве клиента будет работать из командной строки.

stunnel

настройка аналогично как на bs, только некоторые изменения все же есть

client = yes
cert = /etc/ssl/certs/client-cert.pem
key = /etc/ssl/certs/client-key.pem
[rsync]
accept = 127.0.0.1:873
connect = ext.ip.of.bs:873

генерируем сертификаты и ключи

само-собой понятно, что если bs выступает сервером, то и выдавать сертификаты и ключи для клиентского доступа должен также он

cd /etc/ssl
mkdir certs && cd certs

для начала создаём корневой CA

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1825 -key ca-key.pem -out ca-cert.pem

создаём сертификат сервера, удаляем пароль и подписываем его ключем CA

openssl req -newkey rsa:2048 -days 1825 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 1825 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

создаём сертификат сервера, удаляем пароль и подписываем его ключем CA

openssl req -newkey rsa:2048 -days 1825 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 1825 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

после генерации можем проверить, что у нас получилось

openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem

далее кидаем client-cert.pem client-key.pem на cl в /etc/ssl/certs/stunnel. Супер! Запускаем. Если в логах ошибок нет, то пробуем бекапить с cl папку /etc на bs

rsync -vv -a -R /etc/ localhost::cl01_etc

-vv — уровень болтливости
-a — объеденяет несколько ключей, man rsync
-R — восзоздаёт иерархию в месте назначения

далее в cron по желанию. Фаерволом разрешаем траффик между bs и cl, остальные в сад.

Рекомендую также к прочтению stunnel faq и статьи по openssl тут и тут

Александр Черных
системный администратор

Статьи по теме

0