Настройка резервного копирования с помощью rsync, ssh и cron


alexu аватар

alexu - Posted on 08 Июль 2007

На вебе доступно несколько статей по настройке резервного копирования с помощью ssh и rsync, однако я нигде не увидел всех нужных вещей вместе, поэтому и попытался собрать их все вместе в этом совете.

Итак, мы имеем две машины - одна отдает информацию, а другая - сохраняет. Назовем их для простоты сервер и бэкап.

1) Первым делом нужно убедиться, что на обоих машинах стоит ssh и rsync и что сервер доступен бэкап машине по ssh с аутентификацией по ключу. Смотрите также наш совет о том, как настроить беспарольную аутенификацию по ssh. Также убедитесь, что на бэкап машине есть cron.

2) Теперь нужно ужесточить доступ к удаленному серверу, ограничив ущерб от потенциального взлома машины с бэкапами. Если бэкап осуществляется от рута, рекомендуется в /etc/ssh/sshd_config изменить опцию PermitRootLogin с 'Yes' на 'forced-commands-only' . Если копирование данных осуществляется не от root, тогда вообще изменить эту опцию на 'no'. Делать этот шаг нужно после шага 1, т.к. в противном случае не будет работать команда ssh-copy-id.

3) Еще больше ограничиваем доступ с бэкапа на сервер: открываем файлик .ssh/authorized_keys, находим в нем ключ бэкапа. Выглядит он примерно так: "ssh-dss куча символов user@backuphost". Перед ssh-dss пишем вот такую вещь:
from="10.0.0.100",command="/home/alex/check_rsync", где 10.0.0.100 - IP адрес бэкап машины или если бэкап машина находится за NAT, то адрес внешнего NAT интерфейса. То есть .ssh/authorized_keys будет выглядеть следующим образом:

from="10.0.0.100",command="/home/user/check_rsync" ssh-dss <тут куча символов> user@backuphost

А ссылка на скрипт в command представляет из себя следующее:

#!/bin/sh
 
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac

Не забудьте добавить права на выполнение данному скрипту chmod 755 check_rsync.

Теперь в случае попытки выполнить на удаленном сервере какую-либо другую команду, отличной от rsync, будет отвергнута. Конечно, и с помощью rsync можно причинить немало бед, но все же такая проверка - это лучше, чем ничего.

4) Теперь приступим непосредственно к созданию копий. Например, мы хотим иметь копии всей информации на удаленном за последний год и хранить это в директорию /store/myserver с именами по текущим датам и current - директория последнего резервного копирования. Для начала создаем соответствующую директорию mkdir -p /store/myserver/current. А затем делаем rsync скрипт на бэкап машине следующего содержания:

#!/bin/sh
# берем текущую дату
DATE=`/bin/date +"%Y-%m-%d"`
# указываем машину и директорию для копирования. в данном случае - это ВСЯ удаленная машина.
SOURCE="root@myserver.ru:/"
# прописываем пути всем используемым командам
RSYNC="/usr/bin/rsync"
TOUCH="/bin/touch"
CP="/bin/cp"
FIND="/usr/bin/find"
RM="/bin/rm"
XARGS="/usr/bin/xargs"
# заходим в нашу директорию
cd /store/myserver
# копируем все содержание current в директорию с текущей датой используя ЖЕСТКИЕ ЛИНКИ 
# для уменьшения используемого места на диске
$CP -al current $DATE
# синхронизируем директорию current с сервером, удаляем данные в current,
# которые на удаленном сервере больше не присутствуют.
# пропускаем все служебные директории и другие, которые не нужно копировать
$RSYNC -azqe ssh --exclude '/proc' --exclude '/dev' --exclude '/tmp' --exclude 'lost+found' \ 
       --exclude '/mnt' --exclude '/sys' --delete $SOURCE current/
# удаляем все резервные копии старше года
$TOUCH current
$FIND . -maxdepth 1 -type d -ctime +366 -print0 | $XARGS --null --no-run-if-empty $RM -fr

убеждаемся, что скрипт функционирует правильно, запустив его. После окончания выполнения в /store/myserver/current должна иметься копия информации с удаленного сервера. Если создаваемый при бэкапе трафик неважен, а процессорное время дорого, можно избавиться от флага 'z' в команде rsync, тогда передаваемые данные не будут автоматически сжиматься на сервере и разжиматься на бэкап машине.

5) Кладем наш скрипт в /etc/cron.daily или /etc/cron.weekly, в зависимости от того, хотите ли вы создавать копии ежедневно или еженедельно. Если же админских прав на бэкап машине у вас нет, используйте команду 'crontab -e'. Например, для создания копий ежедневно в 7:30 утра добавьте следующую строчку в crontab на бэкап машине:

30 7 * * * /home/user/make_backup

где make_backup - скрипт из 4), а /home/user - путь к нему.

И voi la, система автоматического резервного копирования сделана :-)

Отдельное спасибо Трою Джонсону (Troy Johnson) за создание основы для данного совета.

0
Ваша оценка: Ничего

во класс. у меня перекрестный бекап тоже на rsync, правда без таких параноидальных наворотов. нужно будет применить, лишним не бывает Ж:-)
Я только эти все -exclude спрятал в отдельный файлик. вот в общем скрипт http://core.org.ua/tmp/backup
PS
кто что хорошего может сказать про rdiff-backup?
похоже что тот же rsync, только с обвязкой которая делает инкрементальные бекапы.. делитесь опытом в общем, если у кого есть Ж:-)

--
Signature invent in progress 24% ##........