Автоматичні віддалені резервні копії SSH


16

У мене дві машини, Aі B. Машина Aможе вторгнутися B. Aмає багато вільного місця. BДані Росії перебувають у свого роду ризикованій ситуації. Як створити резервну копію всіх Bданих Aавтоматично. Це не повинно бути жахливо частим, але це повинно бути вільними руки. Кожен раз, коли Aчоботи вгору будуть досить частими. Я чую, що синхронізація може це зробити.

Відповіді:


11

Щоб робити це щодня у більшості дистрибутивів Linux, ви повинні мати можливість просто поставити rsyncкоманду ( відповідно до відповіді @ guideo ) у сценарій та поставити сценарій у /etc/cron.dailyкаталог. Поки anacronвстановлено (може не бути за замовчуванням), будь-які пропущені cron.dailyзавдання будуть схоплені при наступному завантаженні машини (а також запуску опівночі, якщо машина включена).

Для сценарію ви просто зробите:

#!/bin/sh
rsync -a user@serverB:/source/folder/ /destination_folder

Ви можете додати параметр -z(стиснення), якщо резервне копіювання перебуває через повільне (ish) з'єднання або якщо ви хочете зберегти пропускну здатність, але, на мій досвід, це фактично зашкодить продуктивності в сучасних машинах / мережах.

Якщо ви хочете вести журнал кожної резервної копії, ви можете зробити щось на кшталт:

#!/bin/sh
rsync -av user@serverB:/source/folder/ /destination_folder \
  >/var/log/backup_log 2>&1

Зауважте, щоб це працювало як завдання cron, для входу в serverB у вас повинно бути встановлено без паролів ssh для root на серверіA. Це повинен бути кореневий рахунок (тобто ключі в /root/.ssh), оскільки cron.dailyзавдання виконуються як root.


Не обов’язково, якщо ви користуєтесь відкритим ключем та за допомогою користувальницької роботи.
Брайам

@Braiam, anacronне братиметься за cronроботу користувача . Хоча ви завжди можете використовувати su/ sudoзі скрипту для запуску rsync як конкретного користувача. Але зауважте, що ключі будуть надійніше тримати під /root.
Graeme

1
якщо ви хочете використовувати cron завдання та ssh з root, набагато безпечніше обмежити, що корінь може робити на другій машині у файлі санкціонованих_кіїв.
гіда

1
@guido, немає потреби входити як root на serverB тільки тому, що ви root на serverA. @JennyD вже дав пропозиції щодо того, що робити тут, але userможе бути просто звичайним користувачем на machineB залежно від того, що ви створюєте резервну копію.
Graeme

1
Швидше за все, ваш користувач не має доступу до читання файлів на SeverB. Якщо це так, вам або потрібно використовувати користувача, який робить, або дати поточному користувачеві правильні дозволи або додавши його до правильних груп, або змінивши дозволи на файли. Якщо ви додасте зразок помилок, які ви отримуєте, і виводу ls -lдеяких файлів до свого запитання, то люди можуть дати подальші поради.
Graeme

5

Я б запропонував використовувати rdiff-резервне копіювання . Я використовую це зараз, щоб робити автоматичні додаткові резервні копії щовечора власних даних (дві робочі станції, два сервери та один обліковий запис на чужому сервері).

Раніше я використовував rsync для цього, але перейшов на rdiff-резервне копіювання, оскільки це зручніше, і він може робити додаткові резервні копії великих файлів, таких як зображення диска віртуальної машини. rdiff-резервне копіювання дуже схоже на мої попередні сценарії резервного копіювання rsync, але зроблено правильно .

Я помістив файл сценарію в /etc/cron.daily на машину, де зберігається резервна копія, яка запускає rdiff-резервну копію раз на день рано вранці, і отримує дані з віддаленої машини.


4

Окрім усіх попередніх відповідей, ось одна, яка покладається на SSH-ключі з обмеженнями щодо того, що можна зробити під час входу за допомогою цього ключа.

На сервері A

У цьому випадку менш важливо, якщо ви створюєте окремого користувача або використовуєте одне з існуючих імен користувачів, хоча, якби це я, я створив би окремого користувача. Я буду використовувати ім’я користувача bkpuserдля обох серверів у наведених нижче прикладах.

