Автоматическое резервное копирование с Windows Server на другой сервер.

Оглавление

  1. Установка и настройка OpenSSH на Windows Server 2016
  2. Настройка доступа по SSH в брандмауэре Windows
  3. Установка ключей авторизации для ssh-тоннеля
  4. Установка cwRsync на Windows Server 2016
  5. Автоматизация переноса файлов утилитой rsync
  6. В cron удаляем с Сервера бэкапов старые файлы

Исходные условия

Всем привет! Приведу простой пример автоматизации безопасного переноса созданных бэкапов баз 1С да и любых файлов размещенных на Windows Server на linux-сервер. Как автоматизировать Бэкап баз 1С на PostgreSQL я описал в этой заметке.
Вы спросите в чем проблема? – методов переноса полно, ftp клиенты, winscp, ssh и тому подобное.

И я соглашусь с одним НО! Мне надо было соблюсти следующие условия:

  1. Автоматическое резервное копирование / перенос.
  2. Безопасное резервное копирование между серверами.
  3. Перенос или синхронизацию папок и файлов между Windows Server и Сервером под Linux.

Итак у меня есть Windows Server 2016 c 1C сервером и базами на PostgreSQL и отдельно купленный сервис FTP-бэкап 500Гб за 250 руб. в месяц (смешные деньги за такой объем если честно) в одном дата-центре в Новосибирске.

Для переноса я буду использовать утилиту rsync ну потому что она мне импонирует своими возможностями. Одна проблема, утилита изначально создана для Unix-подобных систем. Но как говориться – было бы желание.

Как вы понимаете, нельзя просто так взять и закинуть на первую попавшуюся машину файлы без установки на нее специального программного обеспечения. На удаленной машине должен быть установлен и настроен RSYNC, SSH и FTP сервер, с помощью которого Rsync сможет авторизоваться на машине и передавать туда файлы.

Пошукав немного интернет я увидел две проблемы:

  1. Описания настройки синхронизации утилитой rsync между windows серверами датируются лохматыми годами.
  2. Более свежие статьи все сводятся к тому, чтобы установить на Windows Server не просто утилиту cwRsync, а поставить на сервер cwRsyncServer и к нему в дагонку еще какой нибудь Copssh. Причем все это просит создать на Windows Server отдельных пользователей с расширенными правами, хм а как же безопасное?
  3. Ну и по ходу еще нарисовалась подножка в виде закрытого для россии сервиса, который разрабатывает cwRsync Server. Да в общем и то обещало быть платным.

Не хотелось лишних “заточенных под винду” радостей с заблоченного сервера, да еще за деньги. А как же напильник?!

1. Установка и настройка OpenSSH на Windows Server 2016:

На сервере источнике – Windows server 2016 установим клиента OpenSSH
Качаем OpenSSH с открытых источников на ГитХабе https://github.com/PowerShell/Win32-OpenSSH/releases
и распаковываем архив: извлечем содержимое архива например в директорию

$ C: \ Program Files \ OpenSSH-Win64.

открываем в любимом редакторе, да хоть в блокноте файл конфигурации sshd_config_default
и раскомментируем порт 22 – также поменяем его на другой, чтобы снизить вероятность брутфорса
можно конечно посмотреть какие порты на сервере заняты:

$ netstat -a

например не занят порт 58 292 его и пропишем сохраним закроем файл.

Теперь изменим/пропишем путь в системную переменную среды выполнив команду в PowerShell:

$ setx PATH "$env:path;C:\Program Files\OpenSSH-Win64" -m

Вы должны увидеть следующий результат:

$ SUCCESS: Specified value was saved.

Затем перейдем в каталог OpenSSH:

$ cd "C:\Program Files\OpenSSH-Win64"

И запустим сценарий установки:

$ .\install-sshd.ps1

Также настроим автоматический запуск в качестве службы SSHD и SSH-агент:

$ Set-Service sshd -StartupType Automatic; Set-Service ssh-agent -StartupType Automatic; Start-Service sshd; Start-Service ssh-agent

2. Настройка доступа по SSH в брандмауэре Windows

Откроем Панель управления -> Брандмауэр Windows:

Выбрать Дополнительные параметры, затем выберите Правила для входящих подключений -> Создать правило…:

Под Тип правила, Выбрать “Для программы” -> Далее.

Под Программа, Выбрать “Все программы” -> Далее.

Настройка Брандмауэра

В вкладке “Протоколы и порты” введите желаемый порт SSH со следующими параметрами:

