backup server with rsync

Salah satu aktifitas penting yang harus dilakukan oleh seorang sysadmin adalah backup server. Sehingga apabila sesuatu musibah menimpa server baik karena masalah hardware ataupun virus atau aktifitas cracking maka data2x penting di server dipastikan dalam kondisi aman karena ada backup nya.

Salah satu aplikasi opensource yang cukup powerfull menurut penulis adalah rsync. Kenapa penulis katakan powerfull, dikarenakan rsync dapat melakukan replikasi file dari suatu host ke host yang lain via network dengan suatu algoritma yang memungkinkan deteksi file2x apa saja yang perlu didownload (misal hanya file2x yang mengalami perubahan dari suatu direktori).

Berikut dokumentasi penggunaan rysnc untuk backup suatu server yang pernah penulis lakukan :

A. Host yang digunakan :

– Satu buah server yg berada di NOC dengan OS FreeBSD (server 1.exampel.com)

– Satu buah backup server yg berada di Unit Kerja dengan OS FreeBSD  (server 2)

B. Instalasi Rsync

Lakukan instalasi rsync dikedua server (server 1 dan server 2), login sebagai root :

#cd /usr/ports/net/rsync
#make install

Cek fungsi rsync misal ke server mirrors.ibiblio.org :

#rsync mirrors.ibiblio.org::

C. Backing up lewat module

Login ke server 1 sebagai root, buat file konfigurasi untuk akses ke web direktori misal :

#vi /usr/local/etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = no
max connections = 4
syslog facility = local5

[data]
comment = data web  “rsync server1.example.com::”
path = /usr/local/www/apache22/data
read only = yes
list = yes
uid = nobody
gid = nogroup
auth users = bagus, asih
secrets file = /usr/local/etc/rsyncd.secrets


#vi /usr/local/etc/rsyncd.secrets
bagus:baguspass
asih:asihpass


Jalankan rsync daemon :

#rsync --daemon

Pada server2, login sebagai root lakukan rsync ke server1.example.com :

#rsync -avz server1.example.com::data ~user/backup/server1/

Supaya bisa jalan pada waktu booting tambahkan item rsync_enable pada rc.conf :

# echo "rsyncd_enable=YES" >> /etc/rc.conf
# /usr/local/etc/rc.d/rsyncd start

D. Backing up lewat ssh (secure conection)

Login ke server 2, kemudian lakukan rsync ke server1.example.com misal back up folder home directory user :

$rsync -e ssh -avz user@server1.example.com: ~user/backup/user@server1/
Could not create directory '/home/user/.ssh'.
The authenticity of host 'lpp.uns.ac.id (222.124.162.136)' can't be established.
DSA key fingerprint is 3f:62:be:50:f5:c0:bc:73:cd:b5:2f:35:7d:8a:83:e1.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/home/user/.ssh/known_hosts).
Password:

Perintah diatas melakukan rsync ke home directory user ke server 2, jadi syarat dari rsync lewat ssh adalah mempunyai user login pada server1.example.com dan hanya bisa melakukan back up ke directory milik user yang bersangkutan.

Dengan perintah diatas, user diharuskan memasukan password dari user yang bersangkutan, hal ini tentu merepotkan apabila kita mau melakukan backing secara periodik melalui crontab.

Berikut langkah-langkah supaya proses back up bisa berjalan secara otomatis :

– Misal kita mau back up data folder webmail (~admin/webmail) dari user admin pada server1.example.com ke  server 2 dengan folder /usr/backup/

– Pertama pada server 2 : Buat key di server backup / server 2 (login sebagai root)

#mkdir /root/rsync
#ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): (tekan enter)
Enter same passphrase again:  (ekan enter)
Your identification has been saved in /root/rsync/mirror-rsync-key.
Your public key has been saved in /root/rsync/mirror-rsync-key.pub.
The key fingerprint is:
fd:38:af:94:f2:7c:6c:b4:51:72:40:fb:03:39:a1:3f root@server2

