Быстро, дёшево и массово подстраховать базы клиентов от утери. Комплексная система удалённого резервного копирования

Администрирование - Архивирование (backup)

Вы можете держать копии баз своих клиентов актуальными на своем backup-сервере. Rsync передаст только изменения базы, в связи с чем, передача данных произойдет самым рациональным способом. Обновление копии файловой базы происходит почти мгновенно, даже по низкоскоростным каналам связи. Вы сможете держать копии всех MSSQL баз на своём удалённом сервере с почасовой актуальностью. Как это сделать описываю в деталях. Систему можно использовать вообще для любых файлов. Если копия не обновляется заданное время - приходит оповещение об этом. Предыдущая версия уже несколько лет работает на локальном backup-сервере, который спасал мою честь несколько раз.

Таки шо я буду с этого иметь?

В итоге у вас будет в офисе ещё один системный блок, на котором будут актуальные копии ценных вам, или вашим партнёрам данные. Блок будет подключен к интернету. С точки сетевой безопасности у этого сервера будет открыт один ssh порт. И если даже сам дьявол сольёт новые средства взлома систем от майкрософт, вероятность того, что объявится какой-нибудь цифровой пенни-вайз, работающий одинаково эффективно и с windows и с nix, и у которого получится через один единственный ssh пролезть и стереть там всё, не очень большая. Если бы не этот механизм, лично я был бы уже обесчестен, думаю, не менее трёх раз.

 

А почему rsync, а не гугл диск например? И как это вообще работает?

Гугл и яндекс диск, в отличие от кстати Mega.nz, перекидывают изменения так же как и rsync (допускаю, что механизмами именно rsync). Mega.nz перекидывает весь файл целиком, даже если был изменен один байт. (Проверено). Но в случае работы шифровальщика тот же гугл или яндекс диск запишет вам в облако зашифрованный файл, а вашу базу в облаке затрёт.  Факт в том, что когда вы передали базу на удаленный узел - её надо некоторое время хранить. 

Rsync потому что обновление к примеру файловой 1С базы размером 3Гб на которой работали в течение дня занимает менее минуты. Он просто идеален для файлового варианта. Можно гарантировать, что небольшие клиенты, не потеряют свою базу, если запустят шифровщик. Для SQL он не так идеален, но тут ничего не поделаешь. Файл bak выгружается каждый раз новый. Меняется он не весь, но эффект от этого есть. (Даже перенос регламентых операций MSSQL на один раз в неделю помогает не сильно) 

 Rsync - если коротко, то это средство обновления уже существующего файла на сервере, фрагментами, которые были изменены на клиенте. Грубо говоря файл делится на фрагменты, на обоих сторонах, высчитывается контрольная сумма фрагментов, где суммы не соотвествуют те данные и пересылаются.

В нашем случае, клиент подключается через ssh (используя ключ) на сервер, средствами rsync обновляет данные в /home/xxxx. Регламентно ночью производится архивирование нужных данных из /home в место, недоступное клиенту, и хранится там несколько дней. В случае если копия не обновлялась 3 дня, на почту админу приходит алярм (бывает ложно, в случае если с базой не работают каждый день). 
То есть теоретически, если клиент запустил вирус-шифровщик, и rsync даже успел перекинуть уже шифрованные данные, вы сможете вытащить из архива базу, потеряв максимум день. Можно подстраховать широкий диапазон клиентов и вам это будет стоить - почти ничего. 

 

Введение

Среди моих знакомых есть, на мой взгляд, толковые специалисты, избегающие unix-подобные ОС.  Использование nix в данном случая действительно оправдано. Если вы по какой-либо причине не прикасались никогда к этим системам, то эта статья может стать для вас "Hello world" в этом направлении. Установка простая, ничего замудрённого и лишнего. Я постараюсь показывать всё пошагово, доступно и максимально развернуто.


Я использую  debian, так как не буду кривить душой, использую его давно и ориентируюсь в нем, лучше, чем в других системах. Вы можете использовать что угодно (даже windows). 

Если вы знаете что такое rsync, и недоумеваете зачем его настраивать для доступа через ssh, то вас из этой статьи возможно заинтересует способ организации "песочницы" для пользователей rsync и batch  скрипт для MSSQL.  


Да, можно было бы и настроить программный raid и zfs - статья не про это, да и задача стояла в последний раз собрать всё максимально быстро и просто. Наплевав на осколки своих педантских устремлений, сделал всё проще некуда с точки зрения организации файловой системы (в ущерб надёжности). Вне всяких сомнений, кому-то для таких целей понадобятся зашифрованные массивы с копиями. В случае с linux для этого тут целый аэропорт возможностей.

