Давно уже назрел вопрос о способе резервирования конфигов удалённых серверов. Основным требованием было сброс бекапов по шифрованому каналу. Всяческие поиски по этой теме привели к 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 тут и тут

- Системный администратор с 2000 года
- Участник Хабр Q&A и cyberforum
- Кейсы