Installation et sécurisation d'une station Debian 3.0 stable15/05/2004
4. SECURISATION MODEREE
4.1. Notes sur le boot du système et sur le noyau
4.2. Sécurisation du système de fichiers
4.3. Sécurisation des comptes
4.4. Recherche et modifications de droits de fichiers
4.5. Les administrateurs n'ont pas besoin de passer root
4.6. Synchronisation horaire avec un serveur NTP
4.7. Génération automatiséd'un rapport système
4.8. Installation et premiers pas avec Modular-Syslog
4.9. Vérification des empreintes des packages à installer
4.10. Système de fichiers ext3 avec un noyau 2.4 : de ext2 à ext3
4.11. Backup du système sur une partition spécifique
4.12. Préparation d'une restauration du système en cas d'incident
4.1. Notes sur le boot du système et sur le noyau
NDR : Il est futile d'indiquer qu'un individu avec un accès physique au
serveur implique que le serveur est compromis.
Un seul noyau doit être chargeable lors de l'invite par défaut.
Tout passage de paramètre au noyau lors du boot doit être interdit.
Le chargement dynamique de modules devrait être interdit.
Dans le cas ou cela est impossible, appliquez un patch permettant de
bloquer le chargement des modules après le boot.
Il peut également être intéressant de modifier la séquence d'amorcage du BIOS
de facon à débuter par le chargement du MBR du disque dur.
4.2. Sécurisation du système de fichiers
NDR : Après ces modifications, n'oubliez pas que certaines partitions sont
montées en lecture seule. Vous pouvez remonter une partition en lecture/
écriture avec (par exemple) :
mount -o remount,rw /local
Editez le fichier /etc/fstab de facon à monter les partitions présentées en
1.5 selon le principe suivante :
/dev/sda1 / ext2 errors=remount-ro 0 1
/dev/sda2 none swap sw 0 0
proc /proc proc defaults 0 0
/dev/fd0 /floppy auto noauto,nosuid,nodev 0 0
/dev/cdrom /cdrom iso9660 ro,noauto,nosuid,nodev 0 0
/dev/sda3 /boot ext2 ro,noexec,nosuid,nodev 0 2
/dev/sda5 /root ext2 defaults 0 2
/dev/sda6 /var ext2 nodev 0 2
/dev/sda7 /var/log ext2 noexec,nosuid,nodev,sync 0 2
/dev/sda8 /tmp ext2 noexec,nosuid,nodev 0 2
/dev/sda9 /usr ext2 ro,nodev 0 2
/dev/sda10 /home ext2 nodev 0 2
/dev/sda11 /local ext2 ro,noexec,nosuid,nodev 0 2
Si vous avez procédé à la préparation d'une partition pour un serveur web :
/dev/sda11 /var/www ext2 rw,nosuid,nodev 0 2
/dev/sda12 /local ext2 ro,noexec,nosuid,nodev 0 2
Si vous avez procédé à la préparation d'une partition pour un serveur was :
/dev/sda11 /var/www ext2 rw,nosuid,nodev 0 2
/dev/sda12 /var/was ext2 rw,noexec,nosuid,nodev 0 2
/dev/sda13 /local ext2 ro,noexec,nosuid,nodev 0 2
Pour prendre en compte ces modifications, rebootez le système ou remontez les
partitions.
Man : fstab, mount.
4.3. Sécurisation des comptes
Durcissement de la politique de mots de passe :
Modifiez le fichier /etc/login.defs de la facon suivante :
LOG_OK_LOGINS yes
SULOG_FILE /var/log/sulog
ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin
UMASK 027
PASS_MAX_DAYS 30
DEFAULT_HOME no
MAN : login.defs
Suppression des utilisateurs et groupes inutiles :
unalias userdel
for i in `echo games sync sys irc` ; do (echo -n "Removing user $i : " && \
userdel $i 2> /dev/null && echo "done.") || echo "failed."; done
for i in `echo irc dialout fax voice audio dip video` ; do (echo -n \
"Removing group $i : " && groupdel $i 2> /dev/null && echo "done.") || \
echo "failed."; done
source ~/.bashrc
Désactivation des comptes inutiles :
for i in `echo lp list uucp news proxy postgres www-data nobody` ; do (echo\
-n "Falsing $i : " && chsh -s /bin/false $i && echo "done.") || echo\
"failed."; done
MAN : userdel, chsh, false
Réappropriation des fichiers non affectés (N'oubliez pas les permissions du
système de fichier /usr !) :
for i in `find / -nouser -o -nogroup` ; do echo "Giving $i to root" && \
chown root:root $i && chmod 600 $i; done
Déconnexion des comptes en inactivité :
Ajoutez/Modifiez les lignes suivantes dans le fichier /etc/profile :
export TMOUT=300
umask 027
Aggrégation des comptes dans des groupes :
Tous les comptes utilisateurs doivent faire partie de groupes appropriés.
Nous nous basons dans ce documents sur deux groupes existant, mais cette
déclinaison est arbitraire.
Le groupe adm est réservé aux administateurs (voir 4.5. Les administrateurs
n'ont pas besoin de passer root).
Le groupe users est réservé aux utilisateurs non administrateurs.
Modifiez /etc/adduser.conf pour faire figurer :
USERGROUPS=no
DIR_MODE=0700
Modification des squelettes de création de compte :
/etc/skel/.bash_profile :
umask 027
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
if [ -f ~/.alias ]; then
source ~/.alias
fi
/etc/skel/.alias :
alias ls='ls --color=auto'
alias md='mkdir'
alias rd='rmdir'
alias l='ls'
alias ll='l -l'
alias la='ll -a'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
Ajoutez les fichiers suivants :
/etc/skel/.bash_logout :
case "`tty`" in
/dev/tty[0-9]) clear
esac
/etc/skel/.inputrc :
set bell-style none
Donnez les droits :
chmod 640 /etc/skel/.bash_logout /etc/skel/.inputrc'
Mettez en place la méthode de suppression de comptes :
Modifiez /etc/deluser.conf pour faire figurer :
REMOVE_HOME = 1
BACKUP = 1
Créez le répertoire de backup des comptes supprimés :
mkdir /home/system/deleted_accounts
chown root:adm /home/system/deleted_accounts
chmod 1750 /home/system/deleted_accounts
Créez le fichier suivant :
mount -o remount,rw /usr
/usr/local/sbin/deluser.local :
#!/bin/sh
if [ -d /home/system/deleted_accounts ] && [ $1 ]
then
echo " deluser.local :"
echo " Moving $1.tar.bz2 to /home/system/deleted_accounts..."
if [ $PWD ] && [ $PWD != "/home/system/deleted_accounts" ] && \
[ -f $1.tar.bz2 ]
then
mv $1.tar.bz2 /home/system/deleted_accounts/$1.tar.bz2
fi
if [ -f /home/system/deleted_accounts/$1.tar.bz2 ]
then
echo " Giving admins permissions to /home/system/deleted_\
accounts/$1.tar.bz2"
chown root:adm /home/system/deleted_accounts/$1.tar.bz2
else
echo " Error : $1.tar.bz2 is no regular file !?!?!"
fi
else
echo "deluser.local error:"
if [ $1 ]
then
echo "No backup directory to store $1.tar.bz2."
else
echo "Error in arguments !?!?!"
fi
fi
Puis :
chmod 700 /usr/local/sbin/deluser.local
mount -o remount,ro /usr
4.4. Recherche et modifications de droits de fichiers
Recherche de tous les fichiers sgid et suid :
cd /root/tmp
find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -la {} \; 2> \
/dev/null > sguid_original_list.txt
Suppression du flag suid/sgid quand cela n'est pas indispensable :
mount -o remount,rw /usr/
for i in `echo /bin/ping /bin/mount /bin/umount /usr/bin/at /usr/bin/newgrp\
/usr/bin/chfn /usr/bin/chsh /usr/bin/gpg /usr/bin/lpq /usr/bin/lpr\
/usr/bin/lprm /usr/bin/mtr`; do echo "Removing sguid bit from $i." &&\
chmod -s $i ; done
mount -o remount,ro /usr/
Note : Attention à ces suppressions de privilèges si vos démons en ont besoin.
Restreignez l'usage de l'utilitaire cron en créant un fichier /etc/cron.allow:
touch /etc/cron.allow
chmod 640 /etc/cron.allow
=> Pour qu'un utilisateur soit autorisé à utiliser l'utilitaire cron et ses
dérives, vous devrez l'enregitrer dans ce fichier.
MAN : cron, crontab
4.5. Les administrateurs n'ont pas besoin de passer root
Installation de sudo :
mount -o remount,rw /usr/
dselect => Installez le package sudo
mount -o remount,ro /usr/
Ajoutez les utilisateurs ADMINISTRATEURS requis {UserName} dans le groupe adm:
usermod -g {UserName} -G adm,users {UserName}
Configuration de sudo :
Lancez visudo et éditez le fichier de facon à ajouter (raccourcis vi) :
# Cmnd alias specification
Cmnd_Alias REBOOT=/sbin/reboot
%adm ALL=NOPASSWD:REBOOT
MAN : usermod, sudoers visudo, sudo
4.6. Synchronisation horaire avec un serveur NTP
Installez les packages requis.
mount -o remount,rw /usr
dselect et installation des packages ntp, ntpdate, ntp-simple et ntp-doc :
* Ne pas specifier de serveur NTP
* Overwrite ntp.conf : Yes.
mount -o remount,ro /usr
Configurez le client ntp et le nouveau flux au niveau du firewall :
Ajoutez l'adresse IP de votre serveur NTP dans /etc/default/ntp-servers
Ajoutez l'adresse IP de votre serveur dans le fichier de configuration du
firewall.
/etc/init.d/init_ipchains.sh restart
Stoppez le démon NTP et exécutez la synchronisation
/etc/init.d/ntp stop
update-rc.d -f ntp remove
/etc/init.d/ntpdate start
Ajoutez un appel au client ntp toutes les 6 heures dans /etc/crontab :
# Met a jour la date et l'heure du système grâce au serveur NTP
0 */6 * * * root /etc/init.d/ntpdate start > /dev/null
MAN : ntpdate
4.7. Génération automatiséd'un rapport système
Le script présent en annexe 'ANNEXE 2 - Génération automatisée de rapport
système' peut être éxécute par la crontab à intervalles périodique. Il génère
un rapport système succinct qui peut être envoyé par mail aux administrateurs
ou stocké dans un répertoire.
NDR : Attention à respecter l'indentation !
NDR : Je vous conseille de vérifier le script de façon à ce qu'il n'exécute
que les commandes que vous désirez. Ainsi, le script récupère par
exemple les fichiers de logs présentés en '4.8. Installation et premiers
pas avec Modular-Syslog'.
Installation du script (nous utilisons le script présent en annexe qui envoie
le rapport par mail) :
mkdir /home/system/scripts/reports/
chmod 750 /home/system/scripts/reports/system_report.sh
Configuration de /etc/crontab pour lancer le script tous les jours à 09H00 AM:
# Genere le rapport system
0 9 * * * root /home/system/scripts/reports/system_report.sh
chmod 640 /etc/crontab
4.8. Installation et premiers pas avec Modular-Syslog
Modular-Syslog est disponible à : http://sourceforge.net/projects/msyslog/
Compilation :
cd /home/system/applis
/usr/bin/md5sum /home/system/download/msyslog-v1_08e-src_tar.gz
c3700571c675d8896c643c276f5e2dad /home/system/download/msyslog-v1_08e\
-src_tar.gz
tar zxvf /home/system/download/msyslog-v1_08e-src_tar.gz
find ./msyslog-v1.08e/ -type f \( -perm -004000 -o -perm -002000 \) -exec \
ls -la {} \;
chown -R root:root msyslog-v1.08e/
cd msyslog-v1.08e/
./configure
make
NDR : Vous pouvez très bien décider, si vous en comprennez l'intérèt de
modifier le chemin du fichier de configuration par défaut avant de
compiler le démon modular-syslog.
Installation :
mount -o remount,rw /usr/
make install
On sauvegarde l'ancien syslogd et son fichier de configuration :
cp /etc/syslog.conf /etc/syslog.conf.orig2
cp /sbin/syslogd /sbin/syslogd.orig
On remplace l'ancien syslogd par le notre :
mv /usr/local/sbin/syslogd /sbin/syslogd
chown root:root /sbin/syslogd && chmod 755 /sbin/syslogd
mount -o remount,ro /usr/
On modifie le script d'initialisation du démon /etc/init.d/sysklogd :
SYSLOGD="-i linux -i unix"
On stoppe le démon klogd dont nous nous passerons désormais :
/etc/init.d/klogd stop
On le supprime des runlevels correspondants :
update-rc.d -f klogd remove
On redémmare le nouveau démon syslogd :
/etc/init.d/sysklogd start
Correction du script syslogd-listfiles :
Ce script permet de lister les fichiers de logs pour permettre leur
rotation. Il se sert pour cela du fichier de configuration /etc/syslog.conf.
Or, ce fichier de configuration peut désormais contenir des lignes au format
modular-syslog, ce qui empêche une rotation correcte.
Le patch est disponible en 'ANNEXE 3 - syslogd-listfiles.msyslog.patch'
mount -o remount,rw /usr/
cp /usr/sbin/syslogd-listfiles /usr/sbin/syslogd-listfiles.orig
cd /usr/sbin
patch -l -p0 < /root/tmp/syslogd-listfiles.msyslog.patch
mount -o remount,ro /usr/
MAN : syslogd, syslog.conf, im_* , om_* , syslogd-listfiles
Premiers pas avec Modular-Syslog :
NDR : Si vous ajoutez des fichiers de log dans la configuration, prenez
garde à faire un touch du fichier destination dans le répertoire
concerné.
Nous ajoutons deux régles qui permettent de filtrer les messages envoyés par
le firewall ipchains à /etc/syslog.conf ainsi que deux régles permettant :
l'enregistrement des evenements liés aux demandes de connexion et les
évenèments libsafe.
#
# Filtres Modular-Syslog
#
# Filtres sur les evenements du firewall
kern.* %regex -m "Packet log.*LogDrop" %classic \
/var/log/fw_deny.log
kern.* %regex -m "Packet log.*LogAcc" %classic \
/var/log/fw_accept.log
# Filtres sur divers evenements sécurité
auth,authpriv.* %regex -m "(sshd.*password)|(PAM.*ssh)|(PAM.*su)\
|(PAM.*failure)" %classic /var/log/sécurité.log
auth,authpriv.* %regex -m "libsafe.so" %classic /var/log/sécurité.log
auth.* %regex -m "not receive identification" %classic\
/var/log/sécurité.log
kern.* %regex -m "Security" %classic /var/log/sécurité.log
kern.* %regex -m "device.*promiscuous" %classic\
/var/log/sécurité.log
Nous mettons en place les fichiers destination et redémarrons le serveur
syslog :
touch /var/log/{sécurité,fw_{deny,accept}}.log
chown root:adm /var/log/{sécurité,fw_{deny,accept}}.log
Et si votre umask n'est pas conforme à celui de cette doc :
chmod 640 /var/log/{sécurité,fw_{deny,accept}}.log
/etc/init.d/sysklogd restart
Prise en compte des nouveaux fichiers pour la rotation des logs :
Nous créons (s'il n'existe pas) un répertoire qui nous servira à stocker nos
scripts appellés par la crontab et dont l'objectif est d'assurer la
stabilité du système :
mkdir /home/system/scripts/crond
Nous éditons un fichier /home/system/scripts/crond/sysklogd (à l'image de
celui présent dans /etc/cron.daily) :
#! /bin/sh
test -x /usr/sbin/syslogd-listfiles || exit 0
test -x /sbin/syslogd || exit 0
test -d /usr/share/doc/sysklogd || exit 0
set -e
cd /var/log
for SECU in `syslogd-listfiles -a | grep -E "fw|secu"`
do
if [ -s $SECU ] ; then
savelog -g adm -m 640 -u root -c 7 $SECU > /dev/null
fi
done
/etc/init.d/sysklogd reload-or-restart
chmod 750 /home/system/scripts/crond/sysklogd
Nous éditons /etc/crontab pour ajouter ce script :
# Tourne les logs sécurité chaque jour
5 0 * * * root /home/system/scripts/crond/sysklogd
4.9. Vérification des empreintes des packages à installer
Consultez d'abord : 'I. INFORMATIONS SUR LA GESTION DE PACKAGES DEBIAN - Mise
à jour du système avec apt'
[ A compléter ]
mount -o remount,rw /usr
dselect => installation de 'debsums'
mount -o remount,ro /usr
mkdir /home/system/debsums
cd /home/system/debsums
Obtenez la liste des packages ne possédant pas de signature :
/usr/bin/debsums -l > nosig.txt
NDR : Si vous voulez vérifier les empreintes des fichiers d'un package :
debsums -s package_name.
MAN : debsums
4.10. Système de fichiers ext3 avec un noyau 2.4 : de ext2 à ext3
Pour modifier le système de fichier d'une partition de facon à passer de ext2
à ext3, sans perte de données et sans reboot (si votre noyau est déja compilé
avec ce support bien sur), vous pouvez suivre la procédure suivante.
Commencons par recompiler le noyau en ajoutant le support ext3 :
Ajoutez 'File systems -> Ext3 journalling file system support'.
Recompilez et installez le nouveau noyau.
Modifiez /etc/lilo.conf
Rebootez.
Après le reboot, n'oubliez pas de mettre à jour la configuration lilo et de
sauvegarder la configuration du noyau.
Prenons comme exemple la partition /backup du type (précisé dans /etc/fstab)
suivant :
/dev/hda13 /backup ext2 ro,noexec,nosuid,nodev,sync 0 2
La procédure à suivre est la suivante :
umount /dev/hda13
tune2fs -j /dev/hda13
Editez /etc/fstab pour remplacer l'ancienne ligne /dev/hda13 par :
/dev/hda13 /backup auto ro,noexec,nosuid,nodev,sync 0 2
mount /dev/hda13
4.11. Backup du système sur une partition spécifique
Nous présentons ici un moyen de sauvegarde des données système sur une
partition réservée à cet usage.
Le backup du systéme est réalisé par un script 'fait maison' permettant une
sauvegarde complète ou incrémentale des fichiers/répertoires à sauvegarder et
autorisant le backup chiffre (avec openssl) des répertoires/fichiers
parametrés.
Ne sont pas presentes ici :
La restauration du système à partir des données sauvegardées. Reférez vous
à la partie '4.12. Préparation d'une restauration du système en cas
d'incident'.
L'accès à cette partition depuis un serveur distant pour un stockage de
backup spécialisé. Vous pouvez vous reférer à 'VII. INSTALLATION D'UN
SERVEUR SAMBA POUR UNE GESTION DE BACKUP' pour un accès Netbios via Samba.
Vous devez avoir une partition /dev/sda13 dans /etc/fstab du type :
/dev/sda13 /backup ext2 ro,noexec,nosuid,nodev,sync 0 2
mkdir /home/system/scripts/backup
Et installez le script /home/system/scripts/backup/system_backup.sh présente
en 'ANNEXE 8 - Script de backup'.
chmod 750 /home/system/scripts/backup/system_backup.sh
Editez le script pour configurer les fichiers ou répertoires que vous désirez
sauvegarder en modifiant la variable 'BACKUP_FROM' :
Créez un fichier '/home/system/scripts/backup/include_but_ciphered' qui
contiendra les fichiers ou répertoires que vous voulez ajouter dans l'archive
chiffrée. Ce fichier doit exister mais peut être vide si vous ne voulez pas
utiliser cette fonctionnalité :
NDR :
Le backup chiffre est toujours en mode 'full'.
Le script de backup effectuant un 'cd /', configurez ce fichier en
supprimant le premier '/' devant le chemin vers votre fichier/répertoire.
J'ai personnellement renseigné ce fichier de la manière suivante :
/home/system/scripts/backup/include_but_ciphered :
etc/gshadow
etc/gshadow-
etc/passwd
etc/passwd-
etc/samba/smbpasswd
etc/shadow
etc/shadow-
var/backups
NDR : Est il trivial d'indiquer que :
vous devriez noter le mot de passe de chiffrement que vous utilisez dans
le script ?
le script ne doit être accessible que par root ?
Créez un fichier '/home/system/scripts/backup/exclude' qui contiendra les
fichiers ou répertoires que vous ne désirez pas sauvegarder par rapport aux
arborescences que vous aurez définies dans la variable 'BACKUP_FROM'.
NDR :
Ce fichier doit exister mais peut être vide si vous ne désirez rien
exclure.
Le script de backup effectuant un 'cd /', configurez ce fichier en
supprimant le premier '/' devant le chemin vers votre fichier/répertoire.
J'ai personnellement renseigné ce fichier de la manière suivante :
usr/src
var/lock
var/run
var/tmp
Créez un fichier '/home/system/scripts/backup/cpioed' qui contiendra les
répertoires dont vous souhaitez conserver les localisations et permissions
grâce à une archive cpio.
Ce fichier doit exister mais peut être vide si vous ne désirez rien
exclure.
Le script de backup effectuant un 'cd /', configurez ce fichier en
supprimant le premier '/' devant le chemin vers votre fichier/répertoire.
SEULS LES REPERTOIRES INDIQUES SONT SAUVEGARDES !
J'ai personnellement renseigné ce fichier de la manière suivante (je ne tiens
pas à sauvegarder /usr/src) :
backup
cdrom
floppy
initrd
local
lost+found
mnt
opt
proc
tmp
var/lock
var/run
var/tmp
Lancez le script pour le premier backup :
/home/system/scripts/backup/system_backup.sh
Backup: Full backup
Backup: Remounting rw /backup
Backup: Backuping /backup/full_060503-144947/bin_060503-144947.tar.gz
Backup: Hash : c8f1b2863146f03ef686fa04d1fd0da5\
/backup/full_060503-144947/bin_060503-144947.tar.gz
Backup: Backuping /backup/full_060503-144947/boot_060503-144948.tar.gz
Backup: Hash : 4bfd31759e05e14ed65b63dee26feb8d\
/backup/full_060503-144947/boot_060503-144948.tar.gz
Backup: Backuping /backup/full_060503-144947/dev_060503-144950.tar.gz
Backup: Hash : e5fd2dd7df68aba2f176faed07f44cd5\
/backup/full_060503-144947/dev_060503-144950.tar.gz
Backup: Backuping /backup/full_060503-144947/etc_060503-144951.tar.gz
Backup: Hash : 348d9dd3f309c23703a3c24c83dda609\
/backup/full_060503-144947/etc_060503-144951.tar.gz
Backup: Backuping /backup/full_060503-144947/home_060503-144952.tar.gz
Backup: Hash : 5495f04c230f7feaecb893f879297753\
/backup/full_060503-144947/home_060503-144952.tar.gz
Backup: Backuping /backup/full_060503-144947/lib_060503-144954.tar.gz
Backup: Hash : dce418f7fd12bd9621f5429141eaddbb\
/backup/full_060503-144947/lib_060503-144954.tar.gz
Backup: Backuping /backup/full_060503-144947/root_060503-144957.tar.gz
Backup: Hash : 012a1be6fb9686c6ca49c3edd8a94c38\
/backup/full_060503-144947/root_060503-144957.tar.gz
Backup: Backuping /backup/full_060503-144947/sbin_060503-144958.tar.gz
Backup: Hash : 0bf5b00b86826e195a9de88ef8d68a9f\
/backup/full_060503-144947/sbin_060503-144958.tar.gz
Backup: Backuping /backup/full_060503-144947/usr_060503-144959.tar.gz
Backup: Hash : f3ec8f659a17daa0cb318d0f687d632c\
/backup/full_060503-144947/usr_060503-144959.tar.gz
Backup: Backuping /backup/full_060503-144947/var_060503-145357.tar.gz
Backup: Hash : e200713da542da4c1bb0e8910b6aa76f\
/backup/full_060503-144947/var_060503-145357.tar.gz
Backup: Backuping excluded files into a cpio archive
Backup: Hash : a323d013c942bf30a6e0c76f5ae2ed2b\
/backup/full_060503-144947/excluded.cpio
Backup: Backuping /home/system/scripts/backup/include_but_ciphered\
files
Backup: Ciphering /backup/full_060503-144947/\
ciphered_060503-145357.tar.gz
Backup: Removing /backup/full_060503-144947/\
ciphered_060503-145357.tar.gz
Backup: Hash : 228dc72dd72ab99b2e58e3d083e72e5f\
/backup/full_060503-144947/\
ciphered_060503-145357.tar.gz.des3
Backup: Syncing disks
Backup: Remounting ro /backup
ll -R /backup/
/backup/:
total 28
drwxr-x--- 2 root root 4096 May 6 14:54 full_060503-144947
-rw-r----- 1 root root 94 May 6 14:49 full_060503-144947.log
-rw-r----- 1 root root 1023 May 6 14:54 full_060503-144947.md5
/backup/full_060503-144947:
total 335096
-rw-r----- 1 root root 1016158 May 6 14:49 bin_060503-144947.tar.gz
-rw-r----- 1 root root 4390293 May 6 14:49 boot_060503-144948.tar.gz
-rw-r----- 1 root root 592280 May 6 14:54 ciphered_060503-145357\
.tar.gz.des3
-rw-r----- 1 root root 57067 May 6 14:49 dev_060503-144950.tar.gz
-rw-r----- 1 root root 478588 May 6 14:49 etc_060503-144951.tar.gz
-rw-r----- 1 root root 65024 May 6 14:54 excluded.cpio
-rw-r----- 1 root root 1152206 May 6 14:49 home_060503-144952.tar.gz
-rw-r----- 1 root root 2298150 May 6 14:49 lib_060503-144954.tar.gz
-rw-r----- 1 root root 418679 May 6 14:49 root_060503-144957.tar.gz
-rw-r----- 1 root root 1203847 May 6 14:49 sbin_060503-144958.tar.gz
-rw-r----- 1 root root 285132220 May 6 14:53 usr_060503-144959.tar.gz
-rw-r----- 1 root root 45928823 May 6 14:54 var_060503-145357.tar.gz
du -ch /backup/
328M /backup/full_060503-144947
328M /backup
328M total
Vous avez désormais dans /backup :
Une sauvegarde 'full' des fichiers ou répertoires que vous avez spécifiés.
Un fichier de log contenant les erreurs rencontrées - vide si aucune
erreur.
Un fichier d'empreinte md5 des archives créées pour chaque
fichier/répertoire specifié.
Dans /home/system/scripts/backup/.last_done (ou dans le fichier que vous avez
vous meme specifie), vous avez la date de ce dernier backup.
Note : Les 328M de sauvegarde full réalisée précédemment l'ont été en environ
~5 minutes sur un PIII 700 avec 160Mo de RAM.
Vous pouvez désormais réaliser un backup incrémental des données sauvegardées
précédemment.
En appelant à nouveau le script :
Backup: Incremental backup beginning : Tue May 6 14:49:47 CEST 2003
Backup: Remounting rw /backup
Backup: Backuping /backup/incr_060503-152213/bin_060503-152213.tar.gz\
(incremental)
Backup: Hash : 081a6113dd90eb892d01548cd7179b62\
/backup/incr_060503-152213/bin_060503-152213.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
boot_060503-152213.tar.gz (incremental)
Backup: Hash : ae60b98501c0978f362e2f7826b671a5\
/backup/incr_060503-152213/boot_060503-152213.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
dev_060503-152213.tar.gz (incremental)
Backup: Hash : 3dcc660a2a296b8356ffa29d4c52d8d1\
/backup/incr_060503-152213/dev_060503-152213.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
etc_060503-152214.tar.gz (incremental)
Backup: Hash : b9649a2474ec6f8858841fa4eb3f1e5b\
/backup/incr_060503-152213/etc_060503-152214.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
home_060503-152214.tar.gz (incremental)
Backup: Hash : b91a69fceb9d176050d69fd300850d26\
/backup/incr_060503-152213/home_060503-152214.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
lib_060503-152214.tar.gz (incremental)
Backup: Hash : 718f76f85543429bbd32df86ce23e5b7\
/backup/incr_060503-152213/lib_060503-152214.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
root_060503-152214.tar.gz (incremental)
Backup: Hash : d357d47b59e75595087ab7d8cba58fdb\
/backup/incr_060503-152213/root_060503-152214.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
sbin_060503-152214.tar.gz (incremental)
Backup: Hash : 1688044981053d9e8e0d333509c54149\
/backup/incr_060503-152213/sbin_060503-152214.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
usr_060503-152214.tar.gz (incremental)
Backup: Hash : 2f95fb3bb6b8d9a0ab247bde96611baf\
/backup/incr_060503-152213/usr_060503-152214.tar.gz
Backup: Backuping /backup/incr_060503-152213/\
var_060503-152223.tar.gz (incremental)
Backup: Hash : 668d117769137b003cf427394d65b1a3\
/backup/incr_060503-152213/var_060503-152223.tar.gz
Backup: Backuping /home/system/scripts/backup/\
include_but_ciphered files
Backup: Ciphering /backup/incr_060503-152213/\
ciphered_060503-152223.tar.gz
Backup: Removing /backup/incr_060503-152213/\
ciphered_060503-152223.tar.gz
Backup: Hash : 9d11b72e4bfa25cbf81b4295717133cf /backup/\
incr_060503-152213/ciphered_060503-152223.tar.gz.des3
Backup: Syncing disks
Backup: Remounting ro /backup
ll -R /backup/
/backup/:
total 36
drwxr-x--- 2 root root 4096 May 6 15:22 incr_060503-152213
-rw-r----- 1 root root 0 May 6 15:22 incr_060503-152213.log
-rw-r----- 1 root root 949 May 6 15:22 incr_060503-152213.md5
/backup/incr_060503-152213:
total 656
-rw-r----- 1 root root 166 May 6 15:22 bin_060503-152213.tar.gz
-rw-r----- 1 root root 196 May 6 15:22 boot_060503-152213.tar.gz
-rw-r----- 1 root root 592280 May 6 15:22 \
ciphered_060503-152223.tar.gz.des3
-rw-r----- 1 root root 352 May 6 15:22 dev_060503-152213.tar.gz
-rw-r----- 1 root root 2179 May 6 15:22 etc_060503-152214.tar.gz
-rw-r----- 1 root root 1344 May 6 15:22 home_060503-152214.tar.gz
-rw-r----- 1 root root 543 May 6 15:22 lib_060503-152214.tar.gz
-rw-r----- 1 root root 275 May 6 15:22 root_060503-152214.tar.gz
-rw-r----- 1 root root 167 May 6 15:22 sbin_060503-152214.tar.gz
-rw-r----- 1 root root 29773 May 6 15:22 usr_060503-152214.tar.gz
-rw-r----- 1 root root 7973 May 6 15:22 var_060503-152223.tar.gz
Un simple 'tar ztvf {archive}.tar.gz | grep -v " 0 "' vous donnera la liste
des fichiers qui ont été modifiés et pris en compte lors de cette sauvegarde
incrémentale.
Vous pouvez appeler le script avec l'option '-f' : cela le forcera à suivre la
procédure de sauvegarde 'full' en ne tenant pas compte du contenu du fichier
'.last_done'.
Nous pouvons maintenant éditer notre fichier /etc/crontab pour appeler notre
script de backup :
# Backup Full du système toutes les semaines à 00H30
30 0 * * 7 root /home/system/scripts/backup/system_backup.sh -f
# Backup incrémental du système toutes les 6 heures a xx:15
15 */6 * * * root /home/system/scripts/backup/system_backup.sh
Nous modifions également /etc/syslog.conf pour que les messages de backup
soient consignés dans notre fichier de log sécurité :
syslog.notice %regex -m "Backup" %classic /var/log/sécurité.log
Puis :
/etc/init.d/sysklogd restart
MAN : tar, gzip
4.12. Préparation d'une restauration du système en cas d'incident
Notre objectif est de préparer un moyen de restauration du système simple à
mettre en place et rapide à mettre en oeuvre en cas d'incident.
Nous allons pour ce faire créer une 'image' de notre système que nous
graverons sur un CD. Dans le cas d'un crash, il sera possible de booter sur le
CD et de restaurer le système.
NDR :
La création de cette image nécessite l'installation du package mkisofs
(n'installez pas le package cdrecord sauf si vous disposez d'un graveur sur
la station) et l'ajout du support 'Block devices -> Loopback device support'
au noyau.
Vous devriez dédier une station à cet usage et non installer ces
fonctionnalités sur votre serveur de production.
L'espace disque requis est d'environ 1Go (~650Mo environ, mais il vaut
mieux voir large :>).
Nous allons tout d'abord créer un système de fichier root contenant les
binaires nécessaires à l'exécution du CD puis ajouter nos archives dans un
répertoire et pour finir utiliser un script qui exécutera la restauration du
système.
Pour ce faire, nous allons nous baser sur les fichiers fournis dans le jeu de
CD Debian.
Récupération des fichiers nécessaires au boot et d'un système de fichier root
minimal :
NDR : Je vais par la suite utiliser la partition /local comme partition de
travail. Cette partition est, si vous avez suivi cette documentation,
une partition Ext2 inutilisée et occupant l'espace disque restant
après installation du système.
Insérez le CD numero 1 de votre jeu Debian et montez le cdrom (/cdrom dans
notre exemple).
mount -o remount,rw /local
mkdir /local/Debian
cp /cdrom/isolinux/isolinux* /local/Debian
cp /cdrom/isolinux/idepci.bin /local/Debian
mkdir /local/Debian/kernel
cp /cdrom/install/linpci /local/Debian/kernel/
Editez le fichier isolinux.cfg :
TIMEOUT 0
PROMPT 1
DEFAULT /kernel/linpci
APPEND root=/dev/ram ro initrd=idepci.bin ramdisk_size=16384\
disksize=1.44 flavor=idepci
LABEL linux
kernel /kernel/linpci
DISPLAY isolinux.txt
Editez le fichier isolinux.txt :
Debian-Secinst v0.1.5 Boot CD
Modification du système de fichier root original :
Nous montons maintenant le système de fichier root original :
cd /local
cp Debian/idepci.bin .
gunzip -S ".bin" idepci.bin
mount -t ext2 idepci /mnt/ -o loop
Modification de l'initialisation du CD pour executer notre script de
restauration :
cd /mnt/
Editez le fichier etc/inittab :
# main setup program
<::respawn:/sbin/udbootstrap
>::respawn:-/restore.sh
Clavier Français et alias :
cd /mnt/etc/
tar zxvf keymaps.tgz i386/azerty/fr-latin1.bmap
echo "/sbin/loadkmap < /etc/i386/azerty/fr-latin1.bmap" > profile
echo "alias l='ls'" >> profile
echo "alias ll='l -l'" >> profile
echo "alias la='ll -a'" >> profile
echo "alias cp='cp -i'" >> profile
echo "alias rm='rm -i'" >> profile
echo "alias mv='mv -i'" >> profile
Ajout du binaire cpio :
cd /mnt
cp /lib/libnsl.so.1 ./lib/
cp /bin/cpio ./bin/
Ajout d'un binaire tar compilé en statique :
Récupérez la version 1.13.25 sur l'un des miroirs de www.gnu.org.
Compilez la en statique (avec le support uclibc par exemple) ou tout
simplement avec :
env LDFLAGS=-static ./configure
make LDFLAGS=-static
cd /mnt
mv ./bin/tar ./bin/oldtar
Copiez votre nouveau binaire dans /mnt/bin/tar
chmod 755 /mnt/bin/tar
Ajoutez le script de restauration présent en 'ANNEXE 9 - Script de
restauration' à la racine (/mnt/restore.sh) et donnez lui les droits
chmod 755 /mnt/restore.sh'.
Ajout des informations de backup :
NDR : Ces informations sont évidemment celles du système à restaurer et non
celles du système sur lequel vous créez ce CD !
mkdir /mnt/backup && chmod 755 /mnt/backup
Editez le fichier '/mnt/backup/server_infos' (ou le fichier que vous avez
configuré dans le script de restauration) pour ajouter les informations que
vous jugerez utile. Par exemple (/mnt/backup/server_infos) :
This backup was created for {HOSTNAME} the 5 of May at 12:03.
The server backuped is a Apache/Websphere server.
Ajoutez les fichiers suivants dans '/mnt/backup' :
un fichier 'disk_name' contenant le nom de votre périphérique (ex :
/dev/sda).
un fichier 'fdisk_script' contenant les instructions à suivre pour créer
les partitions sur le disque (voir 'ANNEXE 10 - Exemple de script
Fdisk')
un fichier 'fstab_file' du type de celui obtenu par la commande :
grep -E "ext|swap" /etc/fstab | awk '{ print $1" "$2" "$3 }'
=> Les points de montage logique (fd0, cdrom et proc) ne sont pas
obligatoires.
=> Seuls les supports ext2 et swap sont geres pour l'instant.
un fichier 'lilo_file' : copie de votre /etc/lilo.conf a restaurer =>
Attention au mot de passe en clair !!!
un fichier 'partitions_table' : résultat de la commande '/sbin/fdisk -l'
démontez le système de fichier et sauvegardez le :
cd /local
umount -d /mnt
gzip -S ".bin" idepci
mv idepci.bin Debian/
On ajoute maintenant le backup de notre système :
Connectez vous au système à sauvegarder et lancez un backup full via le
script de backup fourni en 'ANNEXE 8 - Script de backup' ou récuperez les
archives de votre dernier backup full.
Sur la station que vous utilisez pour créer le cdrom de backup, créez le
répertoire '/local/Debian/archives' et copiez vos archives à sauvegarder à
l'intérieur (en respectant le nommage des archives en .tar.gz ou .cpio !).
Une fois cette copie éffectuée, créez un fichier
/local/Debian/archives/infos.txt contenant les chemins vers les fichiers qui
seront présents dans /mnt/archives/ (une fois le système de fichier monté
par le script de restauration).
Je vous reccomande de créer ce fichier à la main plutôt que d'utiliser un
find. J'ai personnellement renseigné ce fichier de la manière suivante
(Notez la présence de var_xxx avant usr_xxx) :
/mnt/archives/infos.txt :
/mnt/archives/bin_070503-153510.tar.gz
/mnt/archives/boot_070503-153511.tar.gz
/mnt/archives/dev_070503-153513.tar.gz
/mnt/archives/etc_070503-153514.tar.gz
/mnt/archives/home_070503-153515.tar.gz
/mnt/archives/lib_070503-153517.tar.gz
/mnt/archives/root_070503-153520.tar.gz
/mnt/archives/sbin_070503-153520.tar.gz
/mnt/archives/var_070503-153925.tar.gz
/mnt/archives/usr_070503-153522.tar.gz
/mnt/archives/deciphered_070503-153925.tar.gz
/mnt/archives/excluded.cpio
NDR : Je vous reccomande bien entendu de comparer le md5sum des fichiers
générés par votre script de backup avec le md5sum des fichiers copiés
sur la station utilisée pour créer l'ISO et de renouveller cette
opération pour les fichiers qui seront présents sur le CD gravé.
Dans /local/Debian/archives, vous devez avoir un fichier protégé par le
mot de passe présent dans votre script de backup. Déprotegez ce fichier avant
de procéder à la création de l'ISO
NDR : J'insiste sur le fait que ce CD de restauration contient une sauvegarde
de fichiers critiques et doit être protégé physiquement !!!
Préparation de l'ISO :
Préparation de l'image iso à graver :
cd /local
mkisofs -o debian.iso -b isolinux.bin -c boot.cat -no-emul-boot\
-boot-load-size 4 -boot-info-table -l -r Debian/
Vous avez désormais une image 'debian.iso' que vous pouvez graver sur un CD.
Ce CD sera bootable et vous donnera accès au menu suivant :
Debian-Secinst v0.1.5 Restore script
Enter alt-[F1-F4] to : have this menu, have a shell, look at the logs.
To reboot : ctrl-alt-del
-------
This backup was created for {HOSTNAME} the 25 of April at 16:52.
The server backuped is a Apache/Websphere server.
-------
Menu
(1) : Show actual partition table.
(2) : Show backuped partition table.
(3) : Show backuped fstab file.
*****
(4) : Write the backuped partition table to disk.
(5) : Format disk using backuped fstab file.
(6) : Mount disk partitions using backuped fstab file.
(7) : Restore the system.
(8) : Lilo the system using backuped lilo file.
(9) : Syncing and unmounting restored system.
*****
(A) : Automated script (4-5-6-7-8-9).
What do you want ?
NDR : La restauration du système pris comme en exemple en '4.11. Backup du
système sur une partition spécifique' m'a pris 15 minutes sur un PIII
500 avec 128 Mo de RAM.
Copyright (c) 2003 Simon Castro, scastro [ at ] entreelibre.com.
Permission is granted to copy, distribute and/or modify this document under the
terms of the GNU Free Documentation License, Version 1.2 or any later version
published by the Free Software Foundation; with the Invariant Sections being
LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the
Back-Cover Texts being LIST.
You must have received a copy of the license with this document and it should
be présent in the fdl.txt file.
If you did not receive this file or if you don't think this fdl.txt license is
correct, have a look on the official http://www.fsf.org/licenses/fdl.txt
licence file.
|