Я приложу к статье архив, куда помещу все, используемые здесь файлы. Всё, что будет в этом архиве - есть в статье. 

 

Что делаем?

  • Берём любой компьютер (только где есть хотя бы SATA контроллер), с рабочими дисками (я взял 2 новых 2-х терабайтника);
  • ставим на него минимальный linux debian;
  • настраиваем rsync сервер
  • ставим клиентскую часть для файловой БД  (подходит для любых данных);
  • ставим клиентскую часть для MSSQL баз;
  • храним копии.

 

Установка Linux Debian

Раздел для тех, кто никогда не ставил Linux. Те кто это делал, думаю сами могут предложить вагон своих вариантов.

Загрузить дебиан можно тут: https://www.debian.org/distrib/ 
Выбираем минимальный дистрибутив (netinstall)

Наглядный процесс установки: 


Разбил жесткий диск вручную, несмотря на то, что система и сама может предложить такой вариант, но отдает под корневой раздел в моём случае много. 10 Гб - более чем достаточно. Расти будет раздел /var (логи) - и очень незначительно.
Своп нужен или нет лучше прочитайте. Я сделал 1Г для примера. Сам до конца в этом вопросе не разобрался до сих пор. Не думаю, что на таком сервере вообще уместен.


Раздел /keeper на втором диске создан для того, чтобы хранить архив резервных копий на нём. В разделе /home, будут актуальные копии (которые будут обновляться rsync)


По разным дискам есть смысл разносить обновляемые копии и архив, для того, случая, когда выйдет из строя один из жестких дисков. На этот случай кстати (да и вообще всегда) имеет смысл поставить smartd (мониторит smart, отсылает алярм, если какие-то из параметров вышли за рамки). 

В общем нам нужен существенно большие разделы /home и /keeper. В самом простом случае их можно расположить на одном разделе, ну или в случае если этот раздел находится на raid.

Теперь надо привести систему в боевое состояние. Обновить, доустановить необходимые пакеты. Итак вы сидите перед чёрным экраном - система требует login. Введите root, далее введите пароль, который вы ввели при установке (пароль суперпользователя).
Итак вы в системе - под рутом. (Говорят под рутом работать неприлично, но мы поработаем). 

Я надеюсь на этапе установки вы озаботились вводом правильных сетевых параметров. И интернет у вас работает. (Проверка ping ya.ru).
Остановить выполнение ping Ctrl+Z. Если интернет не работает - гуглите, зацикливаться мы на этом не будем.


Далее выполняем команды: 
apt-get install aptitude mc // привык к aptitude и mc (мой выбор не идеален, я знаю)
aptitude update // Обновим базу пакетов
aptitude safe-upgrade // Обновляем все пакеты до последних 

Теперь у нас свежая система. Есть mc (местный norton commander). 
Команда mc собственно запустит mc. Редактировать файл в нём F4, копировать - F5, создать папку F7 - выйти F10.
Отредактировать конкретный файл можно командой mcedit файл, например mcedit /etc/rc.local

И да, вы же конечно поставили sshd как я на видео. Значит после установки вы можете подключаться по ssh на ваш сервер. Качаете putty и подключаетесь. Копировать команды со статьи в putty будет проще, чем писать их руками. Приучайтесь сразу авторизоваться не под root, а под тем пользователем, которого вы вводили при установке после введения пароля суперпользователя. Возможность входа под рутом через ssh выключим в следующем разделе. После того, как вы авторизовались под своим пользователем, чтобы стать рутом надо ввести su и пароль рута.

 

Настройка rsync сервера

 

Вводная

Как таковой rsync сервер (rsyncd) мы настраивать не будем вообще. От нас потребуется настроить ssh сервер нужным образом, настроить фаерволл, правильно раздать права, настроить скрипты архивирования да и всё. 

aptitude install rsync // Установим rsync

В принципе можно даже ничего не настраивать, достаточно того, что уже стоит. Но! Пользователю, который подключится по-умолчанию доступна на чтение вся система! Вот так. Можно имея права пользователя тем же rsync скопировать себе весь корень. Было опробовано немало вариантов, остановился я на следующем:
SSH сервер умеет перемещать корневой раздел для определенной группы пользователей в другую папку. (chroot). В той папке будет наша родная home, и всё необходимое для того, чтобы запустить rsync (bash и библиотеки). Таким образом пользователь окажется изолирован в своём мирке и сможет максимум прочитать данные соседей по /home, что мы купируем правами на папку. Да кстати, профили таких пользователей будут находиться в /home/backupusers/. Это полезно, когда сервер используется ещё для чего-то.

