<?xml version="1.0" encoding="iso8859-1" ?>

<!DOCTYPE book PUBLIC "-//OASIS//DTD docbook XML V4.2//EN" 
"/usr/share/sgml/docbook/dtd/xml/4.2/docbookx.dtd">

<book lang="fr" id="index.html">

<bookinfo>
 <title>Guide d'installation d'un serveur LAMP</title>
 <author>
  <firstname>Cedric</firstname>
  <surname>Malherbe</surname>
  <affiliation>
   <address><email>ced at 404consulting dot com</email></address>
  </affiliation>
 </author>
 <date>2004-10-26</date>
 <pubdate>2004-10-26</pubdate>
 <abstract>
  <para>Guide d'installation, configuration et sécurisation d'un serveur Linux Apache MySQL PHP</para>
 </abstract>
</bookinfo>

<preface id="preface">
 <title>A propos de ce document</title>
 
 <sect1><title>Objectif</title>
  <para>Ce document discute de la mise en service d'un serveur web sous Debian GNU/Linux. Les points abordés sont l'installation, la configuration des services et la sécurisation de la machine.</para>
  <para>Ce guide se veut simple et n'aborde qu'une partie de la configuration d'un serveur. Il se focalise sur la mise en place d'un hébergement dédié de pages dynamiques.</para>
 </sect1>

 <sect1><title>Historique</title>
  <table>
   <title>Historique du document</title>
   <tgroup cols="2">
    <thead>
     <row>
      <entry>Date</entry><entry>Modification</entry>
     </row>
    </thead>
    <tbody>
     <row>
      <entry>2004-07-05</entry><entry>Première version publique</entry>
     </row>
     <row>
      <entry>2004-08-09</entry><entry>Correction et amélioration de la partie sur les quotas, des scripts iptables (pare-feu), mise-à-jour de sécurité et nom de machine.</entry>
     </row>
     <row>
      <entry>2004-10-26</entry><entry>Petite correction dans la partie concernant la sécurisation de SSH.</entry>
     </row>		
    </tbody>
   </tgroup>
  </table>
 </sect1>
 
</preface>

<chapter id="intro">
 <title>Introduction</title>

 <sect1 id="goal">
  <title>But de l'installation</title>
  <para>Mettre en place un serveur web dédié pour l'hébergement de contenus dynamiques (PHP, CGI...) en relation avec des bases de données (SQL).</para>
 </sect1>
 
 <sect1 id="conf">
  <title>Configuration matérielle requise</title>
  <para>Ce guide ne discute que de l'installation sur une architecture Intel x86 (et compatible), mais d'autres architectures sont envisageable (PowerPC, Sparc, Alpha...).</para>
  <itemizedlist>
   <listitem><para>Processeur: Pentium 2 ou équivalent</para></listitem>
   <listitem><para>Mémoire: 32-64Mo minimum</para></listitem>
   <listitem><para>Disque dur: 500Mo à plusieurs Go suivant les besoins</para></listitem>
   <listitem><para>Carte réseau: 10/100Mbits</para></listitem>
  </itemizedlist>
 </sect1>
 
 <sect1 id="choice">
  <title>Choix du système d'exploitation</title>
  <para>Le choix du système d'exploitation s'est porté sur GNU/Linux étant donné ses besions matériels faibles, sa stabilité et son coût de déploiement et de maintenance.</para>
  <para>La distribution retenue est Debian GNU/Linux pour sa stabilité, sa facilité de mise à jour (apt) et son suivi de sécurité (debian security).</para>
 </sect1>

</chapter>


