Резервное копирование Mikrotik в Subversion посредством SSH/SFTP

в 18:33, , рубрики: backup, mikrotik, системное администрирование, метки: ,

Вступление:

Попробую поделиться своей реализацией резервного копирования конфигов RouterOS в Subversion посредством SSH/SFTP.

Мой оригинальный пост можно найти на форуме Mikrotik: Backup Mikrotik config to Subversion/SVN repository via SSH

На местных просторах я встречал вот такой подход: Централизованный сбор конфигураций с MikroTik'ов средствами Python, но идея с ftp мне не очень понравилась.

Про бэкапы ROS:

Ежели вам нужна полная копия конфигурации ROS, я советую иметь копии следующего:
1. Сертификатов установленных в ROS(backup нам этого не даст)
2. Backup конфига ROS
3. Export конфига ROS(где вы всегда сможете подсмотреть что и как у вас настроенно)

Суть идеи:

Подошёл по аналогии с нашими Linux серверами. У нас /etc уходит в Subversion, где мы всегда получаем оповещения об изменениях в конфигах, плюс у нас всегда есть актуальный резерв, который может выручить.
Вдохновился идей из Mikrotik Wiki:Using SSH for system backup

Логика:

1. Делаем export
2. Выполняем сравнение с предыдущим export
3. Если есть разница, то выполняем backup
4. Отправляем изменения в SVN

Требования:

1. ROS 5.15 с включённым SSH
2. Subversion
3. Linux c установленным ssh, sftp, sshpass и svn клиентом

Настройка:

1. На Linux сервере импортируем публичный ключ ROS в known_hosts файл из под учётной записи, которая будет выполнять сron задачу резервного копирования:

ssh-keyscan -v -p 22 -t dsa 192.168.0.1 >> ~/.ssh/known_hosts

2. В ROS создаём пользователя, у которого будут необходимые права для выполнения необходимых нам действий, и привяжем его к адресу сервера, с которого будет выполняться задача резервного копирования:

export = ssh, ftp,read, sniff
backup = ssh, test, policy
get export via sftp = ssh, ftp
get backup via sftp = ssh, ftp, sensitive

/user group add name=backup policy=ssh,ftp,read,sniff,test,policy,sensitive
/user add name=backuper password="password" group=backup address=192.168.0.2 disabled=no

3. В Linux создаём директорию для рабочей копии SVN, я создаю согласно имени устройства:

mkdir -p /root/backup/trunk/usingw01/

4. В Linux cоздаём рабочую копию SVN из папки, в которой у нас будут храниться файлы нашей ROS:

cd /root/backup/trunk/usingw01
svn checkout https://svn.domain.com/svn/admin/trunk/usingw01 . --trust-server-cert --non-interactive --no-auth-cache --username usingw01 --password 'svnpassword'

5. В Linux создаём папку для скрипта автоматизации резервного копирования:

mkdir /root/backup_scripts

6. В Linux создаём скрипт:

vi /root/backup_scripts/backup_usingw01_to_svn.sh
#!/bin/sh
#
routername="usingw01"
sshhost="192.168.0.1"
sshport="22"
sshuser="backuper"
sshpassword="password"
svnlocalpath="/root/backup/trunk/$routername"
svnusername="usingw01"
svnpassword="svnpassword"
current_export_name="$routername-config-export-current"
precedent_export_name="$routername-config-export-precedent"
current_backup_name="$routername-config-backup-current"
#
#
sshpass -p $sshpassword ssh $sshuser@$sshhost -p $sshport export file=$current_export_name
sshpass -p $sshpassword sftp -oPort=$sshport $sshuser@$sshhost:$current_export_name.rsc
diff -I "by Router" $current_export_name.rsc $svnlocalpath/$precedent_export_name.rsc
#
if [ "$?" -ne "0" ]; then
sshpass -p $sshpassword ssh $sshuser@$sshhost -p $sshport system backup save name=$current_backup_name.backup
sshpass -p $sshpassword sftp -oPort=$sshport $sshuser@$sshhost:$current_backup_name.backup
#
mv $current_export_name.rsc $svnlocalpath
mv -f $current_backup_name.backup $svnlocalpath
rm -f $svnlocalpath/$precedent_export_name.rsc
svn add --force $svnlocalpath/*
svn commit $svnlocalpath --trust-server-cert --non-interactive --no-auth-cache --username $svnusername --password $svnpassword --message "Automated commit of $routername at `date +"%Y-%m-%d %H:%M:%S"`"
#
mv $svnlocalpath/$current_export_name.rsc $svnlocalpath/$precedent_export_name.rsc
exit 1
#
#
fi
mv -f $current_export_name.rsc $svnlocalpath/$precedent_export_name.rsc
exit 0
#

7. В Linux cоздаём cron задачу, которая будет выполнять резервное копирование:

crontab -e

00 04 * * * sh /root/backup_scripts/backup_usingw01_to_svn.sh

Результат:

Завтра утром вы получите копию экспорта и полного бэкапа своего конфига ROS в SVN.
Вы так же можете настроить SVN-notify для получения уведомлений и diff о произведённых изменениях.
В SVN вы всегда можете скачать актуальную версию backup и export. Так же вы можете смотреть разницу между прошлыми конфигами и видеть изменения. Полезно ежели с устройством работают несколько человек — все будут видеть изменения на почте и знать, что и как изменилось.

Безопасность:

Учтите, что пароли, например, PPP в export хранятся в открытом виде. Для большей безопасности вы можете воспользоваться ключём

hide-sensitive

при выполнении export, но это накладывает свои ограничения на выполнение резервных копий. Т.е. вы не будет получать резервную копию при добавлении, например, пользователя в PPP.
Ну и так же не забываем про безопасность своего SVN.

Ограничения:

Скрипт не выполнит резервного копирования ежели вы добавите системного пользователя. Связанно это с тем, что export не выполняет экспортирование учётных записей ROS(в целях безопасности).
По этому поводу я писал разработчикам и просил их добавить в export информацию о том, когда был в последний раз изменён конфиг. На это мне ответили, что что-то похожее будет в версии 5.12 — export compact, но это есть не то и пока эти ограничения остаются.

Использованные материалы и полезные ссылки:

1. Manual:Configuration Management
2. Difference between backup and export-how to monitor changes
3. Backup and Restore Certificates
4. remote creating backup-file

Надеюсь идея такого подхода будет кому-нибудь полезна.

Автор: slech


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js