groupadd backupusers // добавляем группу

 

Настройка SSH

mcedit /etc/ssh/sshd_config  // Редактируем файл вручную (Поиск если что F7)
Меняем если надо порт:
Port 22 // Если подключены по ssh - подключаться далее надо будет уже на него
PermitRootLogin no // запретит авторизоваться руту через ssh (желательно, но не обязательно)

В самый конец файла вставляем:

Match group backupusers
    ChrootDirectory /home/backupusers/chroot
    AllowTCPForwarding no
    X11Forwarding no

Выходим F10 и не забываем сохранить

/etc/init.d/ssh restart // перезапускаем службу

 

Подготовка "песочницы"

Теперь для всех членов backupusers происходит смена корневого каталога в эту папку. Теперь её нужно создать, установить на неё правильные права и заполнить её.

mkdir -p /home/backupusers/chroot // Создадим папку /home/backupusers/chroot - это теперь новый корень для наших пользователей с обрезанными возможностями. В этой папке должны быть рабочие домашние директории пользователей, и обстановка необходимая для запуска bash и rsync. 
Можно собирать обстановку вручную как мы сейчас и поступим. Я обычно копирую с предыдущей установленной машины. В к статье приложу архив, где будут собраны все необходимые скрипты, а так же уже готовая папка chroot.
 
mkdir /home/backupusers/chroot/bin // В корне будет директория bin 
aptitude install bash-static // ставим bash, для которого не нужны библиотеки
cp /bin/bash-static /home/backupusers/chroot/bin/bash // теперь наш chroot уже с командным инетрпритатором 
cp /usr/bin/rsync /home/backupusers/chroot/bin/ // И с rsync
rsync в отличие от bash-static требует библиотек. Организуем и их. Их состав можно вычислить командой:
ldd /usr/bin/rsync
Переносим их:
mkdir -p /home/backupusers/chroot/lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libattr.so.1 /home/backupusers/chroot/lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libacl.so.1 /home/backupusers/chroot/lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libpopt.so.0 /home/backupusers/chroot/lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libc.so.6 /home/backupusers/chroot/lib/x86_64-linux-gnu/
mkdir -p /home/backupusers/chroot/lib64
cp /lib64/ld-linux-x86-64.so.2 /home/backupusers/chroot/lib64/

Теперь займемся папкой /home/backupusers, которая тоже должна оказаться в chroot. Символическая ссылка тут не подходит. Подходит mount -o bind 

mkdir -p /home/backupusers/chroot/home/backupusers // Чтобы пробрасывать home/backupusers, нужно, чтобы в chroot папка существовала
mount -o bind /home/backupusers /home/backupusers/chroot/home/backupusers выполняем проброс

 

Процедуры при автозапуске

Процедуры автозапуска всегда делал в /etc/rc.local в Debian 9 оказывается по-умолчанию этот файл нужно ещё и включить.

touch /etc/rc.local //Нужно создать его
chmod +x /etc/rc.local // И сделать исполняемым

И заполнить:
 

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

mount -o bind /home/backupusers /home/backupusers/chroot/home/backupuser

exit 0

systemctl start rc-local // И запустить

 

Создание пользователя

Делаем скрипт для создания пользователя:
touch /usr/bin/add_backupuser // Создаем файл
chmod +x /usr/bin/add_backupuser // Делаем исполняемым

Заполняем файл /usr/bin/add_backupuser:

#!/bin/bash
useradd -d /home/backupusers/$1 -g backupusers -s /bin/bash $1
mkdir -p /home/backupusers/$1/.ssh
touch /home/backupusers/$1/.ssh/authorized_keys
chown $1:backupusers /home/backupusers/$1 -R
chmod 700 /home/backupusers/$1 -R

Теперь, чтобы создать пользователя ooobuh нам нужно выполнить команду:
add_backupuser ooobuh

 

Проверка

Всё. Пользователь создан, окружение настроено. Проверяем. Устанавливаем пользователю пароль:
passwd ooobuh
И пробуем подключиться на ssh под пользователем ooobuh. Должна появиться командная строка, должна выполняться команда rsync и больше ничего работать не должно. Если так - то всё отлично. Самое сложное позади. Если нет - то скачайте файлик в конце статьи, скопируйте оттуда chroot, и забейте на эту ручную настройку. Если не работает, то вы либо не перезапустили sshd, либо накосячили с правами. Если ssh отпинывает вас после ввода правильного пароля - смотрите /var/log/auth, возможно там указано, на какой файл неправильно установлены права.

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

 

