SSH backup jarak jauh otomatis


16

Saya punya dua mesin, Adan B. Mesin Abisa ssh ke B. Amemiliki banyak ruang kosong. BData berada dalam situasi yang berisiko. Bagaimana cara mencadangkan semua Bdata Asecara otomatis. Tidak harus terlalu sering, tetapi harus bebas tangan. Setiap kali Abooting akan cukup sering. Saya mendengar sinkronisasi dapat melakukan ini.

Jawaban:


11

Untuk melakukan ini setiap hari di sebagian besar distro Linux, Anda harus bisa memasukkan rsyncperintah (sesuai jawaban @ guido ) dalam sebuah skrip dan memasukkan skrip ke dalam /etc/cron.dailydirektori. Selama anacrondiinstal (mungkin tidak secara default) setiap cron.dailypekerjaan yang tidak terjawab akan menyusul pada saat mesin dinyalakan (serta dijalankan pada tengah malam jika mesin diaktifkan).

Untuk skrip yang akan Anda lakukan:

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

Anda dapat menambahkan opsi -z(kompresi) jika cadangan melalui koneksi yang lambat (ish) atau jika Anda ingin menghemat bandwidth, tetapi dalam pengalaman saya itu sebenarnya akan merusak kinerja dengan mesin / jaringan modern.

Jika Anda ingin menyimpan log dari setiap cadangan, Anda dapat melakukan sesuatu seperti:

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

Catatan agar ini berfungsi sebagai tugas cron, Anda harus memiliki ssh tanpa kata sandi yang diatur untuk root pada serverA untuk masuk ke serverB. Itu harus menjadi akun root (mis. Kunci masuk /root/.ssh) karena cron.dailypekerjaan dijalankan sebagai root.


Belum tentu jika Anda menggunakan kunci publik dan cronjobs per pengguna.
Braiam

@Braiam, anacrontidak akan mengambil per cronpekerjaan pengguna . Meskipun Anda selalu dapat menggunakan su/ sudodari skrip untuk menjalankan rsync sebagai pengguna tertentu. Tetapi perhatikan bahwa kunci akan lebih aman dipegang di bawah /root.
Graeme

1
jika Anda ingin menggunakan pekerjaan cron dan ssh dengan root, jauh lebih aman untuk membatasi root apa yang dapat dilakukan di mesin kedua dalam file authorized_keys.
guido

1
@guido, tidak ada persyaratan untuk masuk sebagai root di serverB hanya karena Anda root pada serverA. @ JennyD telah memberikan saran tentang apa yang harus dilakukan di sini, tetapi userbisa saja menjadi pengguna normal pada mesinB tergantung pada apa yang Anda cadangkan.
Graeme

1
Kemungkinan besar pengguna Anda tidak memiliki akses baca ke file-file di severB. Jika demikian, Anda harus menggunakan pengguna yang melakukan atau memberikan izin kepada pengguna saat ini baik dengan menambahkannya ke grup yang benar atau mengubah izin pada file. Jika Anda menambahkan sampel kesalahan yang Anda dapatkan dan output ls -lpada beberapa file untuk pertanyaan Anda, maka orang dapat memberikan saran lebih lanjut.
Graeme

5

Saya sarankan menggunakan rdiff-backup . Saya menggunakannya sekarang untuk membuat backup inkremental otomatis setiap malam dari data saya sendiri (dua workstation, dua server dan satu akun di server orang lain).

Saya menggunakan rsync sebelumnya untuk ini, tetapi beralih ke rdiff-backup karena lebih nyaman, dan itu dapat membuat cadangan tambahan file besar seperti gambar disk mesin virtual. rdiff-backup sangat mirip dengan skrip backup rsync saya sebelumnya, tetapi dilakukan dengan benar .

Saya telah meletakkan file skrip di /etc/cron.daily di mesin tempat cadangan disimpan, yang memulai rdiff-cadangan sekali setiap hari di pagi hari, dan mengambil data dari mesin jarak jauh.


4

Selain semua jawaban sebelumnya, berikut adalah salah satu yang bergantung pada kunci SSH dengan batasan pada apa yang bisa dilakukan ketika masuk dengan kunci itu.