Увійшовши в систему bkpuser, створіть ключ SSH без пароля.

На сервері B

Увімкнути PubkeyAuthenticationв sshd_config.

Створіть користувача bkpuser. Встановіть дуже складний пароль або вимкніть вхід пароля для цього користувача (саме те, як ви це зробите, залежатиме від того, який ви використовуєте unix та distro). Справа в тому, що користувач повинен увійти в систему лише за допомогою ключа SSH. Переконайтеся, щоbkpuser має доступ до читання до всіх каталогів та файлів, які потрібно створити резервну копію.

Скопіюйте загальнодоступну частину ключа, створеного на A - ~bkpuser/.ssh/authorized_keysна B. Відредагуйте команду для автоматичного запуску команди під час з'єднання. Ця команда не повинна вказувати на скрипт оболонки; замість цього просто вставте скрипт оболонки в ключ. Також включіть обмеження, щоб ключ можна було використовувати лише з сервера А та жодного іншого сервера. У наведеному нижче прикладі я даю IP-адресу сервера A, 10.1.2.3і я припускаю, що всі файли, під якими я хочу створити резервну копію /data.

from="10.1.2.3",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="cd /data;/usr/bin/tar -cf - *; /usr/bin/logger -t BACKUP -p daemon.info \"INFO: Backup-files on $HOST fetched from ${SSH_CLIENT%% *} by $USER\";" ssh-dss AA.....

На сервері A

Якщо ви використовуєте одну з вкладок cron, яка підтримує @rebootзаписи, додайте такий запис доbkpuser s crontab за допомогою команди ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz. Якщо це не дозволяє, встановіть його в будь-який час, коли вам подобається - якби це були мої дані, я б, мабуть, це робив щодня.


2

Ось повне рішення для резервного копіювання сервера B на сервер A щодня о 4 ранку за допомогою SSH.

Створіть автоматичне з'єднання SSH від сервера B до сервера A

ssh-keygen -t dsa -b 1024
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p ssh_port root@server_a"

Створіть резервний скрипт на сервері B

nano / root / резервне копіювання

# !/bin/sh

# Variables loading
HOST="root@server_a"
PORT=22
DIR="/var/backups/server_b"

# Directories creating
ssh -p $PORT $HOST <<EOF
    mkdir -p $DIR/home
    logout
EOF

# Files backing up
rsync -aze "ssh -p $PORT" --delete /home/user $HOST:$DIR/home

chmod 744 / root / резервне копіювання

Автоматизація резервного копіювання на сервері B

кронтаб -е

0 4 * * * /root/backup > /dev/null

Докладніше див. На сторінках Підключення до SSH без введення пароля в Linux та резервного копіювання сервера на Debian або Ubuntu Linux .


1

Ви можете використовувати rsync для цього (якось зворотним способом):

serverA# rsync -avz user@serverB:/path-to-backup.tar.gz /var/backup

де:

-avz  archive, compress and be verbose

Я впевнений, що це -aозначає -r.
Шадур

ви абсолютно праві
guido

-1

Суть справи полягає в тому, як це зробити автоматично (не потрібно вводити паролі):

  • почати screenабо tmuxсеанс
  • виконати eval $(ssh-agent)
  • додайте ключ за допомогою ssh-add
  • прапори для rsync export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • резервне копіювання кожні 24 години з while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

+1 для пароля ssh.
Graeme

Тож я б поставив усе це в сценарій запуску, правда?
PyRulez

1
Думаю, тут починається "дійсно важливе питання", скільки потрібно безпеки? Робити це з паролями чи без? Це працюватиме лише у тому випадку, якщо ви 1) зробите це з B, призупиніть або перезимує. Якщо ви обійдетесь без паролів, то ви станете своєрідною "ризикованою ситуацією".

Не потрібно додавати RSYNC_SSHдо пошуку стандартні місця розташування ключів SSH.
Павло Шімерда

1
Я знаю це. Ви також наглядали за ...крапками, де можна додати корисні аргументи. Ви також не прочитали мого останнього коментаря, де я згадую про "дійсно важливе питання", тому я ніколи не зроблю це без паролів. Вам також потрібно буде включити, PubkeyAuthenticationі ніхто цього не сказав.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.