Для забывчивых

Я постоянно забываю очередность действий, когда надо через продолжительное время вспомнить как добавить нового пользователя и что делать дальше. Поэтому делаю для себя команду-напоминалку:

touch /usr/bin/helpme
chmod +x /usr/bin/helpme

#!/bin/bash

echo "--------------------------------------------------------------------
To add new backupuser: 
1. Type add_backupuser username
2. Add the rsa key to /home/backupusers/username/.ssh/authorized_keys
3. The windows BackupSet there are in C:Backupset
--------------------------------------------------------------------"

Попадая на сервер в суматохе, не помня ничего - я пишу helpme. И командная строка напоминает что мне нужно делать в деталях. 

 

Итог

Установка rsync сервера на этом завершена. Теперь вы можете быстро создать нового пользователя, он отделён от системы, обездвижен командами, он не может прочитать соседей, так как при создании пользователя обрезаются права chmod 700 (читать писать может только владелец). 

 

Настраиваем клиентскую часть

 

Дистрибутив rsync и авторизация

Сборки rsync под windows мне попадались разные, я качал их из разных мест, официального какого-то источника как я понял - нет. Корректно работает у меня только одна. Я приложу её в файл статьи вместе со скриптами. Вы можете и сами поискать нужную реализацию rsync. Некорректность работы в том, что процесс передачи может обрываться. 

Авторизация производится средствами SSH. Механизм такой - клиент у себя генерирует пару секретный/публичный ключ. Публичный ключ помещается на сервер в $HOME/.ssh/authorized_keys и этого достаточно для того, чтобы клиент авторизовался на сервере без ввода каких-либо данных. В дистрибутиве rsync обычно идет ssh и сопутсвующие утилиты. 

Программа ssh-keygen.exe сгенерит пару ключей на клиенте. Интерактивно задаст вам несколько вопросов - на них нужно ответить нажатием Enter (3 раза).

Чтобы знать где она сгенерит ключи - задайте лучше чётко, например:
set HOME=/cygdrive/C/Backup/home 

Такой странный путь - то, с чем мы будем постоянно встречаться. Дело в том, что rsync под windows не писалась её работа эмулируется через cygwin, где unix окружение с unix путями. /cygdrive/C/Backup/home = C:\Backup\home

Папку с rsync я кладу в C:\Backup
                      То есть в C:\Backup\bin - бинарники
                                    в C:\Backup\home - ключи

В bin располагаются скрипты. Первый из них:

generatekey.bat

set HOME=/cygdrive/C/Backup/home
ssh-keygen.exe

При запуске generatekey.bat, для того, чтобы сделать всё правильно достаточно 3 раза нажать enter, в качестве ответов на вопросы.
Скрипт сформирует приватный и публичный ключ в папке C:\Backup\home\.ssh
Содержимое файла id_rsa.pub (публичный ключ) необходимо скопировать целиком и вставить в /home/backupusers/ooobuh/.ssh/authorized_keys на сервере

После этого остальные скрипты смогут авторизоваться. При первой передаче данных ssh предупредит вас, что видит ваш сервер впервые. Вам придется написать yes и нажать enter. После этого файл C:\Backup\home\.ssh\known_hosts пополнится публичным ключом вашего rsync сервера и перестанет задавать вам этот вопрос. Имеет смысл распространять C:\Backup уже с этим файлом, чтобы не тратить на это время.

 

KeepFiles.bat

set HOME=/cygdrive/C/Backup/home set
Name=Backupuser

if %date:~0,2% == 01 (
set delstring= --del 
) else (
set delstring=
)

rsync -zavP --rsh='ssh -p 22' %delstring% --inplace --stats --modify-window=1 --chmod=u+rw,og-rwx,Du+rw,Dog-rwx "/cygdrive/C/Targetfile" %Name%@backupserver.franch.ru:~/

Вместо файловой бд, этим скриптом можно обрабатывать всё, что угодно. Я использую точно такой же скрипт для резервного копирования ВСЕХ данных пользователей в офисе. Копируется профиль пользователя windows, почта the bat, шары с документами. У одного пользователя объем сохраняемых данных может достигать до 100 Гб. Стоит отметить, что rsync не будет считать и сверять контрольную сумму всей кучи синхронизируемых файлов. По-умолчанию производится сверка дат модификации файла, и допускается погрешность в установленное количество секунд (--modify-window=1). Благодаря этому куча мелких неизмененных файлов игнорируется. В случае если вам всё-таки нужно всегда сверять контрольные суммы (образы TrueCrypt), то используйте ключ -c

