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.


Référence