Product SiteDocumentation Site

B.5. Exemple de script pour changer l'installation par défaut de BIND

Ce script automatise la procédure de modification d'installation par défaut du serveur de noms bind version 8 pour qu'il ne fonctionne pas en tant que superutilisateur. Remarquez que bind version 9 dans Debian fait déjà cela par défaut[87], et que vous devriez plutôt l'utiliser que bind version 8.
Ce script est laissé pour des raisons historiques et montre comment automatiser ce type de modifications globales du système. Le script créera les utilisateur et groupe définis pour le serveur de noms et modifiera à la fois /etc/default/bind et /etc/init.d/bind pour que le programme soit exécuté en tant que cet utilisateur. Utilisez-le avec la plus grande attention car il n'a pas été testé rigoureusement.
Vous pouvez aussi créer l'utilisateur vous-même et utiliser le correctif disponible pour le script d'initialisation par défaut attaché au http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=157245.
#!/bin/sh
# Modifier la configuration par défaut du BIND v8 de Debian pour qu'il
# s'exécute en tant qu'utilisateur et groupe non superutilisateur.
#
# Ne pas utiliser cela avec la version 9, utiliser plutôt debconf pour le
# configurer.
#
# Attention : ce script n'a pas été testé rigoureusement, veuillez
# vérifier les modifications effectuées sur les scripts d'initialisation.

# (c) 2002 Javier Fernández-Sanguino Peña
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 1, or (at your option)
#    any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#     Please see the file `COPYING' for the complete copyright notice.
#

restore() {
# Au cas où, restaurer le système si la modification échoue
  echo "Attention : restauration de la configuration précédente car il"
  echo "            est impossible de la modifier correctement."
  echo "Attention : veuillez vérifier le script $INITDERR."
  mv $INITD $INITDERR
  cp $INITDBAK $INITD
}


USER=named
GROUP=named
INITD=/etc/init.d/bind
DEFAULT=/etc/default/bind
INITDBAK=$INITD.preuserchange
INITDERR=$INITD.changeerror
AWKS="awk ' /\/usr\/sbin\/ndc reload/ { print \"stop; sleep 2; start;\"; noprint = 1; } /\\\\$/ { if ( noprint != 0 ) { noprint = noprint + 1;} } /^.*$/ { if ( noprint != 0 ) { noprint = noprint - 1; } else { print \$0; } } '"

[ `id -u` -ne 0 ] && {
  echo "Ce script doit être exécuté en tant que superutilisateur"
  exit 1
}

RUNUSER=`ps eo user,fname |grep named |cut -f 1 -d " "`

if [ "$RUNUSER" = "$USER" ] 
then
  echo "Attention : le démon de serveur de noms est déjà exécuté en tant"
  echo "            que $USER."
  echo "Erreur :    ce script ne modifiera pas la configuration."
  exit 1
fi
if [ ! -f "$INITD" ]
then
  echo "Erreur :    ce système n'a pas de $INITD (ce que ce script tente de"
  echo "            modifier)"
  RUNNING=`ps eo fname |grep named`
  [ -z "$RUNNING" ] && \
  echo "Erreur :    en fait, le démon de serveur de noms n'est même pas en"
  echo "            cours d'exécution (est-il installé ?)"
  echo "Erreur :    aucune modification ne sera apportée au système."
  exit 1
fi

# Vérifier si les options sont déjà configurées
if [ -e "$DEFAULT" ]
then
  if grep -q ^OPTIONS $DEFAULT; then
    echo "Erreur :    le fichier $DEFAULT a déjà des options configurées."
    echo "Erreur :    aucune modification ne sera apportée au système."
  fi
fi
# Vérifier si le groupe named existe
if [ -z "`grep $GROUP /etc/group`" ] 
then
  echo "Création du groupe $GROUP :"
  addgroup $GROUP
else
  echo "Attention : le groupe $GROUP existe déjà. Il ne sera pas créé."
fi
# Pareil pour l'utilisateur
if [ -z "`grep $USER /etc/passwd`" ] 
then
  echo "Création de l'utilisateur $USER :"
  adduser --system --home /home/$USER \
  --no-create-home --ingroup $GROUP \
  --disabled-password --disabled-login $USER
else
  echo "Attention : l'utilisateur $USER existe déjà. Il ne sera pas créé."
fi

# Modifier le script init.d

# D'abord faire une sauvegarde (vérifier qu'il n'y en a pas déjà une)
if [ ! -f $INITDBAK ] 
then
  cp $INITD $INITDBAK
fi

# Puis l'utiliser pour la modifier
cat $INITDBAK |
eval $AWKS > $INITD

# Enfin placer les options dans le fichier /etc/default/bind
cat >>$DEFAULT <<EOF
# Utiliser l'utilisateur défini pour exécuter bind
OPTIONS="-u $USER -g $GROUP"
EOF
echo "Attention : le script $INITD a été modifié, tentative de test des"
echo "            modifications."
echo "Redémarrage du démon named (vérification des erreurs en cours)."

$INITD restart
if [ $? -ne 0 ]
then
  echo "Erreur :    échec du redémarrage du démon."
  restore
  exit 1
fi

RUNNING=`ps eo fname |grep named`
if [ -z "$RUNNING" ] 
then
  echo "Erreur :    named n'est pas en cours d'exécution, c'est sans doute"
  echo "            dû à un problème avec les modifications."
  restore
  exit 1
 fi

# Vérifier que named fonctionne comme prévu
RUNUSER=`ps eo user,fname |grep named |cut -f 1 -d " "`

if [ "$RUNUSER" = "$USER" ] 
then
  echo "Tout s'est bien passé, named semble maintenant fonctionner en tant"
  echo "            que $USER."
else
  echo "Erreur :    le script a échoué à modifier automatiquement le système."
  echo "Erreur :    named fonctionne actuellement en tant que $RUNUSER."
  restore
  exit 1
fi

exit 0
Le script précédent, exécuté sur le bind (version 8) personnalisé de Woody (Debian 3.0), modifiera le fichier initd après création de l'utilisateur et du groupe « named ».


[87] Depuis la version 9.2.1-5. C'est-à-dire depuis Debian Sarge.