Файл KeepFiles.bat настраивается индивидуально под каждого пользователя.
Обратить внимание нужно на:

  • переменную Name (Это unix пользователь. В нашем примере ooobuh);
  • ssh порт - тут он 22 (скорее всего вы будете использовать альтернативный);
  • путь на локальной машине /cygdrive/C/Targetfile - это C:\Targetfile. Это может быть как папка, так и файл.
  • путь, куда  C:\Targetfile попадет на unix. В данном случае ~/.  Это значит, что C:\Targetfile попадет в корень домашней папки (/home/backupusers/ooobuh/)

Обратите внимание на то, как путь пишется в rsync. /cygdrive/C <- это диск C:. Далее как обычно, только слэш - юниксовский. В случае если путь записан с русскими буквами - будут проблемы. Я выходил из ситуации монтируя папку (имя которой нужно было транслировать, так как batch тоже не очень любит русские буквы) на отдельный диск (команда subst что-ли, не помню). И оттуда уже прописывал cygdrive путь. Но в целом намного проще заставить пользователя перенести своё барахлишко в англоязычную папку.

Если вам вдруг нужно переносить несколько папок/файлов дублируйте последнюю строку столько, сколько вам нужно. Rsync очень гибкая софтина на предмет всяких выражений, условий, масок, исключений. Погуглите rsync examples. Тяжело представить, что возможностей rsync будет для чего-то недостаточно.

Условие с первым числом месяца для обычных файлов пользователя. Для баз оно не мешает, поэтому оставил. Суть в том, что если пользователь удалил файл, на сервере он не затрётся, если rsync запущен без ключа --del. Это полезно, когда человек удалил файл позавчера, или зашифровали его файлы, но переименовав при этом (как это чаще всего бывает) и файлы не затёрлись тем же rsync. Но постоянно накапливать эти файлы - лишняя нагрузка. Поэтому каждое первое число месяца rsync запускается с ключом -del. 

 

KeepMSSQL.bat

В результате внедрения этой части, на backup сервере будут актуальные  полные(ночные) копии всех баз MSSQL(кроме тех, которые оканчиваются на "_copy" и системных) и разностные копии всех этих баз сразу же после их формирования. То есть если в 14:30 обычного рабочего дня сервер у клиента перестанет существовать, то у вас на backup сервере будет база на 14:00, если периодичность запуска будет 1 час. (Вообще разностные копии можно делать хоть каждые 5 минут).

Есть ещё один момент. Вот ночью сделана полная копия базы. А в 8 утра её обновили. Разностные копии солидно увеличиваются в размере (так как каждая из них - есть отличие от последней полной копии на момент формирования). И могут занять всё оставшееся место на диске. Затем ночью не будет сделана полная копия, так как места уже нет, и если у вас не настроено оповещение о ошибке при выполнении плана обслуживания MSSQL, то вы можете узнать о том, что копии у клиента не делаются, только в тот момент, когда эти самые копии понадобятся. Этот момент планами обслуживания не разрулить. Как им не разрулить и то, что для наших целей (транслирования) бэкапов на сервер нужно, чтобы каждая полная копия транслировалась в 2 места одновременно. 

Первое из них - это папка с архивами на самом MSSQL сервере. Бэкап сервер это конечно хорошо, но на самом сервере копии не лишние, да и это просто удобно. Надо тебе на любой момент времени базу - зашёл в Studio и мышечкой восстановил себе копию базы на любой момент времени. А для того, чтобы передавать изменения bak файла необходимо, чтобы файл находится в одном и том же месте, и назывался одинаково. То есть позавчерашняя полная ночная резервная копия должна быть замещена сегодняшней под тем же самым именем, в той же папке. Просто делать полную 2 раза нельзя, так как одна из них перестанет быть для разностных родительской. Очень долго не хотелось переводить резервирование на скрипт, но эти два фактора вынудили. 

У вас скорее всего есть папка для полных копий MSSQL, и для разностных. Мы от них не отказываемся. Появится третья, где будут только полные последние копии баз под именами база1.bak. Как только это произойдет, мы просто синхронизируем третью папку и папку с разностными копиями - и всё. То есть процесс резервного копирования придется доверить скрипту и снять планы обслуживания резервного копирования. Но Studio будет знать о том, где лежат копии, и задачи->восстановить вам так же предложит по-умолчанию восстановить самую последнюю разностную копию и восстановит её без проблем.

Этот скрипт на инфостаре, только потому, что он работает. Совершено очевидно, что он очень сырой. Но скорее всего дальше я доделывать его не буду. Если вам понравилась моя идея и вы batch программист предложите свою версию.

