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