Во вкладке Область, пусть правило применяется к Любой IP-адрес для удаленных и локальных IP-адресов, или укажите конкретные IP -> Далее.

Вкладка Действие, Выбрать Разрешить подключение -> Далее.

В Профиль, выбраны все профили Домен, Частный, а также Общественные проверено -> Далее.

И наконец, назовите правило и жмите Конец.

Теперь вы можете получить доступ к своему серверу Windows через SSH!

3. Установка ключей авторизации для ssh-тоннеля.

Для безопасной передачи файлов в автоматическом режиме путем организации организации ssh-тоннеля установим Ключи авторизации ssh.

Чтобы в автоматическом режиме не задавать пароль в скрипте, организуем на сервере Windows ключи авторизации SSH, для этого в терминале запустим команду:

$ ssh-keygen

будет предложено ввести файл в который сохранить ключ – оставим как есть.

$Enter file in which to save the key (C:\Users\localuser/.ssh/id_rsa): 

также будет предложено ввести дополнительную фразу пароля (оставляем как есть)

Enter passphrase (empty for no passphrase): (оставляем как есть) 
Enter same passphrase again: 
Your identification has been saved in C:\Users\localuser/.ssh/id_rsa. 
Your public key has been saved in C:\Users\localuser/.ssh/id_rsa.pub. 
The key fingerprint is:

he key's randomart image is:
+---[RSA 3072]----+
+----[SHA256]-----+

При создании получим два ключа:

~/.ssh/id_rsa.pub — открытый ключ. Его копируют на сервера, куда нужно получить доступ.
~/.ssh/id_rsa — закрытый ключ. Его нельзя никому показывать.

После создания ключей, необходимо открытый ключ скопировать на Linux сервер в папку пользователя, под которым будем коннектиться: и в ней разместить ключь в папку ~/.ssh/ в файл authorized_keys

Есть два способа это сделать:
в терминале Windows Server использовать команду

$ ssh-copy-id user@server 

(но у меня не взлетело с первого раза, в чем проблема была – потом нашёл 😉 )

и второй способ: на Linux сервере в домашней папке пользователя создаем папку .ssh

$ mkdir .ssh

и в ней создаем файл authorized_keys например редактором nano

$ nano authorized_keys

Открываем на Windows сервере файл id_rsa.pub и копируем из него всю записанную туда строку
в файл authorized_keys -> далее сохраняем, закрываем.

Проверяем работоспособность:

на Windows Server в терминале запускаем команду:

$ ssh user@host

где user – это имя пользователя, host – IP сервера Linux
Должно произойти успешное подключение без пароля! Первый раз может спросить подтверждения подключения к серверу по SSH с использованием ключа.

$ This key is not known by any other names 
$ Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

В дальнейшем уже будет проходить подключение без вопросов. Можно проверить отключившись и опять подключившись по ssh к удаленному серверу с Window Server-а.

4. Установка cwRsync на Windows Server 2016

Скачиваем утилиту cwRsync. Установщик можно скачать с сайта разработчика отсюда.
(Для России может быть заблочено, но тот-же Касперский дает бесплатное VPN соединение)

Ну или можно пошукать на просторах интернета, да хоть в GitHub-е несколько тысяч копий разных версий.

Лучше конечно выбрать последнюю версию.
Распаковываем в удобную для нас папку например в D:\Backup\cwrsync на Windows Server
и для удобства записываем в системные переменные окружения путь к командным файлам:
$CYGWIN_INSTALL_PATH/bin/ в переменную окружения PATH
Панель управления -> Система -> Дополнительно -> Переменные окружения

переходим в папку D:\Backup\cwrsync и находим файл cwrsync.cmd сделаем из него копию под другим именем, например cwrsync_work.cmd и откроем его в редакторе (блокнот тоже подойдет):

@ECHO OFF
REM *****************************************************************
REM
REM CWRSYNC.CMD - Batch file template to start your rsync command (s).
REM
REM *****************************************************************

REM Make environment variable changes local to this batch file
SETLOCAL

REM Specify where to find rsync and related files
REM Default value is the directory of this batch file
SET CWRSYNCHOME=%~dp0

REM Make cwRsync home as a part of system PATH to find required DLLs
SET PATH=%CWRSYNCHOME%\bin;%PATH%