Коротко об его использовании - запускаете без ключа - делается полная копия, с ключом h - разностная. Если размер разностной превышает MaxSmallFileSize (50Мб), то делается полная и синхронизируется с севером. После этого копии синхронизирутся с данными на сервере, и у затираются локальные старые - по количеству, что не всегда правильно, но сделать по дате оказалось мне не по зубам. Запуск скипта производится из планировщика задач windows.

@echo off
SETLOCAL EnableDelayedExpansion enableextensions

set HOME=/cygdrive/C/Backup/home
set Name=germany

set MSSQLArchive=E:\SQLBackups\
set RSyncTarget=E:\ToHome\Big\
set Small=E:\ToHome\Small\
set /a MaxSmallFileSize = 50000000

set datetimef=%date:~-4%.%date:~3,2%.%date:~0,2% (%time:~0,2%-%time:~3,2%-%time:~6,2%)

SQLCMD -h-1 -S (local) -i select.sql -o bases.txt
SET /A COUNT=0

for /f "tokens=*" %%i in (bases.txt) do (
set input=%%i

for /f "tokens=* delims= " %%a in ("!input!") do set input=%%a
for /l %%a in (1,1,200) do if "!input:~-1!"==" " set input=!input:~0,-1!

if not !input:~-5!==_copy (
SET /A COUNT+=1

if "%~1"=="h" (

SQLCMD -S ^(local^) -E -Q "BACKUP DATABASE !input! TO DISK = '%Small%!input!_%datetimef%.bak' WITH INIT, FORMAT, NAME = 'Differential backup !input! %datetimef%', STATS = 10, CHECKSUM, COMPRESSION,DIFFERENTIAL"

for %%o in ("%Small%!input!_%datetimef%.bak") do (set /a fsize=%%~Zo)

if !fsize! GTR %MaxSmallFileSize% (
SQLCMD -S ^(local^) -E -Q "BACKUP DATABASE !input! TO DISK = '%MSSQLArchive%!input!_%date%.bak' WITH INIT, FORMAT, NAME = 'Full backup !input! %date%', STATS = 10, CHECKSUM, COMPRESSION"
copy %MSSQLArchive%!input!_%date%.bak %RSyncTarget%!input!.bak

rsync -zavP --rsh='ssh -p 22' --bwlimit=4096 --inplace --stats --modify-window=1 --chmod=u+rw,og-rwx,Du+rw,Dog-rwx "/cygdrive/E/ToHome/Big" %Name%@terminal.backup.org:~/Bases/

SQLCMD -S ^(local^) -E -Q "BACKUP DATABASE !input! TO DISK = '%Small%!input!_%datetimef%.bak' WITH INIT, FORMAT, NAME = 'Differential backup !input! %datetimef%', STATS = 10, CHECKSUM, COMPRESSION,DIFFERENTIAL"
)

) else (

SQLCMD -S ^(local^) -E -Q "BACKUP DATABASE !input! TO DISK = '%MSSQLArchive%!input!_%date%.bak' WITH INIT, FORMAT, NAME = 'Full backup !input! %date%', STATS = 10, CHECKSUM, COMPRESSION"
copy %MSSQLArchive%!input!_%date%.bak %RSyncTarget%!input!.bak

)
)
)


if "%~1"=="h" (
rsync -zavP --del --rsh='ssh -p 22' --bwlimit=4096 --inplace --stats --modify-window=1 --chmod=u+rw,og-rwx,Du+rw,Dog-rwx "/cygdrive/E/ToHome/Small" %Name%@terminal.backup.org:~/Bases/
set /A iCount=%COUNT%*24;
set sFolder=%Small%
) else (
set /A iCount=%COUNT%*4;
set sFolder=%MSSQLArchive%
)
rsync -zavP --rsh='ssh -p 22' --inplace --stats --modify-window=1 --chmod=u+rw,og-rwx,Du+rw,Dog-rwx "/cygdrive/E/ToHome/Big" %Name%@terminal.backup.org:~/Bases/

for /f "skip=%iCount% usebackq delims=" %%i in (
	`dir /b /a:-d /o:-d /t:w "%sFolder%"`
) do del /f /q "%sFolder%\%%~i"

 

Скрипт вытягивает названия баз при помощи файла select.sql (должен находиться в bin)

SET NOCOUNT ON;
SELECT  d.name AS DBName
FROM    sys.databases d
        JOIN sys.master_files m ON d.database_id = m.database_id
WHERE   d.name <> "model" and d.name <> "msdb" and d.name <> "tempdb" and d.name <> "master" and m.[type] = 0 -- data files only
ORDER BY d.name; 

 

