Rsnapshot Local et ssh
Un article de Casys (Canadian Sysadmins).
Auteur: Thomas Boutry
Sommaire |
Description
Nous avons 2 serveurs un serveur Mail et un serveur Web nous désirons réaliser des backups croisé.
Dans le document présent nous réaliserons un backup du serveur Mail localement et un backup du serveur Web via le système SSH.
Bien entendu la même opération devra être réalisé sur le serveur Web afin d'avoir un backup externe du serveur Mail.
serveur mail.example.com , ip : 192.168.1.111
serveur www.example.com , ip : 192.168.1.222
Installation du logiciel de backup (rsnapshot)
Ajout du repesiroty d'installation rpmforge
- Installation de yum-priorities
yum install yum-priorities
- configuration de yum-priorities, modification des priorité d'installation
vi /etc/yum.repos.d/CentOS-Base.repo
Modification
[base] priority=1 [updates] priority=1 [addons] priority=1 [extras] priority=1 [centosplus] priority=2
- téléchargement du pacakge rpmforge
wget http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
- Mise en place de la clef gpg utilisé pour la signature des packages
rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
- Installation du package rpmforge
rpm -i rpmforge-release-0.3.6-1.el5.rf.*.rpm
- Exclusion de postfix dans le package de rpmforge
vi /etc/yum.repos.d/rpmforge.repo
Ajout:
exclude=postfix*
Installation de rsnapshot
- Installation de rsnapshot
yum install rsnapshot
Configuration d'un backup local
- Création des répertoires
mkdir /etc/rsnapshot mkdir -p /srv/backups/snapshots mkdir /var/log/rsnapshot mkdir /etc/rsnapshot/RCS
- Change les permissions pour pas que tout le monde vois les backup
chmod o-rx /srv/backups/snapshots/ chmod o-rx /srv/backups/
- Création du fichier de configuration
vi /etc/rsnapshot/mail-srv.conf
ATTENTION le délémiteur doit etre un TAB pas d'espace sinon vous aurez des erreur
Fichier:
config_version 1.2 snapshot_root /srv/backups/snapshots/mail-srv cmd_cp /bin/cp cmd_rm /bin/rm cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_logger /usr/bin/logger cmd_du /usr/bin/du cmd_rsnapshot_diff /usr/bin/rsnapshot-diff interval daily 7 interval weekly 4 interval monthly 3 verbose 2 loglevel 4 logfile /var/log/rsnapshot/mail-srv.log exclude_file /etc/rsnapshot/mail-srv.exclude rsync_long_args --delete --numeric-ids --delete-excluded lockfile /var/run/rsnapshot-mail-srv.pid backup /home/ home/ backup /etc/ etc/ backup /root/ root/ backup /var/www/ var_www/
- Création du fichier d'Exclusion (actuellement vide)
touch /etc/rsnapshot/mail-srv.exclude
- Commit le fichier
ci -u /etc/rsnapshot/mail-srv.conf
- Mise en place de la tache periodique
crontab -e
#MAILTO="" ##Supresses output MAILTO=root ################################################################### #minute (0-59), # #| hour (0-23), # #| | day of the month (1-31), # #| | | month of the year (1-12), # #| | | | day of the week (0-6 with 0=Sunday)# #| | | | | commands # ################################################################### 15 02 * * * /usr/bin/rsnapshot -c /etc/rsnapshot/mail-srv.conf daily 15 03 * * Sun /usr/bin/rsnapshot -c /etc/rsnapshot/mail-srv.conf weekly 30 03 1 * * /usr/bin/rsnapshot -c /etc/rsnapshot/mail-srv.conf monthly
Création du backup de mysql
- Création des répertoire pour mysql
mkdir /srv/backups/mysql chmod o-rx /srv/backups/mysql
- Création du script de backup
mkdir /usr/local/sysadmin/bin chmod o-rx /usr/local/sysadmin/ vi /usr/local/sysadmin/bin/backup-mysql.py
Fichier:
#!/usr/bin/env python
#
#
# Author : Pior Bastida <pior.bastida@*******.com>
#
import os
dbs = os.popen('/usr/bin/mysql -u root --password=****** -E -e "show databases;"', 'r').readlines()
for db in dbs:
if db.startswith("Database: "):
dbname = db.split(':')[1].strip()
os.system("/usr/bin/mysqldump --defaults-file=/etc/my.cnf -u root --password=******* --opt " + dbname + " | gzip > /srv/backups/mysql/dump-" + dbname + ".sql.gz")
- Changement de permission
chmod o-rx /usr/local/sysadmin/bin/backup-mysql.py chmod u+x /usr/local/sysadmin/bin/backup-mysql.py
- Test et validation
/usr/local/sysadmin/bin/backup-mysql.py ls /srv/backups/mysql/
- Prise du backup mysql dans rsnapshot
co -l /etc/rsnapshot/mail-srv.conf vi /etc/rsnapshot/mail-srv.conf
AJOUT:
cmd_preexec /usr/local/sysadmin/bin/backup-mysql.py backup /srv/backups/mysql/ mysql-dump/
Validation de l'install de rsnapshot
/usr/bin/rsnapshot -c /etc/rsnapshot/mail-srv.conf daily ls /srv/backups/snapshots/mails-srv/daily.0/mysql-dump/
Réalisation du backup du Srv Web
Création de l'usagé backup sur le serveur web
adduser --non-unique --uid 0 backup
Je lui donne un uid de 0 pour qu'il soit comme l'usagé root afin de ne pas avoir de problème pour le backup des fichiers contenu
dans le répertoire /etc et autres.
Réalisation des clef ssh et authorisation
- Réalisation d'un clef ssh sur le serveur MAIL
Cette opération doit être réaliser avec l'usagé ROOT car c lui qui execute le scripts de rsnapshot.
Attention ne pas mettre de PAssphrase
ssh-keygen -t dsa -b 1024
- Mise en place de la clef SSH sur le serveur WEB
- Dans le fichier authorized_keys il faut mettre le contenu du fichier /root/.ssh/id_dsa.pub contenu sur le serveur MAIL.
mkdir -p /home/backup/.ssh vi /home/backup/.ssh/authorized_keys
Exemple du contenu :
from="192.168.1.111",command="/usr/local/bin/validate-rsync.sh" ssh-dss AAAAB3NzaC1kc3MAAACBAPA07qr0aDE9i4SCknKgieuxyPu4kAWSrGviiG8QQRQDoiFtuujs TZYTSLmoJv8XkUwhyVV2V/mlIds+EnhDOjNbSlon2UHPAAAAFQCfD2pEmRzFJ ....
- Changement des permissions des fichier et du propriétaire.
chown -R backup:backup -R /home/backup chmod 440 /home/backup/.ssh/*
Ici le from permet de limite l'ip de connection et la command permettra de limité a la command rsync uniquement, en d'autre mot
Aucun shell ne sera disponible a l'usagé.
- Création du fichier validate-rsync.sh
vi /usr/local/bin/validate-rsync.sh
FICHIER:
#!/bin/sh case "$SSH_ORIGINAL_COMMAND" in *\&*) echo "Rejected" ;; *\;*) echo "Rejected" ;; rsync\ --server*) $SSH_ORIGINAL_COMMAND ;; *) echo "Rejected" ;; esac
- Changement des permissions
chmod a+x /usr/local/bin/validate-rsync.sh
Test du setup
- Sur le serveur MAIL réalisation d'un rsync du répertoir /etc
mkdir /root/tmp/test-rsync cd /root/tmp/test-rsync rsync -avz backup@www.example.com:/etc .
- tentative avec ssh uniquement
ssh www.example.com
Résultat:
[root@cl-t142-420cl tmp]# ssh backup@www.example.com Rejected Connection to www.example.com closed.
- l'important est le rejected :).
Configuration de rsnapshot
- Configuration réalisé sur le serveur MAIL
Réalisation de la configuration
- Edition du fichier de configuration
touch /etc/rsnapshot/web-srv.exclude vi /etc/rsnapshot/web-srv.exclude
FICHIER:
config_version 1.2 snapshot_root /srv/backups/snapshots/web-srv cmd_cp /bin/cp cmd_rm /bin/rm cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_logger /usr/bin/logger cmd_du /usr/bin/du cmd_rsnapshot_diff /usr/bin/rsnapshot-diff interval daily 7 interval weekly 4 interval monthly 3 verbose 2 loglevel 4 logfile /var/log/rsnapshot/web-srv.log exclude_file /etc/rsnapshot/web-srv.exclude rsync_long_args --delete --numeric-ids --delete-excluded lockfile /var/run/rsnapshot-web-srv.pid backup backup@www.example.com:/home/ home/ backup backup@www.example.com:/etc/ etc/ backup backup@www.example.com:/root/ root/ backup backup@www.example.com:/var/www/ var_www/ backup backup@www.example.com:/srv/backups/mysql/ mysql-dump/
- Commit
ci -u /etc/rsnapshot/web-srv.conf
- Création des répertoires
mkdir -p /srv/backups/snapshots/web-srv
Test du setup
/usr/bin/rsnapshot -c /etc/rsnapshot/web-srv.conf daily
Après plusieurs minutes tout semble bon :D.
Configuration du backup mysql
- Configuration d'un usagé mysql pour la réalisation du backup sur le serveur WEB
mysql -u root -p
use mysql
insert into user (Host,User,Password,Select_priv,Create_tmp_table_priv,Lock_tables_priv,Show_view_priv) values ('192.168.1.111','backupUsr',PASSWORD('******'),'Y','Y','Y','Y');
- Serveur MAIL création du répertoire et du script
mkdir /srv/backups/mysql-web vi /usr/local/sysadmin/bin/backup-mysql-web.py
FICHIER:
#!/usr/bin/env python
#
#
# Author : Pior Bastida <pior.bastida@google.com>
#
import os
dbs = os.popen('/usr/bin/mysql -h www.example.com -u backupUsr --password=******* -E -e "show databases;"', 'r').readlines()
for db in dbs:
if db.startswith("Database: "):
dbname = db.split(':')[1].strip()
print "Dump " + dbname
os.system("/usr/bin/mysqldump --defaults-file=/etc/my.cnf -h www.example.com -u backupUsr --password=********** --opt " + dbname + " | gzip > /srv/backups/mysql-web/dump-" + dbname + ".sql.gz")
- Test du script
/usr/local/sysadmin/bin/backup-mysql-web.py
- Modification de la configuration de rsnapshot
- Lock le fichier de configuration & edition
co -l /etc/rsnapshot/web-srv.conf vi /etc/rsnapshot/web-srv.conf
Ajout de la ligne
cmd_preexec /usr/local/sysadmin/bin/backup-mysql-web.py
Mise en place de la tache periodique
crontab -e
AJOUT :
# BAKCUP SRV Web 15 02 * * * /usr/bin/rsnapshot -c /etc/rsnapshot/web-srv.conf daily 15 03 * * Sun /usr/bin/rsnapshot -c /etc/rsnapshot/web-srv.conf weekly 30 03 1 * * /usr/bin/rsnapshot -c /etc/rsnapshot/web-srv.conf monthly
Problème rencontré
Lors du test le système me demande un mot de passe, les des cas probable :
- Un erreur des permission du fichier authorized_keys
- Vous avez mis un mot de passe sur votre clef
- Vous avez bloqué l'acces ssh en root PermitRootLogin no , ceci est très bien mais backup ayant le UID 0 est considéré comme
root , vous devais définir PermitRootLogin without-password lisez le man pour plus d'info.