– Kemudian copykan ke server utama (sesuai dengan user yg akan dicopy, dalam kasus ini admin:

#scp /root/rsync/mirror-rsync-key.pub admin@server1.example.com:
Password:
mirror-rsync-key.pub

– Login ke server utama dengan login user BIASA (bukan root) dalam hal ini admin, kemudian ikuti langkah berikut :

$mkdir ~/.ssh
$chmod 700 ~/.ssh
$mv ~/mirror-rsync-key.pub ~/.ssh/
$cd ~/.ssh
$touch authorized_keys
$chmod 600 authorized_keys
$cat mirror-rsync-key.pub >> authorized_keys

– Tes copy lagi lewat server backup / server 2 (login sebagai ROOT),  :

#mkdir /usr/backup/
#rsync -avz --delete -e "/usr/bin/ssh -p 22 -i /root/rsync/mirror-rsync-key" admin@server1.example.com:/usr/home/admin/webmail/ /usr/backup/

Selamat saudara tidak perlu memasukan password lagi.
ctt : gunakan opsi –delete untuk update data (yg dicopy hanya file baru atau ketika file sumber dihapus maka juga akan menghapus file source)

– Buat file checkrsync untuk proteksi penggunaan ssh (login sebagai user biasa, dalam hal ini admin, tambahkan baris berikut pd authorized_keys ( command=”/home/bagus/rsync/checkrsync”,no-port-forwarding,no-X11-forwarding,no-pty ) :

$vi ~/.ssh/authorized_keys
command="/home/bagus/rsync/checkrsync",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3N ..... Zoxhsfaw= root@server2

Kemudian buat file checkrsync :

$mkdir ~/rsync
$vi ~/rsync/checkrsync
#!/bin/sh

case “$SSH_ORIGINAL_COMMAND” in
*\&*)
echo “Rejected”
;;
*\(*)
echo “Rejected”
;;
*\{*)
echo “Rejected”
;;
*\;*)
echo “Rejected”
;;
*\<*)
echo “Rejected”
;;
*\`*)
echo “Rejected”
;;
*\|*)
echo “Rejected”
;;
rsync\ –server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo “Rejected”
;;
esac
$chmod 700 ~/rsync/checkrsync

Jalankan rsync lagi :

#rsync -avz --delete -e "/usr/bin/ssh -p 22 -i /root/rsync/mirror-rsync-key" admin@server1.example.com:/usr/home/admin/webmail/ /usr/backup/

– Tambahkan ke cron job :
Format minute hour day month weekday who command
Minute – Minutes after the hour (0-59).
Hour – 24-hour format (0-23)
Day – Day of the month (1-31)
Month – Month of the year (1-12)
Weekday – Day of the week (0-6), the 0 refers to Sunday
Who – (optional) Who this job should run as
Command – The command to execute at the specified time

Jalankan , crontab –e sebagai root (misal tiap jam 1 pagi)

#crontab –e
0 1 * * * /usr/local/bin/rsync -avz --delete -e "/usr/bin/ssh -p 22 -i /root/rsync/mirror-rsync-key" admin@server1.example.com:/usr/home/admin/webmail/ /usr/backup/

D. Backing up databases

Untuk back up database gunakan perintah mysqldump, login pada server 2 :
#mysqldump -u root -p -h host.name.domain.name --opt --all-databases > /usr/backup/db/all.dump
Password:

Supaya jalan otomatis tinggal tambahkan ke crontab, misal tiap jam 01.30
#crontab –e
30 1 * * * /usr/local/bin/
mysqldump -u root -pPasswodRootMysql -h host.name.domain.name --opt --all-databases > /usr/backup/db/sql.dump

Untuk mengembalikan database, cp file sql.dump ke server 1 kemudian ekstrak dengan perintah mysql
#scp /usr/backup/db/all.dump admin@server1.example.com:
Password:

Pada server 1, login sebagai root kemudian jalankan perintah berikut :
#mysql -u root -p < ~admin/all.dump

Untuk backup 1 database  jalankan perintah berikut :
#mysqldump -u root -p --opt nama_db > /usr/backup/db/nama_db.dump
Password:

#mysql -u root -p nama_db < ~admin/nama_db.dump