<chapter id="installation">
 <title>Procédure d'installation de Debian GNU/Linux Sarge</title>
 
 <sect1 id="boot">
  <title>Boot option</title>
  <para>4 types d'installation sont disponible:</para>
  <itemizedlist>
   <listitem><para><emphasis>linux</emphasis> (choix par défaut)</para></listitem>
   <listitem><para><emphasis>expert</emphasis> (pour chaque étape de l'installation, une confirmation est demandé)</para></listitem>
   <listitem><para><emphasis>linux26</emphasis> (idem que <emphasis>linux</emphasis> mais installation du kernel 2.6 au lieu du 2.4)</para></listitem>
   <listitem><para><emphasis>expert26</emphasis> (idem que <emphasis>expert</emphasis> mais installation du kernel 2.6 au lieu du 2.4)</para></listitem>
  </itemizedlist>
  <para>La suite du document décrit l'installation de Debian GNU/Linux en mode <emphasis>linux</emphasis> / <emphasis>linux26</emphasis>.</para>
 </sect1>

 <sect1 id="language">
  <title>Choix de la langue</title>
  <para>Choisir la langue souhaité et sa variante. Par exemple: <emphasis>fr_BE</emphasis></para>
 </sect1>

 <sect1 id="keyboard">
  <title>Choix du clavier</title>
  <para>Dépend souvent de la langue. 105 touches + support Euro: <emphasis>Belgique Latin 1</emphasis></para>
 </sect1>

 <sect1 id="machinename">
  <title>Nom de la machine</title>
  <para>A votre convenance. Il ne s'agit pas du nom de domaine qualifié, ne mettez donc pas <emphasis>monsite.com</emphasis> ici.</para>
 </sect1>

 <sect1 id="networkconf">
  <title>Configuration réseau</title>
  <para>Vous avez le choix entre la configuration automatique via <emphasis>DHCP</emphasis> ou un réglage manuel.</para>
  <para>En cas de configuration manuel, entrer l'adresse IP de votre machine (adresse statique), le masque de sous-réseau (netmask) et éventuellement l'adresse de broadcast, l'adresse de votre passerelle (gateway) et les serveurs de noms (résolution DNS).</para>
 </sect1>

 <sect1 id="partitioning">
  <title>Partitionnement du disque dur</title>
  <para>Exemple de partitionement pour un disque dur d'environ 5Go:</para>
  <table>
   <title>Partitionnement</title>
   <tgroup cols="5">
    <thead>
     <row>
      <entry>Point de montage</entry><entry>Système de fichiers</entry><entry>Taille</entry><entry>Type</entry><entry>spécificité</entry>
     </row>
    </thead>
    <tbody>
     <row>
      <entry>/boot</entry><entry>ext2</entry><entry>50Mo</entry><entry>primaire</entry><entry>amorçable</entry>
     </row>
     <row>
      <entry>/</entry><entry>Reiser FS</entry><entry>150Mo</entry><entry>logique</entry>
     </row>
     <row>
      <entry>/usr</entry><entry>Reiser FS</entry><entry>2Go</entry><entry>logique</entry>
     </row>
     <row>
      <entry>/var</entry><entry>Reiser FS</entry><entry>1.5Go</entry><entry>logique</entry>
     </row>
     <row>
      <entry>/tmp</entry><entry>ext2</entry><entry>100Mo</entry><entry>logique</entry>
     </row>
     <row>
      <entry>/home</entry><entry>Reiser FS</entry><entry>1Go</entry><entry>logique</entry>
     </row>
     <row>
      <entry>/swap</entry><entry>Swap</entry><entry>200Mo</entry><entry>logique</entry>
     </row>
    </tbody>
   </tgroup>
  </table>
  <para>Pour un serveur, la taille de la partition <filename>/var</filename> doit être suffisament grande pour stocker les logs et les emails en attente. 1Go ne sera pas de trop si vous comptez fournir un service email.</para>
  <para>La taille de la partition <filename>/home</filename> doit refléter le nombre d'utilisateurs dont vous souhaitez fournir un compte et un espace de stockage.</para>
 </sect1>

 <sect1 id="packages">
  <title>Installation des paquets</title>
  <para>L'installation des paquets de base se fait automatiquement, aucune intervention n'est donc nécessaire pendant quelques minutes.</para>
 </sect1>

 <sect1 id="bootloader">
  <title>Système d'amorçage (boot loader)</title>
  <para><emphasis>GRUB</emphasis> (choix par défaut)</para>
  <para>Si votre machine comporte plusieurs systèmes d'exploitations, ceux-ci seront automatiquement détectés et leur entrée respective ajoutée au menu de GRUB.</para>
 </sect1>

 <sect1 id="endinstall">
  <title>Fin de l'installation</title>
  <para>L'installation de base est maintenant terminé. Retirez le CD, le système va redémarrer.</para>
 </sect1>
 
</chapter>


<chapter id="postintall">
 <title>Configuration post-installation</title>

 <sect1 id="clock">
  <title>Configuration de l'heure</title>
  <para>L'horloge matérielle est-elle réglée sur GMT? <emphasis>Oui</emphasis></para>
  <para>Choix du fuseau horaire: <emphasis>Europe/Brussels</emphasis></para>
 </sect1>

 <sect1 id="passroot">
  <title>Mot de passe administrateur (root)</title>
  <para>La complexité du mot de passe root est la clé de la sécurité de votre système. N'hésitez pas à mélanger minuscules, majuscules et chiffres.</para>
 </sect1>

 <sect1 id="adduser">
  <title>Création d'utilisateur(s)</title>
  <para>Créez au moins un utilisateur pour se connecter à la machine, même si vous (l'administrateur) êtes le seul à l'y accéder.</para>
  <para>On ne se connecte jamais en root!</para>
 </sect1>

 <sect1 id="aptconf">
  <title>Configuration d'APT</title>
  <para>APT vous permet de mettre à jour votre système et d'installer des paquets supplémentaires. Plusieurs options vous sont proposées (cdrom, ftp, http, sauter l'étape). Si votre réseau fonctionne, choisissez ftp (ou http si un pare-feu éventuel bloque l'accès sur le port 21)</para>
  <itemizedlist>
   <listitem><para>Méthode: <emphasis>FTP</emphasis></para></listitem>
   <listitem><para>Version de Debian<footnote>
    <para>La distribution Debian se compose de trois branches distinctes: <emphasis>stable</emphasis>, <emphasis>testing</emphasis> et <emphasis>unstable</emphasis>.</para>
    <para><emphasis>Stable</emphasis> est la version "super" stable, longuement testé et dispose de mise à jour de sécurité. La branche <emphasis>unstable</emphasis> profite des dernières nouveautées logiciels mais ne garanti pas que le système soit pleinnement fonctionnel. <emphasis>Testing</emphasis> se situe entre les deux, elle recoit au fur et à fur les paquets de la version <emphasis>unstable</emphasis> si ceci sont considérés comme suffisament solide. Elle ne dipose cependant d'aucune mise à jour de sécurité.</para>
    <para>Pour une utilisation serveur, le choix de la branche <emphasis>stable</emphasis> s'impose de lui-même.</para>
   </footnote>: <emphasis>stable</emphasis></para></listitem>
   <listitem><para>Pays: <emphasis>Belgique</emphasis></para></listitem>
   <listitem><para>Choix du serveur: <emphasis>ftp.debian.skynet.be</emphasis></para></listitem>
   <listitem><para>Mise à jour de sécurité (security.debian.org)? <emphasis>Oui</emphasis></para></listitem>
  </itemizedlist>
 </sect1>

 <sect1 id="mailserver">
  <title>Configuration du serveur de courrier</title>
  <para>Exim 4 est installé par défaut.</para>
  <para>Choisissez la configuration <emphasis>"pour site internet"</emphasis>.</para>
  <para>Configurez les alias mail (root &amp; postmaster) vers le compte utilisateur de l'administrateur.</para>
  <para>Vous pourrez changer cette configuration après l'installation via la commande:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>dpkg-reconfigure exim4-config</userinput>
  </screen>
 </sect1>

 <sect1 id="endpostinstall">
  <title>Fin</title>
  <para>A ce stade, votre système Debian GNU/Linux est utilisable, mais dépourvu d'applications et encore peu sécurisé. Les étapes suivantes ont pour but de remédier à ces manquements.</para>
 </sect1>
 
</chapter>

<chapter id="installapps">
 <title>Installation d'applications serveurs</title>

 <sect1 id="http">
  <title>Serveur HTTP</title>
  <para>Installez Apache 1.3 et PHP 4:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>apt-get install apache apache-utils php4</userinput>
  </screen>
  <para>Editez <filename>/etc/apache/httpd.conf</filename> et modifiez les options suivantes comme décrites:</para>
  <programlisting>
  MaxClients 25
  ServerAdmin votre@adresse.email
  ServerName www.votre-domain.com
  DocumentRoot /var/www
  AddType application/x-httpd-php .php
  </programlisting>
  <para>La valeur de <emphasis>MaxClients</emphasis> dépend de la quantité de mémoire vive de votre serveur. La valeur par défaut (150) est souvent bien trop élevée pour une petite configuration.</para>
 </sect1>

 <sect1 id="database">
  <title>Base de données</title>
  <para>Installez MySQL 4:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>apt-get install mysql-server mysql-common php4-mysql</userinput>
  </screen>
   <para>Par défaut, aucun mot de passe pour MySQL n'est défini. Pour ajouter un mot de passe, exécutez la commande suivante:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>mysqladmin -u root password mot_de_passe</userinput>
  </screen>
 </sect1>

 <sect1 id="ftp">
  <title>Serveur FTP</title>
  <para>Intallez ProFTP:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>apt-get install proftp</userinput>
  </screen>
 </sect1>
 
</chapter>

<chapter id="security">
 <title>Sécurisation du système</title>

 <sect1 id="mountpoint">
  <title>Points de montage</title>
  <para>Editez <filename>/etc/fstab</filename> et modifiez les options comme décrit:</para>
  <table>
   <title>Sécuriser les points de montage</title>
   <tgroup cols="2">
    <thead>
     <row>
      <entry>Point de montage</entry><entry>Options</entry>
     </row>
    </thead>
    <tbody>
     <row>
      <entry>/boot</entry><entry>defaults,ro</entry>
     </row>
     <row>
      <entry>/usr</entry><entry>defaults,ro,nodev</entry>
     </row>
     <row>
      <entry>/var</entry><entry>defaults,nodev</entry>
     </row>
     <row>
      <entry>/tmp</entry><entry>defaults,nosuid,noexec,nodev</entry>
     </row>
    </tbody>
   </tgroup>
  </table>
  <para><filename>/usr</filename> étant en lecture seul (<emphasis>ro</emphasis>), il sera impossible d'installer ou de mettre à jour votre système sans remonter la partition en lecture/écriture. L'option <emphasis>noexec</emphasis> de la partition <filename>/tmp</filename> peut également poser des problèmes.</para>
  <para>Pour contourner ces problèmes et ne pas devoir effectuer les changements manuellement à chaque fois, rajoutez ceci dans le fichier de configuratrion d'APT (<filename>/etc/apt/apt.conf</filename>):</para>
  <programlisting>
  DPkg
  {
  Pre-Invoke {"mount /usr -o remount,rw"};
  Pre-Invoke {"mount /tmp -o remount,exec"};
  Post-Invoke {"mount /usr -o remount,ro"};
  Post-Invoke {"mount /tmp -o remount,noexec"};
  };
  </programlisting>
 </sect1>

 <sect1 id="basicsecurity">
  <title>Sécurisation de base</title>

  <sect2 id="grub">
   <title>GRUB</title>
   <para>Ajoutez un mot de passe. Editez <filename>/boot/grub/menu.lst</filename> et rajoutez la ligne suivante:</para>
   <programlisting>
   password --md5 hash_du_mot_de_passe
   </programlisting>
   <para>Pour générer le hash de votre mot de passe, utilisez le programme <command>grub-md5-crypt</command>.</para>
  </sect2>

  <sect2 id="password">
   <title>Mot de passe</title>
   <para>Activer le mode <emphasis>shadow password</emphasis> si vous l'avez désactivé lors de l'installation:</para>
   <screen>
    <prompt>machine:~# </prompt><userinput>shadowconfig on</userinput>
   </screen>
   <para>De manière générale, utilisez des mots de passe suffisament long et complexe (mélangez majuscules, minuscules, chiffres...).</para>
   <para>Pour générer de bon mots de passe, utilisez <command>apg</command> (<command>apt-get install apg</command>). Ce programme a l'avantage de créer des mots de passe prononçable tout en étant suffisament complexe.</para>
  </sect2>

  <sect2 id="login">
   <title>Login</title>
   <para>Pour une politique de sécurité accrue, bloquez l'accès au compte administrateur depuis l'extérieur.</para>
   <para>Editez <filename>/etc/security/access.conf</filename> et ajoutez la ligne suivante:</para>
   <programlisting>
   -:wheel:ALL EXCEPT LOCAL
   </programlisting>
   <para>Pour se connecter à distance, il faudra alors passer par un compte utilisateur, puis se connecter en root via la commande <command>su</command>.</para>
  </sect2>
  
 </sect1>

 <sect1 id="services">
  <title>Sécurisation des services</title>

  <sect2 id="secservices">
   <title>Désactiver les services inutiles</title>
   <para>Editez <filename>/etc/inetd.conf</filename> et commentez tous les services inutiles:</para>
   <itemizedlist>
    <listitem><para>echo</para></listitem>
    <listitem><para>chargen</para></listitem>
    <listitem><para>discard</para></listitem>
    <listitem><para>daytime</para></listitem>
    <listitem><para>time</para></listitem>
   </itemizedlist>
   <para>Relancer le démon <emphasis>inet</emphasis> avec la commande suivante:</para>
   <screen>
    <prompt>machine:~# </prompt><userinput>/etc/init.d/inetd restart</userinput>
   </screen>
  </sect2>

  <sect2 id="secssh">
   <title>SSH</title>
   <para>Editez <filename>/etc/ssh/sshd_config</filename> et ajoutez les options suivantes:</para>
   <programlisting>
   Protocol 2
   AllowGroups staff
   PermitRootLogin no
   PermitEmptyPasswords no
   </programlisting>
   <para>N'oubliez pas de vous ajouter au groupe <emphasis>staff</emphasis> (désormais le seul groupe à pouvoir se connecter au serveur via ssh):</para>
   <screen>
    <prompt>machine:~# </prompt><userinput>adduser votre_login staff</userinput>
   </screen>
  </sect2>

  <sect2 id="secproftp">
   <title>FTP</title>
   <para>Editez <filename>/etc/proftp.conf</filename> et ajoutez les options suivantes:</para>
   <programlisting>
   DefaultRoot ~
   DenyFilter \*.*/
   </programlisting>
   <para>L'option <emphasis>DefaultRoot ~</emphasis> enferme les utilisateurs dans leur répertoire personel, les empéchant ainsi de se balader dans l'arborescence système.</para>
   <para>Dans le même ordre d'idée mais en excluant le groupe <emphasis>staff</emphasis> de la directive: <emphasis>DefaultRoot ~ !staff</emphasis>.</para>
  </sect2>

 </sect1>

 <sect1 id="firewall">
  <title>Mise en place d'un pare-feu</title>
  <para>But du pare-feu: bloquer toute connexion au serveur sur les ports autre que 21 (ftp), 22 (ssh) et 80/443 (http).</para>
  <para>Nous utiliserons <emphasis>netfilter/iptables</emphasis> comme pare-feu:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>apt-get install iptables</userinput>
  </screen>
  <para>Voici les règles du pare-feu à placer dans un fichier nommé <filename>firewall-start</filename> (par exemple). Nous le copierons dans le dossier <filename>/etc/network/if-pre-up.d/</filename> afin qu'il soit activé à chaque démarrage de l'interface réseau.</para>
  <programlisting>
  #!/bin/sh
  # Configuration du pare-feu

  modprobe ip_conntrack_ftp

  # Configuration:
  # Indiquez l'adresse IP de votre serveur ici:
  IPADDRESS=adresse_ip_de_votre_serveur

  #
  # Parametrage au niveau du noyau
  #

  echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
  echo 1 > /proc/sys/net/ipv4/tcp_syncookies #this violate a RFC!
  echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
  echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
 
  #
  # Vider les regles de filtrage 
  #

  iptables -F

  # 
  # Politique par defaut
  #

  # bloquer les paquets entrants
  iptables -P INPUT DROP

  # accepter les paquets sortants
  iptables -P OUTPUT ACCEPT

  # bloquer les transferts 
  iptables -P FORWARD DROP

  # 
  # Filtres de base
  #

  # accepter le trafic sur l'interface loopback 
  iptables -A INPUT -i lo -j ACCEPT

  # bloquer le spoofing de l'adresse loopback
  iptables -A INPUT -s 127.0.0.0/8 -j DROP
  iptables -A INPUT -d 127.0.0.0/8 -j DROP

  # bloquer les tentatives de spoofing de l'adresse IP locale 
  iptables -A INPUT -s $IPADDRESS -j DROP

  # s'assurer que les connexions TCP commencent avec des paquets syn 
  iptables -A INPUT -p tcp -m tcp ! --syn -m state --state NEW -j DROP

  # protection contre le ping flood 
  iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT 
  iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

  # accepter les autres requetes icmp
  iptables -A INPUT -p icmp -j ACCEPT

  # accepter les connexions pre-etablies
  iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

  #
  # connexions aux serveurs
  #

  # accepter les connexions ssh 
  iptables -A INPUT -p tcp --dport 22 -j ACCEPT

  # accepter les connexions web
  iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  iptables -A INPUT -p tcp --dport 443 -j ACCEPT

  # accepter les connexions ftp 
  iptables -A INPUT -p tcp --dport 21 -j ACCEPT
  </programlisting>
  <para>Et maintenant le fichier <filename>firewall-stop</filename> pour arrêter le pare-feu, à placer dans le dossier <filename>/etc/network/if-post-down.d/</filename></para>
  <programlisting>
  #!/bin/sh
  # Configuration sans pare-feu

  echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
  echo 0 > /proc/sys/net/ipv4/tcp_syncookies
  echo 1 > /proc/sys/net/ipv4/conf/all/accept_redirects
  echo 1 > /proc/sys/net/ipv4/conf/all/send_redirects

  # Vider les regles de filtrage
  iptables -F

  # Politique par defaut: tout accepter
  iptables -P INPUT ACCEPT
  iptables -P OUTPUT ACCEPT
  iptables -P FORWARD ACCEPT
  </programlisting>
  <para>Assurez-vous que ces scripts soient exécutable:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>chmod 755 /etc/network/if-pre-up.d/firewall-start</userinput>
   <prompt>machine:~# </prompt><userinput>chmod 755 /etc/network/if-post-down.d/firewall-stop</userinput>
  </screen>
  <para>Cette configuration vous permez également d'arrêter et de redémarrer le pare-feu manuellement avec les commandes suivantes:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>sh /etc/network/if-post-down.d/firewall-stop</userinput>
   <prompt>machine:~# </prompt><userinput>sh /etc/network/if-pre-up.d/firewall-start</userinput>
  </screen>

 </sect1>

 <sect1 id="updatesecu">
  <title>Mise à jour de sécurité</title>
  <para>Si vous n'avez pas configuré les mises à jour de sécurité pendant l'installation de Debian, éditez <filename>/etc/apt/sources.list</filename> et ajouter la ligne suivante:</para>
  <programlisting>
  deb http://security.debian.org/ sarge/updates main
  </programlisting>
  <para>Pour une mise à jour manuelle, exécutez:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>apt-get update</userinput>
   <prompt>machine:~# </prompt><userinput>apt-get upgrade</userinput>
  </screen>
  <para>Pour automatiser la mise à jour, installez <command>cron-apt</command>:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>apt-get install cron-apt</userinput>
  </screen>
  <para>Editez <filename>/etc/cron-apt/action.d/3-download</filename> et appliquez les options suivantes:</para>
  <programlisting>
  upgrade -u -y
  autoclean -y
  </programlisting>
  <para>La mise à jour se fera toutes les nuits à 4h00.</para>
 </sect1>
 
</chapter>

<chapter id="quota">
 <title>Quota</title>
 <para>Attention, le support des quotas sur les partitions Reiser FS n'est disponible qu'à partir de la version 2.6.7 du noyau Linux. Il vous faudra donc appliquer un patch si vous possédez un noyau plus ancien.</para>
 <screen>
  <prompt>machine:~# </prompt><userinput>apt-get install quota</userinput>
 </screen>
 <para>Editez <filename>/etc/fstab</filename> et ajoutez les options suivantes à la partition voulue:</para>
 <programlisting>
 usrquota,grpquota
 </programlisting>
 <para>Préparation de la partition (<emphasis>/home</emphasis> en exemple):</para>
 <screen>
  <prompt>machine:~# </prompt><userinput>touch /home/quota.user /home/quota.group</userinput>
  <prompt>machine:~# </prompt><userinput>chmod 600 /home/quota.*</userinput>
  <prompt>machine:~# </prompt><userinput>mount -o remount /home</userinput>
 </screen>

 <para>Activer les quotas:</para>
 <screen>
  <prompt>machine:~# </prompt><userinput>quotacheck -avugm</userinput>
  <prompt>machine:~# </prompt><userinput>quotaon -a</userinput>
 </screen>

 <para>Définir les quotas pour un utilisateur:</para>
 <screen>
  <prompt>machine:~# </prompt><userinput>edquota -u albert</userinput>
  <computeroutput>
  Disk quotas for user albert (uid XXXX):
  Filesystem       blocks     soft     hard   inodes   soft   hard
  /dev/hdaX            24        0        0        7      0      0
  </computeroutput>
 </screen>

 <para>Les valeurs de <emphasis>blocks</emphasis> et <emphasis>inodes</emphasis> représentent respectivement le nombre de blocs et de fichiers que l'utilisateur possède. Ces valeurs sont générées automatiquement, ne les modifiez pas.</para>
 
 <para>Par contre, vous pouvez régler les valeurs limites <emphasis>soft</emphasis> et <emphasis>hard</emphasis>, à la fois pour les blocs et pour les inodes en remplaçant les zéros par les valeurs de votre choix (0 = pas de limite).</para>

 <para>Pour définir des quotas sur les groupes, même principe, avec la commande suivante:</para>
 
 <screen>
  <prompt>machine:~# </prompt><userinput>edquota -g ungroupe</userinput>
 </screen>

 <para>Vous pouvez également définir une période de "grace" avant de faire respecter les quotas:</para>

 <screen>
  <prompt>machine:~# </prompt><userinput>edquota -t</userinput>
  <computeroutput>
  Grace period before enforcing soft limits for users:
  Time units may be: days, hours, minutes, or seconds
  Filesystem         Block grace period     Inode grace period
  /dev/hdaX                 7days                  7days
  </computeroutput>
 </screen>

 <para>Automatiser la vérification des quotas avec <emphasis>cron</emphasis>:</para>
 
 <screen>
  <prompt>user@machine:~$ </prompt><userinput>su</userinput>
  <computeroutput>Password:</computeroutput>
  <prompt>machine:~# </prompt><userinput>crontab -e</userinput>
 </screen>

 <para>Ajoutez-y les lignes suivantes:</para>
  
 <programlisting>
 # verification des quotas tous les dimanches a 3h30
 30 3 * * 0 /sbin/quotacheck -avugm
 </programlisting>

 <para>Vous pouvez activer/désactiver les quotas à tout moment avec les commandes <command>quotaon</command> et <command>quotaoff</command>.</para>
  
</chapter>

<chapter id="backup">
 <title>Sauvegarde</title>
 
 <sect1 id="savedir">
  <title>Sauvegarde des fichiers</title>
  <para>Installez <emphasis>rdiff-backup</emphasis></para>
  <screen>
   <prompt>machine:~# </prompt><userinput>apt-get install rdiff-backup</userinput>
  </screen>
  <para>Pour effectuer une sauvegarde manuelle:</para>
  <screen>
   <prompt>user@machine:~$ </prompt><userinput>rdiff-backup /repertoire/a/sauvegarder /destination/de/la/sauvegarde</userinput>
  </screen>
  <para>Pour restaurer les données, utilisez la commande suivante:</para>
  <screen>
   <prompt>user@machine:~$ </prompt><userinput>cp -a /repertoire/de/sauvegarde /emplacement/du/site</userinput>
  </screen>
 </sect1>

 <sect1 id="savedb">
  <title>Sauvegarde de la base de données</title>
  <para>Pour effectuer une sauvegarde de toutes les bases en une archive au format gzip:</para>
  <screen>
   <prompt>user@machine:~$ </prompt><userinput>mysqldump -u root --password --all-databases | gzip > backup.sql.gz</userinput>
   <computeroutput>Enter password:</computeroutput>
  </screen>
  <para>Pour restaurer les bases, utilisez les commandes suivantes:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>gzip -d backup.sql.gz</userinput>
   <prompt>machine:~# </prompt><userinput>mysql -u root &lt; backup.sql</userinput>
  </screen>
 </sect1>
 
 <sect1 id="autobackup">
  <title>Automatiser les sauvegardes avec <emphasis>cron</emphasis></title>
  <para>Pour automatiser ces tâches, nous allons créer deux scripts maison regroupant les procédures à effectuer.</para>
  <para>Dans le répertoire <filename>/usr/local/bin/</filename>, créez un fichier <filename>sauvegarde_site</filename> avec le contenu suivant:</para>
  <programlisting>
  #!/bin/sh
  # sauvegarde des fichiers/repertoires
  # hebdommadaire, sur les 4 dernieres semaines

  # A modifier:
  SOURCE=/var/www
  DESTINATION=/mnt/backup

  DATE=`date +%Y-%m-%d`
  WEEK=`date +%W`
  let "DEL=$WEEK-4"

  # backup de la semaine
  /usr/bin/rdiff-backup $SOURCE $DESTINATION/$WEEK.$DATE

  # efface le backup vieux de 4 semaines
  rm -rf $DESTINATION/$DEL.*
  </programlisting>

  <para>Toujours dans le répertoire <filename>/usr/local/bin/</filename>, créez un fichier <filename>sauvegarde_bdd</filename> avec le contenu suivant:</para>
  <programlisting>
  #!/bin/sh
  # sauvegarde des bases de données
  # hebdommadaire, sur les 4 dernieres semaines

  # A modifier:
  USER=root
  PASS=mot_de_passe_sql
  DESTINATION=/mnt/backup

  DATE=`date +%Y-%m-%d`
  WEEK=`date +%W`
  let "DEL=$WEEK-4"

  # backup de la semaine
  mysqldump -u $USER --password=$PASS --all-databases | gzip > $DESTINATION/$WEEK.$DATE.sql.gz
  
  # efface le backup vieux de 4 semaines
  rm -rf $DESTINATION/$DEL.*.sql.gz
  </programlisting>
  
  <para>Assurez-vous que les scripts soient exécutables:</para>
  <screen>
   <prompt>machine:~# </prompt><userinput>chmod 700 /usr/local/bin/sauvegarde_site</userinput>
   <prompt>machine:~# </prompt><userinput>chmod 700 /usr/local/bin/sauvegarde_bdd</userinput>
  </screen>
  
  <para>Pour planifier l'exécution de ces scripts, procédez comme ceci:</para>
  
  <screen>
   <prompt>user@machine:~$ </prompt><userinput>su</userinput>
   <computeroutput>Password:</computeroutput>
   <prompt>machine:~# </prompt><userinput>crontab -e</userinput>
  </screen>

  <para>Ajoutez ensuite les lignes suivantes:</para>
  
  <programlisting>
  # backup des fichiers tous les samedi a 3h00
  0 3 * * 6 /usr/local/bin/sauvegarde_site

  # backup de la base de donnees tous les samedi a 3h00
  0 3 * * 6 /usr/local/bin/sauvegarde_bdd
  </programlisting>

  <para>Il vous est également possible d'éditer directement le fichier <filename>/var/spool/cron/crontabs/root</filename> même si ce n'est pas conseillé (relancez le démon cron après modification).</para>
  
  <para>La syntaxe fonctionne de la manière suivante:</para>
  <programlisting>
  0 3 * * 6 /usr/local/bin/sauvegarde_site
  | | | | | |
  | | | | | |-----> programme à exécuter
  | | | | |-------> jour de la semaine (0 pour dimanche, 1 pour lundi, etc.)
  | | | |---------> mois (1-12)
  | | |-----------> jour (1-31)
  | |-------------> heure (0-23)
  |---------------> minute (0-59)

  * est une wilcard = toujours "vrai"
  </programlisting>
  
  <para>La commande <command>crontab -l</command> permet de connaître toutes les entrées déjà configurées. La commande <command>crontab -r</command> permet de les effacer.</para>
 </sect1>
 
</chapter>

<chapter id="more">
 <title>Plus d'information</title>
 <para>Documentations, tutoriaux, howto...</para>
 <itemizedlist>
  <listitem><para><ulink url="http://people.via.ecp.fr/~alexis/formation-linux/">Formation Linux</ulink> [fr]</para></listitem>
  <listitem><para><ulink url="http://qref.sourceforge.net">Debian Reference</ulink> [en]</para></listitem>
  <listitem><para><ulink url="http://www.debian.org/doc/manuals/securing-debian-howto/">Securing Debian Manual</ulink> [en]</para></listitem>
  <listitem><para><ulink url="http://proftpd.linux.co.uk/localsite/Userguide/linked/userguide.html">A ProFTP User's Guide</ulink> [en]</para></listitem>
  <listitem><para><ulink url="http://rdiff-backup.stanford.edu/docs.html">rdiff-backup documentation</ulink> [en]</para></listitem>
 </itemizedlist>
</chapter>

</book>