Архивируем копии

Создаем папку с настройками:
mkdir -p /opt/2keeper/
touch /opt/2keeper/keeper.sh

chmod +x /opt/2keeper/keeper.sh

touch /opt/2keeper/config

/opt/2keeper/keeper.sh

#!/bin/sh

cat /opt/2keeper/config | while read FILENAME; do
    name=`echo $FILENAME | awk '{ print($2)}'`
    object=`echo $FILENAME | awk '{ print($3)}'`
    archargs=`echo $FILENAME | awk '{ print($1)}'`
    /usr/bin/archfolder /keeper/$name $1 $object -mx$archargs > /dev/null 2>&1
done


/opt/2keeper/config

0 BUH /home/backupusers/BUH1CBases/buh.bak
0 ZUP /home/backupusers/BUH1CBases/zup.bak
5 RTL_ZUP8 /home/backupusers/BUH1CBases/BUH_ZUP8/1Cv8.1CD
5 FileArchive /home/backupusers/BUH1CBases/FA

Здесь первый параметр - степень сжатия файла. Нет смысла сжимать сжатый bak. А вот 1CD имеет смысл.
Второй имя, под которым эта копия будет храниться в архиве. Третий файл, или папка, которые подлежат экзекуции.

 

/etc/crontab

Добавляем в планировщик linux:

0 0 * * * root /opt/2keeper/keeper.sh daily
0 2 1 * * root /opt/2keeper/keeper.sh monthly

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

/usr/bin/archfolder

Скрипт обработки сжатия и контроля по времени хранения архивов.
touch /usr/bin/archfolder
chmod +x /usr/bin/archfolder // без этого не поедет

#!/bin/bash

if [ "$3" = "" ]; then
echo $USAGE
exit 1
fi

if ! [ -e $1/$2 ]; then
mkdir -p $1/$2
fi


case $2 in
hourly)
find $arcdir/$2/ -type f -ctime +1 -delete
;;
daily)
find $arcdir/$2/ -type f -ctime +31 -delete
;;
mounthly)
find $arcdir/$2/ -type f -ctime +180 -delete
;;
*)
echo $USAGE
exit 1
;;
esac

if [ ! -e $3 ] || [ -z "`find $3 -type f -mtime -3 -ls`" ]; then
    swaks --header "Subject: Jesus backup system warning" --to admin@backup.org --from "jesus@backup.org" --server mail.backup.org -tls --body "Path $3 is not exist or has not update last 3 days.
    Please check it!"
else
7z a -t7z -m0=LZMA2 -mmt14 $arcdir/$2/`date +%y%m%d%H%M`.7z $3 $4
fi


aptitude install swaks p7zip-full // 7z и программа для того, чтобы отправлять почту. Она умеет авторизовываться.
В общем, если в архивируемом объекте не будет обнаружен файл, который менялся предыдущие 3 дня, то админу будет отправлен алярм.

Закройте порты

Я обычно добавляю в файл /etc/rc.local файл инициализации фаерволла:
touch /etc/firewall
chmod +x /etc/firewall

А это его содержимое. Обратите внимание, что файл требует внесения своих данных(идентификатор сетевого интерфейса). Это мой рабочий пример. Настраивайте это в самом конце, когда уже всё заработает.

#!/bin/sh
#--------------- Conf -------------
IIF="eth0" # Inside iface
INET="192.168.222.0/24"
I_TCP_PORTS="22" # Inside
#I_UDP_PORTS="53" # Inside

iptables -F # Очищаем все цепочки таблицы filter
iptables -F -t nat # Очищаем все цепочки таблицы nat
iptables -F -t mangle

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Как обычно, пропускаем все, что идет по установленным с

iptables -A INPUT -i $IIF -p tcp -m multiport --dports $I_TCP_PORTS -j ACCEPT # Разрешаем пользователям сети эти порты TCP

iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT

iptables -P INPUT DROP # Остальных блокируем

iptables -P FORWARD DROP # Остальных блокируем
iptables -P OUTPUT ACCEPT # Исходящий трафик разрешаем

 

Готово

Добавляйте пользователей, ставьте клиентскую часть, настраивайте. Каждый раз, когда вы будете устанавливать нового клиента к вашему серверу, где-то вдалеке тихо заплачет ещё один шифровальщик-вымогатель. 

К статье приложен файлец со всеми файлами. 

Спасибо, что дочитали.

Скачать файлы

Наименование Файл Версия Размер
Клиентская и серверная часть системы удалённого резервного копирования
.rar 6,02Mb
14.11.17
3
.rar 0.2 6,02Mb 3 Скачать