Di server A

Yang ini kurang penting jika Anda membuat pengguna terpisah atau menggunakan salah satu nama pengguna yang ada, meskipun jika itu saya, saya akan membuat pengguna terpisah. Saya akan menggunakan nama pengguna bkpuseruntuk kedua server dalam contoh saya di bawah ini.

Saat masuk bkpuser, buat kunci SSH tanpa kata sandi.

Di server B

Aktifkan PubkeyAuthenticationdi sshd_config.

Buat pengguna bkpuser. Tetapkan kata sandi yang sangat rumit, atau nonaktifkan login kata sandi untuk pengguna tersebut (cara Anda melakukannya tergantung pada unix dan distro yang Anda jalankan). Intinya, pengguna hanya harus login dengan kunci SSH. Pastikan yang bkpusermemiliki akses baca ke semua direktori dan file yang ingin Anda buat cadangannya.

Salin bagian publik dari kunci yang dibuat pada A ke ~bkpuser/.ssh/authorized_keyspada B. Edit untuk secara otomatis menjalankan perintah pada koneksi. Perintah itu seharusnya tidak menjadi pointer ke skrip shell; alih-alih masukkan skrip shell ke kunci secara langsung. Juga termasuk batasan sehingga kunci hanya dapat digunakan dari server A dan tidak ada server lain. Dalam contoh di bawah ini, saya memberikan server A alamat IP 10.1.2.3dan saya berasumsi bahwa file yang ingin saya buat cadangan semuanya ada di bawah /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.....

Di server A

Jika Anda menggunakan salah satu tab cron yang mendukung @rebootentri, tambahkan entri seperti itu ke bkpusers crontab dengan perintah ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz. Jika itu tidak memungkinkan, atur kapan saja Anda suka - jika itu data saya, saya mungkin melakukannya setiap hari.


2

Berikut ini adalah solusi lengkap untuk membuat cadangan server B ke server A setiap hari pada jam 4 pagi menggunakan SSH.

Buat koneksi SSH otomatis dari server B ke server A

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

Buat skrip cadangan di server B

nano / root / cadangan

# !/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 / cadangan

Otomatiskan cadangan pada server B

crontab -e

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

Untuk lebih jelasnya lihat halaman Hubungkan ke SSH tanpa memasukkan kata sandi di Linux dan Cadangkan server di Debian atau Ubuntu Linux .


1

Anda dapat menggunakan rsync untuk ini (dengan cara yang agak terbalik):

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

dimana:

-avz  archive, compress and be verbose

Saya cukup yakin -amenyiratkan -r.
Shadur

Anda sepenuhnya benar
guido

-1

Inti masalahnya adalah bagaimana melakukannya secara otomatis (tidak perlu memasukkan kata sandi):

  • memulai screenatau tmuxsesi
  • menjalankan eval $(ssh-agent)
  • tambahkan kunci Anda dengan ssh-add
  • bendera untuk rsync export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • backup setiap 24 jam dengan while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

+1 untuk tanpa kata sandi ssh.
Graeme

Jadi saya akan menempatkan semua ini dalam skrip start up, kan?
PyRulez

1
Saya pikir di sini mulai "pertanyaan yang sangat penting" berapa banyak keamanan yang dibutuhkan? Apakah itu dengan kata sandi atau tanpa kata sandi? Ini hanya akan berfungsi jika Anda 1) melakukannya dari B, menangguhkan atau hibernasi A. Ini tidak akan berfungsi jika Anda mematikan A. Jika Anda melakukannya tanpa kata sandi maka Anda akan menjadi semacam "situasi berisiko".

Tidak perlu menambahkan RSYNC_SSHuntuk mencari lokasi standar kunci SSH.
Pavel Šimerda

1
Saya tahu itu. Anda juga mengawasi ...titik - titik tempat Anda dapat menambahkan argumen yang bermanfaat. Anda juga tidak membaca komentar terakhir saya di mana saya menyebutkan "pertanyaan yang sangat penting" sehingga saya tidak akan pernah melakukannya dengan kunci tanpa kata sandi. Anda juga harus mengaktifkan PubkeyAuthenticationdan tidak ada yang mengatakannya.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.