REM Windows paths may contain a colon (:) as a part of drive designation and 
REM backslashes (example c:\, g:\). However, in rsync syntax, a colon in a 
REM path means searching for a remote host. Solution: use absolute path 'a la unix', 
REM replace backslashes (\) with slashes (/) and put -/cygdrive/- in front of the 
REM drive letter:
REM 
REM Example : C:\WORK\* --> /cygdrive/c/work/*
REM 
REM Example 1 - rsync recursively to a unix server with an openssh server :
REM
REM       rsync -r /cygdrive/c/work/ remotehost:/home/user/work/
REM
REM Example 2 - Local rsync recursively 
REM
REM       rsync -r /cygdrive/c/work/ /cygdrive/d/work/doc/
REM
REM Example 3 - rsync to an rsync server recursively :
REM    (Double colons?? YES!!)
REM
REM       rsync -r /cygdrive/c/doc/ remotehost::module/doc
REM
REM Rsync is a very powerful tool. Please look at documentation for other options. 
REM

REM ** CUSTOMIZE ** Enter your rsync command(s) here

rsync --version
ssh -V

нас интересует Пример 1 (Example 1) и из него делаем свою строку выполнения команды:

После строки

REM ** CUSTOMIZE ** Enter your rsync command(s) here

Пишем свою (в моем примере папка для бэкапа была на диске d:/Backup/Backup/)

$ rsync -arv /cygdrive/d/Backup/Backup/ user@IPhost:/home/user/Backup/

где, понятное дело, user@IPhost – это наш доступ по ssh, ну а далее складываем все в указанную папку. (расшифровку ключей можете почитать в задав команду: $ rsync –help

в моем случае я задал куда более интересную команду:

$ rsync --remove-source-files --chown=user123:user123 -arv --log-file=/cygdrive/d/Logsync/log.txt /cygdrive/d/Backup/Backup/ user123@IPhost:/home/user123/Backup/ --progress

Если расшифровать то получится так: после синхронизации синхронизируемые файлы из локальной папки источника будут удалены, при синхронизации в целевой каталог задаем синхронизируемым файлам права пользователя на linux сервере.
для настройки и проверки запуска установим запись в лог происходящего –log-file=log.txt – будет писаться лог в папке откуда запущен rsync или можно явно указать куда мы хотим писать файл например /cygdrive/d/Logsync и в конце ключ –progress.

Когда пройдем весь цикл с использованием планировщика и получим положительный результат – можем убрать эту подробную запись в лог.

Сохраняем наши изменения в файле cwrsync_work.cmd.

Далее размешаем в директорию-источник d:/Backup/Backup/ тестовые файлы и запускаем батник синхронизации.

$ cwrsync_work.cmd

Проверяем папки на обоих серверах и видим результат переноса:

На Linux сервер перенесены все файлы из указанной директории-источника на Windows server и в Директории-источнике перенесенные файлы удалены. При этом на Linux-сервере файлы размещены с правами необходимого пользователя!

Результат получен!

5. Автоматизация переноса файлов утилитой rsync

Ставим задачу в планировщик задач Windows

Пуск – Панель Управления – Администрирование – Планировщик заданий.

создаем задачу -> Задаем ей имя в планировщике -> указываем место расположения нашего батника cwrsync_work.cmd и устанавливаем триггеры (расписание начала задачи).

Я ставлю еженедельно задачу в рабочие дни ночью после выполнения задачи БЭКАПА
и указываем Действие: Создать -> программу сценарий: (находим нашу программу)cwrsync_work.cmd. Жмем Ок.

Всё, наш Скрипт создан и установлен в планировщик Windows. Осталось проверить его работоспособность: прямо в планировщике задач выбираем нашу задачу и вызвав правой кнопкой мыши контекстное меню, выбираем “Запустить” – далее смотрим результат. радуемся жизни или анализируем причины записи ошибок в лог.

6. В cron удаляем с Сервера бэкапов старые файлы.

Если не проводить очистку от старых бэкапов, то рано или поздно на сервере бэкапов не останется места на дисках и поэтому ставим к Cron задание.

Заходим на Linux-сервер ( в нашем случае это сервер Бэкапов) и ставим задачу в Cron

в Терминале открываем в редакторе crontab:

$ crontab -e

Как открыть crontab в nano, просто командой:

$ EDITOR=nano crontab -e

Записываем команду:

0 0 * * * find /home/user123/Backup -depth -mtime +31 -exec rm {} \; > /home/user123/1.log

в 00 минут 00 часов каждый день в папке и подпапках будет проводиться проверка на наличие
файлов старше 31 дня и при обноружении таких – они будут удаляться. Выполнение Cron-а будет
писаться в лог в папке пользователя.

Ctrl+O – сохраняем
Ctrl+X – выходим

Останется на следующий день проконтролировать как работают все этапы в связке.

Надеюсь статья была полезна!

Нет Ответов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *