Le présent paragraphe regroupe les quelques astuces et notions importantes à connaître lors de l’utilisation d’un serveur Debian. Il permet la mise en place de quelques mécanismes permettant de gagner du temps lors de l’exploitation et de l’utilisation ultérieure des serveurs.
è Phase d’installation :
- la seule difficulté lors de l’installation d’un serveur Debian consiste a bien créer une partition différente pour les points de montage suivants :
- « / » (au minimum 500Mo)
- « /usr » (au minimum 1Go)
- « /var » (au minimum 500Mo)
- « /var/log » (au minimum 100Mo)
- « /tmp » (si possible)
- « /home » (dans le cas d’un serveur de fichiers)
- il est interessant d’installer au minimum les packages suivants :
- « vim » (vi évolué)
- « less » (plus évolué que more)
- « manpages-fr » (les pages du manuel en français)
- « ssh » (pour une administration sécurisée du serveur)
- « findutils » (pour pouvoir beneficier des commandes locate et updatedb)
- « apt-file » (pour pouvoir beneficier des commandes apt-cache search/show)
- « dlocate » (pour pouvoir beneficier de la commande dlocate permettant de retrouver le nom du package contenant un fichier donné ou encore d’obtenir le status des différents packages)
è Mise en place de l’environnement français :
- à l’issue de l’installation il suffit d’effectuer les opérations suivantes :
- dpkg-reconfigure locales
- export LANG= « fr_FR »
- locale
è Suppression de l’affichage de la commande « dselect » au démarrage :
- création d’un alias dselect= « dselect –expert »
è Installation/MAJ des packages en mode ligne de commande :
- utilisation de la commande apt-get install nom_package
- utilisation de la commande apt-get update
è Definition des sources de mise à jour Debian :
- modification du fichier /etc/apt/sources.list. Le fichier du serveur Hercule est donné ci dessous :
deb http://ftp.fr.debian.org/debian stable main contrib non-free
deb http://ftp.fr.debian.org/debian testing main contrib non-free
deb http://ftp.fr.debian.org/debian-non-US/ stable/non-US main contrib non-free
# La ligne deb-src permet d’indiquer ou récupérer les sources ayant
# permises la création d’un package donné à l’aide de la commande
# apt-get source nom_package
deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
è Pour rechercher un libelle dans la liste des packages Debian :
- apt-cache search libelle1 [libelle2 … libellen]
è Pour afficher la description d’un package Debian :
- apt-cache show nom_package
è Pour afficher la liste des packages Debian installés sur le système :
- dpkg -l
è Pour empêcher la mise à jour de packages (opération indispensable des que l’on recompile un package existaant sans changer son numéro de version) :
- lancer dselect ;
- se placer sur le package considéré et appuyer sur la touche « H » comme « Hold ».
Dans le cas ou il est souhaité pouvoir administrer les différents serveurs Unix depuis une station Windows, il est utile d’installer les deux logiciels suivants :
- Putty : client SSH
- WinSCP : client SCP (copie de fichiers sécurisée via SSH)
Linux comme tout UNIX permet « d’encager » les démons. La notion de cage consiste a changer la racine « / » pour un répertoire donné lors du lancement d’un démon. Cette nouvelle racine doit contenir toutes les ressources dont le démon a besoin pour fonctionner correctement mais uniquement celles-ci. De cette manière un pirate reussissant à exploiter une faille d’un démon donné ne peut avoir accès qu’aux données utilisées par le démon en question et jamais à l’ensemble du système.
Le mécanisme de mise en cage peut être inclus dans le fonctionnement même du démon (ex : Postfix) ou forcé au démarrage à l’aide de la commande suivante :
è Chroot nouvelle_racine commande_a_executer_depuis_la_nouvelle_racine
Dans le cadre de la maquette les démons sont systématiquement encagés. Le script de création des cages est donné ci-dessous :
#!/bin/bash
#
# Emplacement : Maquette de test SGA
# Description : Script permettant la création de cages chroot
# Serveur : Tous
# Copyright : marc.boget@gendarmerie.org
echo "------------------------------------"
echo " Création de cages"
echo " sur noyau Debian 2.4.18
echo " Marc BOGET - Mastere SIO - "
echo " marc.boget@gendarmerie.org
echo "------------------------------------"
echo ""
# Fonction copiant les fichiers "de base"
function recopie_lien
{
# Mise a zero des variables
REP=""
REP1=""
LIEN=""
FICLIE=""
# Test pour savoir si c'est un lien symbolique
LIEN=$(ls -al $FICHIER_TRAITE|cut -d'>' -f2|cut -d' ' -f2)
if [ "$LIEN" != "" ]; then
REP=$(dirname $LIEN)
FICLIE=$(basename $LIEN)
# Test pour savoir si c'est dans le meme repertoire ou pas
# Si le dirname ne peut etre trouvé, dirname renvoie '.' !!!
if [ "$REP" == "." ]; then REP=$(dirname $FICHIER_TRAITE); fi
# Traitement des liens relatifs
REP1=""
if [ "$(echo $REP|cut -c 1-2)" == ".." ]
then
REP1=$(dirname $FICHIER_TRAITE)
REP=${REP1}/${REP}
fi
# Ne recopie le fichier pointé par le lien que s'il n'existe deja pas
if ! test -f ${REP}/${FICLIE}
then
mkdir -p ${HOME_CAGE}${REP}
rsync -a "${REP}/${FICLIE}" "${HOME_CAGE}${REP}/${FICLIE}" >/dev/null 2>&1
fi
if [ "$REP1" != "" ]
then
REP=$REP1
else
REP=$(dirname $FICHIER_TRAITE)
fi
else
REP=$(dirname $FICHIER_TRAITE)
fi
}
function recopie_fichier
{
if test $FICHIER_COPIE
then
echo "Traitement de $FICHIER_COPIE"
REPFIC=$(dirname $FICHIER_COPIE)
NOMFIC=$(basename $FICHIER_COPIE)
mkdir -p "${HOME_CAGE}/${REPFIC}" >/dev/null 2>&1
FICHIER_TRAITE=$FICHIER_COPIE
recopie_lien
if ! test -f ${HOME_CAGE}${REP}/${NOMFIC}
then
rsync -a "${FICHIER_COPIE}" "${HOME_CAGE}${REP}/${NOMFIC}" >/dev/null 2>&1
fi
fi
}
function creation_base
{
umask 022
echo "- Creation des repertoires"
mkdir $HOME_CAGE > /dev/null 2>&1
mkdir ${HOME_CAGE}/var > /dev/null 2>&1
mkdir "${HOME_CAGE}/var/log" > /dev/null 2>&1
mkdir "${HOME_CAGE}/var/run" > /dev/null 2>&1
mkdir "${HOME_CAGE}/dev" > /dev/null 2>&1
mkdir "${HOME_CAGE}/lib" > /dev/null 2>&1
mkdir "${HOME_CAGE}/root" > /dev/null 2>&1
mkdir "${HOME_CAGE}/tmp" > /dev/null 2>&1
chmod 1777 "${HOME_CAGE}/tmp"
echo "- Création des périphériques"
cd "${HOME_CAGE}/dev"
mknod null c 1 3
mknod random c 1 8
mknod urandom c 1 9
chown root:root null
chmod 0666 null
echo "- Copie des fichiers de base necessaires"
for FICHIER_COPIE in /etc/shadow /etc/group /etc/passwd /etc/hosts /etc/protocols /etc/resolv.conf /etc/services
do
recopie_fichier
done
echo "- Copie des bibliotheques utilisées"
for FICHIER_COPIE in $(ldd $DAEMON|cut -d'>' -f2|cut -d' ' -f2)
do
recopie_fichier
done
# Recuperation des fichiers ouverts au lancement du demon
echo "- Arret du démon s'il tourne..."
$COMMANDE_DAEMON stop >/dev/null 2>&1
echo "- Lancement du demon pour recuperation des fichiers ouverts ..."
strace $DAEMON start 2>/tmp/cage.temp
sleep 2
echo "- Arret du démon ..."
killall $DAEMON >/dev/null 2>&1
for FICHIER_COPIE in $(grep open /tmp/cage.temp|cut -d'"' -f2|grep -v "/dev/null" |grep -v "\/\.")
do
recopie_fichier
done
# Gestion du fichier /etc/localtime
echo "- Gestion du fichier /etc/localtime"
cd ${HOME_CAGE}
FICHIER_COPIE="/usr/share/zoneinfo/Europe/Paris"
recopie_fichier
rm -f ${HOME_CAGE}/etc/localtime
ln -s ../usr/share/zoneinfo/Europe/Paris etc/localtime
# Copie du demon lui meme
REP=$(dirname $DAEMON)
mkdir -p ${HOME_CAGE}${REP}
cp $DAEMON ${HOME_CAGE}$DAEMON
return 0;
}
# Fonction creant la cage pour postfix
function creation_cage_postfix
{
# La mise en cage de postfix est automatique : cf directive queue_directory
# dans le fichier /etc/postfix/main.cf por trouver la definition de la cage. Le
# fichier /etc/postfix/master.cf permet de definir quels sont les services qui
# doivent etre chrootés (signe '-' dans la colonne chroot) ou pas (signe 'n'
# dans la colonne chroot)
# Le seul repertoire a creer est le repertoire ci dessous pour que le script
# de postfix puisse arriver a créer un lien : petit bug !!!
mkdir -p ${HOME_CAGE}/usr/lib/zoneinfo
}
# Fonction creant la cage pour syslog
function creation_cage_syslog
{
creation_base
}
# Fonction creant la cage pour apache
function creation_cage_apache
{
creation_base
# Copie des fichiers specifiques
echo "- Copie des fichiers specifiques ..."
for FICHIER_COPIE in $(find /usr/lib/libdb* /usr/lib/perl5* /var/www /usr/lib/cgi* /usr/lib/libsasl* /usr/lib/libgdbm* /usr/kerberos /usr/bin/perl* /usr/lib/apache-ssl /usr/share/ldapexplorer /etc/ldapexplorer 2>/dev/null)
do
recopie_fichier
done
}
function creation_cage_ssh
{
creation_base
# Creation des terminaux
rsync -a /dev/pty* ${HOME_CAGE}/dev >/dev/null 2>&1
rsync -a /dev/tty* ${HOME_CAGE}/dev >/dev/null 2>&1
echo "- Copie des fichiers specifiques"
# Creation des repertoires specifiques
mkdir -p ${HOME_CAGE}/var/run/sshd
chmod 755 ${HOME_CAGE}/var/run/sshd
# Serveur et client SSH
for FICHIER_COPIE in $(find /etc/ssh* /lib/libncurses.so.5* /usr/bin/ssh /bin/ls /lib/librt.so.1 /lib/libpthread.so.* /usr/bin/ssh 2>/dev/null)
do
recopie_fichier
done
# Pour permettre le bash
for FICHIER_COPIE in $(find /bin/bash /lib/libncurses.so.5* 2>/dev/null)
do
recopie_fichier
done
# Pour permettre la commande ls
for FICHIER_COPIE in $(find /bin/ls /lib/librt.so.1 /lib/libpthread.so.* 2>/dev/null)
do
recopie_fichier
done
# Pour permettre l'authentification PAM LDAP
for FICHIER_COPIE in $(find /etc/ldap* /lib/libnss* /lib/libpam* /etc/pam* /etc/libnss* /lib/security/* /usr/lib/libldap* /usr/lib/liblber* /lib/libresolv* /etc/nsswitch.conf /etc/hosts.* /usr/lib/libsasl* /usr/lib/libssl* /lib/libdb2* 2>/dev/null)
do
recopie_fichier
done
}
function creation_cage_ldap
{
creation_base
# Recopie des bases ldap
for FICHIER_COPIE in $(find /var/lib/ldap 2>/dev/null)
do
recopie_fichier
done
# Pour permettre l'authentification PAM LDAP
for FICHIER_COPIE in $(find /etc/ldap* /lib/libnss* /lib/libpam* /etc/pam* /etc/libnss* /lib/security/* /usr/lib/libldap* /usr/lib/liblber* /lib/libresolv* /etc/nsswitch.conf /etc/hosts.* /usr/lib/libsasl* /usr/lib/libssl* /lib/libdb2* 2>/dev/null)
do
recopie_fichier
done
}
# Recuperation des arguments de la ligne de commande
PROG=$1
# Verification de la presence de l'utilitaire rsync permettant de copier
# facilement les fichiers souhaités
test -f /usr/bin/rsync || PROG="rsync_absent"
# Recuperation des variables de traitement
echo -n "Repertoire de cage (sans / final) : "
read HOME_CAGE
echo -n "Nom du démon a encager : "
read NOM_DAEMON
DAEMON=$(which $NOM_DAEMON)
echo -n "Emplacement du démon ($DAEMON) : "
read DAEMON
if [ "$DAEMON" == "" ]; then DAEMON=$(which $NOM_DAEMON); fi
echo -n "Commande permettant d'arreter/redemarrer le demon (/etc/init.d/$NOM_DAEMON) : "
read COMMANDE_DAEMON
if [ "$COMMANDE_DAEMON" == "" ]; then COMMANDE_DAEMON="/etc/init.d/$NOM_DAEMON"; fi
case "$PROG" in
postfix) creation_cage_postfix
;;
syslog) creation_cage_syslog
;;
apache)
creation_cage_apache
;;
ssh)
creation_cage_ssh
;;
ldap)
creation_cage_ldap
;;
rsync_absent)
echo "L'utilitaire rsync doit etre installé à l'aide de la commande apt-get install"
;;
*)
echo "Usage : $0 postfix|syslog|apache|ssh|ldap"
;;
esac
echo ""
echo "Votre serveur est desormais prét à etre encagé dans le repertoire $HOME_CAGE"
echo ""
echo "Pensez a modifier vos fichiers de demarrage (/etc/init.d/*) en rajoutant :"
echo " - soit l'option de lancement du demon $NOM_DAEMON permettant d'indiquer"
echo " le repertoire de cage"
echo " - soit la commande chroot $HOME_CAGE $DAEMON"
Les systèmes d’exploitation Unix permettent d’automatiser des taches données. Cette automatisation s’effectue à l’aide de la commande « cron » qui examine le fichier « /etc/crontab » pour déterminer quelles actions effectuer …
Le démon « anacron » présente la possibilité de gérer ces taches de manière journalière, hebdomadaire, mensuellement ou encore toutes les heures.
L’installation de ce démon (version 2.3-6) s’effectue de la façon suivante :
è Apt-get install cron anacron
Ce package dépend des packages suivants :
- libc6 (version >= 2.2.2-2) ;
- debianutils (version >= 1.7) ;
- sysklogd ou system-log-daemon ;
- exim ou mail-transport-agent.
Les taches à effectuer sont alors définies dans les répertoires « /etc/cron.hourly », « /etc/cron.daily », « /etc/cron.weekly » et « /etc/cron.monthly ».