См. также

Комментарии
1. Сергей Главатских (ViperGSV) 15.11.17 13:13 Сейчас в теме
На мой взгляд получилось достаточно сложно...
Я использовал примерно такую систему, но перешел на использование Bareos (open source edition)
Из плюсов:
1. Все настраивается на сервере, что копировать, сколько хранить, как сжимать, куда восстанавливать (у клиента только коннектор к серверу)
2. Поддержка VSS
3. Есть скрипты для всех современных БД
4. Есть веб-интерфейс, уведомление на e-mail при архивации (сбоях архивации)

Из минусов: сложность в начальной настройке сервера (только первый раз, пока не поймете философию Bareos :-))
2. Konst Degt (ЕСТЬNULL) 55 16.11.17 02:58 Сейчас в теме
Ну как сложно. Rsync & ssh. За счет простоты и моменты по обеспечению безопасности проверяются быстро. Bareos всё-таки комплекс, в котором большее количество узлов.

Про Bareos не слышал. Обязательно попробую его, как только будет где и когда. Сейчас всё больше становится открытых комплексных решений по узким вопросам, работающих полностью через web-интерфейс. Настраивать что-то руками нужно всё реже и реже, что не может не радовать.

Спасибо за наводку.
3. Александр Кузин (sashocq) 190 16.11.17 16:18 Сейчас в теме
По названию статьи уже надеялся увидеть как в винде настроить rsync. Но, видимо, придётся потихоньку изучать этот Linux.

За статью однозначно спасибо!
4. Konst Degt (ЕСТЬNULL) 55 17.11.17 03:04 Сейчас в теме
Пожалуйста!

Смысл в том, чтобы после синхронизации файлов на удалённый сервер и аккумулировать их в недоступном для клиента месте. Средством доставки может быть и гугл диск, но чтобы заставить работать его в качестве сервиса надо помучиться. Есть, как выяснилось вчера Resilio. Насколько я понял для этих цели resilio подходит лучше, чем гугл диск, но ещё его не пробовал. Так что если нет возможности поставить linux - попробуйте windows + resilio

Linux был выбран во-первых потому что была возможность поставить отдельный сервер. Во вторых большой опыт эксплуатации. Bash я знаю лучше, чем batch. Ну и работает стабильно. Когда я нажимаю кнопку выключить - сервер выключается за 4 секунды. Включается он чуть медленнее(не SSD). Всё по тому, что там нет ничего, кроме необходимого. Как гвоздодёр, ну что в нём может сломаться? И никаких лицензий.

На изучение комплексных систем типа Bareos, нужно время. Его пока нет. Вот если бы кто разжевал хотя бы "Hello world" по ней, чтобы не так страшно было браться, было бы клёво.
5. Дмитрий ххх (dsuryaninov) 14 20.11.17 15:45 Сейчас в теме
Но в случае работы шифровальщика тот же гугл или яндекс диск запишет вам в облако зашифрованный файл, а вашу базу в облаке затрёт.

Возлагаю надежды на версионирование Dropbox в этом случае :)
6. Konst Degt (ЕСТЬNULL) 55 21.11.17 04:20 Сейчас в теме
Неплохой вариант, если Dropbox Basic предоставляет версионирование (не нашёл информации). Если нет, то придется платить 10$/месяц за Dropbox Plus (30 дней истории и 2ТБ) за каждого клиента, если не хотите, чтобы архивы базы клиента А были доступны клиенту Б. Будет же именно так, если вы запихнёте всех в один аккаунт. Хотя может я и ошибаюсь где-то.
7. Дмитрий ххх (dsuryaninov) 14 22.11.17 12:31 Сейчас в теме
(6) Basic позволяет использовать версионирование, причем, количество версий неограничено (так было, когда я пользовался им — сохранял базу в архив с одним и тем же именем файла, например "bp30.zip"). Понятно, что в 2 ГБ, которые предоставляет Dropbox, много баз не влезет, но для кого-то это может быть актуальным.

Чтобы архивы базы клиента А были недоступны клиенту Б придется для каждого создавать аккаунт в Dropbox (что не есть удобно) и выдавать разрешение на работу в папке с его базами из вашего аккаунта.
8. Konst Degt (ЕСТЬNULL) 55 23.11.17 03:25 Сейчас в теме
(7) Я смотрел, Dropbox Plus держит копию 30 дней, скорее всего Basic держит не больше. Чего в принципе достаточно. Надо будет попробовать. Спасибо за идею.
Оставьте свое сообщение