Installation d'un serveur internet

Un article de Bellinux.

Jump to: navigation, search

Sommaire

Contexte et objectifs de ce tutoriel

En général, nous avons hébergé nos premières pages web dans un coin de l'internet: un compte unix de fac, les «pages persos» chez un hébergeur, ... Avec un peu de chance on a eu un hébergement php et un base de données mysql pour faire un peu de dynamique, ou installer des logiciels qui le font, comme Spip.

Puis peu à peu, on a eu besoin (ou envie) de plus: gérer en détail ses propres domaines -y compris le mail-, avoir des listes de distribution, installer autant de logiciels et d'extensions que l'on veut, ouvrir soi même des comptes à d'autres personnes, ... Certes, aujourd'hui on peut trouver un peut tout et n'importe quoi sur internet à louer ou acheter (ou auprès des copains comme Bellinux), mais le mieux est tout de même d'avoir son propre serveur, surtout si on est un peu geek et qu'on veut comprendre comment ça marche!

Si tel est ton cas, ce tutoriel est (ou plutôt sera...) fait pour toi: apprendre à monter un serveur sur internet, avec au passage quelques astuces et bonnes pratiques d'administration Linux.

Mon expérience, dont ce tutoriel est issue, est la suivante: il y trois ans, en 2003, je me suis acheté un nom de domaine (belvil.net et j'ai commencé par installer un petit serveur sur une vieille machine de récupération.

Voici le document d'installation que j'avais fait à l'époque.

Aujourd'hui, on vient de prendre un hébergement dédié ici pour bellinux. Et tant qu'à faire on écrit ce tutoriel en même temps qu'on installe ce nouvel hébergement.

Notes en bref

Installation d'une distribution Linux Debian (Sarge)

Dans mon serveur, je le fais à travers de la console web de la dedibox. Si tu dois installer toi même l'OS, tu peux te référer à la documentation ci-dessus -mais elle date un peu- ou au manuel d'installation chez Debian, très long mais terriblement instructif. Voici la table de partitions choisie (visible grâce à fdisk -l) :

    Name     Part Type     FS Type               [Label]             Size (MB)
    ---------------------------------------------------------------------------
    sda1    Primary      Linux ext2            [/boot]                131,61
    sda2    Primary      Linux                                       2146,80
    sda3    Primary      Linux ext3            [/]                  10734,00
    sda5    Logical      Linux ext3            [/usr]               10734,00
    sda6    Logical      Linux ext3            [/home]              53678,18
    sda7    Logical      Linux ext3            [/var]               53678,18
    sda8    Logical      Linux ext3            [/home/reste]        28903,64

On garde 30Gb de disque au cas où, pour après. Dès la fin de l'installation, je teste l'accès en ssh avec l'adresse IP de la machine:

 dani@cohete:~$ ssh root88.191.22.51
 Password:
 Last login: Sat Aug 26 18:15:39 2006 from cohete.belvil.net
 ma_dedi:~#

Sans être en mode parano, il est conseillé de ne pas laisser root se connecter par ssh. Pour cela il suffit d'éditer le fichier de config shh (/etc/ssh/sshd_config) Ajouter (si elle n'est pas déja presente :

    PermitRootLogin no 
    AllowUsers LoginDeMonUser 

pour redemarrer ssh et prendre en compte les modifs :

    /etc/init.d/ssh restart

DNS et Reverse DNS

J'ai un domaine acheté auprès d'un registrar. Par exemple, chez Gandi. Je configure un nom canonique de serveur pour mon nouveau serveur. Remarquons qu'il convient avant tout de lui donner un nom explicite et propre au serveur. Le nom de mon serveur est laica (comme la première chienne à être allée dans l'espace). Pas un nom fonctionnel du type www, ftp, smtp ou autre. En effet, il sera préférable de définir ces services comme des alias, comme cela le jour où ils doivent déménager, il suffit de changer le DNS. L'enregistrement se fera par une ligne dans le fichier de zone du type:

  laica   IN  A   88.191.22.51

On peut alors tester que ce nom est bien configuré (attention, il peut y avoir un temps de propagation au DNS):

  dani@cohete:~$ host laica.belvil.net
  laica.belvil.net has address 88.191.22.51

Et tenter de se connecter avec le nom de domaine plutôt que l'IP:

  dani@cohete:~$ ssh root@laica.belvil.net

S'agissant d'une machine qui doit héberger des services, il convient de définir une résolution inverse de l'adresse IP. C'est dans le gestionnaire de la plage d'adresses IP où est hébergé le serveur qui doit définir cela dans son serveur DNS. En l'occurrence, Dedibox le propose au travers de la console de gestion.

une fois défini, on peut le tester:

 dani@cohete:~$ host  88.191.22.51
 51.22.191.88.in-addr.arpa domain name pointer laica.belvil.net.

Définition des dépôts de paquets

Pour bien gérer un serveur, la première chose à définir est la liste des dépôts de paquets: où voulez-vous obtenir la liste de logiciels disponibles pour installation? lesquels installer par défaut?

C'est le rôle du gestionnaire de paquets, à savoir dans la Debian et ses dérivées la famille de logicielsapt: dpkg, apt-get, aptitude, ... et même si on avait une interface graphique (ce qui ne sera pas le cas pour mon serveur, pour une meilleure sécurité) synaptics.

Les dépôts se définissent dans le fichier /etc/apt/sources.list. Voici le mien:

 ## Daniel, 2007 07 30 
 ## Un sources.list classique, pour un vserver avec alternc
 
 deb http://security.debian.org/ stable/updates main
 
 deb http://ftp.fr.debian.org/debian/ etch main contrib non-free
 deb-src http://ftp.fr.debian.org/debian/ etch main contrb non-free
 
 deb http://ftp.fr.debian.org/debian/ stable main contrib non-free
 deb-src http://ftp.fr.debian.org/debian/ stable main contrb non-free
 
 deb http://ftp.fr.debian.org/debian/ unstable main contrib non-free
 deb-src http://ftp.fr.debian.org/debian/ unstable main contrb non-free
 
 deb http://ftp.fr.debian.org/debian/ testing main contrib non-free
 deb-src http://ftp.fr.debian.org/debian/ testing main contrb non-free
 
 ## pour bind-nocaps, car le bind de la distrib debian ne marche pas 
 ## sur des viservers.  
 
 deb http://debian.home-dn.net/etch bind-nocaps/
 deb-src http://debian.home-dn.net/etch bind-nocaps/
 
 ## et le grand AlternC
 #deb http://debian.alternc.org/ stable main contrib
 deb http://builder.koumbit.net/debian/ build main


Pour éditer un fichier, si vous avez pratiqué un peu Unix, vous utiliserez probablement vi ou emax, mais si vous débutez, vous préférerez sans doute un outil comme pico ou nano:

    laica:~# cd /etc/apt
    laica:/etc/apt# nano sources.list

Autre astuce linux au passage: quand tu tapes une commande ou les fichiers comme arguments d'une commande, ce n'est jamais la peine de el faire en entier: utilise la "complétion" avec la touche de tabulation. Par exemple pour la premier commande ci dessus, tape juste:

    laica:~#cd /e

puis avec une tabulation, le shell complétera à cd /etc/. tu vois? Oui... alors tu ajouteras juste un "a" puis tabulation, mais là... rien ne se passe :-( Pas de panique, c'est encore plus fort. tape de nouveau une tabulation et là, tu vois:

    laica:~# cd /etc/a
    adduser.conf  adjtime       aliases       alternatives  apm           apt           at.deny

Eh! oui! c'est parce qu'il y a plusieurs fichiers et sous-dossiers commençant par 'a', et le deuxième tab permet d'en voir la liste. Il te suffit alots de taper la deuxième lettre, (ici 'p'), et la tabulation ensuite complétera tout ce qu'elle peut sans ambiguité.

Il convient aussi, dans le fichier /etc/apt/apt.conf d'indiquer à apt de prendre par défaut les paquets de la distribution "stable" et de définir une taille de cache suffisante pour des installations complexes:

    APT::Cache-Limit 20000000;
    APT::Default-Release "stable";

Installation de quelques utilitaires complémentaires

Plutôt qu'avec apt-get, fainéant, je préfère gérer mes paquets avec aptitude, qui orffre une interface semi-graphique très agréable:

    laica:~#aptitude

Quelques commandes d'aptitude:

  • u: mettre à jour la liste de paquets disponibles dans les dépôts,
  • Enter: choisir une sélection,
  • /: rechercher un paquet,
  • +: marquer un paquet pour l'installation,
  • g: installer les paquets marqués pour install,
  • U: marquer poru installation tous les paquets de la distribution disponibles pour mise à jour,
  •  ?: aide, qui complétera cette liste.

Comme cela, j'ai installé quelques paquets que je trouve fort utiles, et qui ne sont pas dans la distribution de base:

  • host: un client DNS très simple,
  • less: une commande qui permet d'afficher à l'écran un fichier, plus pratique que cat ou que more,

Régulièrement il te faudra mettre à jour les logiciels sur ton serveur, ern particulier les mises à jours de sécurité. Pour cela: aptitude, u, U, g. Et c'est marre (sauf bugs, incompatibilités et régressions... mais avec une Débian stable, c'est très, très rare).


Internationalisation et localisation

A ce stade, mon installation était déjà en français. Ceci dit étaient encore en anglais certains messages système, certians écrand d'aide -- soit dit en passant, obtenu avec la "toute première" commande unix:

    laica:~/#man <commande>

ou avec la toute première option, par exemple avec la commande de commande:

   laica:~/#man <commande>
 root@laica:/etc# ifconfig --help
 Usage:
   ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]
   [add <adresse>[/<lg_prefixe>]]
   [del <adresse>[/<lg_prefixe>]]
   ...
   
   <HW>=Type de matériel.
   Liste des types de matériels possibles:
     loop (Boucle locale) slip (IP ligne série) cslip (IP ligne série - VJ )

En fait, par défaut dans l'installation de la Debian, avec son niveau de messages de configuration standard, l'outil d'installation debconf ne génère entièrement que la locale en anglais étasunien. Il faut lui demander explicitement qu'il génère d'autres locales.

Au cours de mon installation, en fait, j'ai oublié de faire cette opération et maintenant, à l'heure d'ajouter cette étape, j'ai obtenu un alternc en anglais uniquement. Je dois faire maintenant des tatonnements de reconfiguration pour revenir en multilingue, français par défaut. Je pense que si tu faites à ce stade les config ci-dessous, tu seras plus facilement dans ta/tes langues de prédilection.

   root@laica:/etc# dpkg-reconfigure locales

et vous choississez vos langues via debconf. Attention: Pour que la localisation d'AlternC (ou plus exactement l'affichage de messages textuels) fonctionne correctement, il vous faudra imérativement les locales ISO-8859-1. Les locales UTF-8 ou 8859-15 à elles seules ne seront pas suffisantes.

Installer et configurer un firewall

Un firewall est une logiciel, intimement lié au noyau linux, et plus spécifiquement à la gestion du réseau, qui permettra de filtrer à volonté et très finement tout ce qu'on accepte venant de l'extérieur et ce que l'on refuse, tout ce que l'on laisse partir de notre machine, et éventuellement ce qu'on transfère d'une interface à l'autre, si notr serveur fait routeur. Le logiciel de base d'un firewall pour pour linux est en général iptables.

vérifiez, avec aptitude ou avec at-get, qu'iptables est bien installé:

    laica:# apt-get install iptables
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances... Fait
    iptables est déjà la plus récente version disponible.
    0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.


Il vous faut établir les règles pour votre firewall. A savoir la codifier les règles de trafic réseau mentionnées ci dessus. C'est un sujet très vaste. Il y a ici un très bon tutoriel pour approfondir. Et ici un exemple basique pour des passerelles réseau. Et ici un exemple complet pour un serveur, dont je suis parti pour éablir le mien. Un de ces jours je traduis et j'épure un peu mon fichier de conf iptables pour le mettre en ligne.

Attention! Configure bien votre fichier de règles, car sinon vous pourrez perdre l'acès à votre serveur! Si c'est le cas, il vous faudra le redemarrer.

Une fois votre fichir de règles établi, exécutez-le:

  laica:~/fw# ./rc.ipatables.rules

Vous perdez probablement la connexion à votre serveur, car le firewall ne connaîtra pas l'établissement de votre session. Mais reconnectez-vous, si votre fichier est correct, vous re-gagnerez l'accès. Listez alors les règles:

laica:~/fw# iptables -v -L
Chain INPUT (policy DROP 1 packets, 52 bytes)
pkts bytes target     prot opt in     out     source               destination
   0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
   0     0 DROP       tcp  --  eth0   any     anywhere             anywhere            tcp flags:!SYN,RST,ACK/SYN state NEW
   0     0 DROP       all  --  eth0   any     sd-1058.dedibox.fr   anywhere
   0     0 DROP       all  --  eth0   any     10.0.0.0/8           anywhere
   0     0 DROP       all  --  eth0   any     172.16.0.0/12        anywhere
  ....


Mon but, sinon final, du moins pricipal, est d'installer un hébergement grâce au logiciel alternc. Comme vous avez vu, nous avons includ son dépôt dans le source.list.

Nous allons donc dans aptitude et cherchons le paquet alternc (taper / suivi de alternc). En tout théorie il nous suffirait de demander l'installation, et toutes les dépendances suivraient. Si vous êtes préssé vous pouvez le tenter. Mais personnellement, je préfère d'abord installer manuellement ses dépendances principales et terter individuellement qu'elles marchent. En particulier:

  • desinstaller exim et installer postfix pour le mail,
  • installer apache comme serveur web,
  • installer le serveur de bases de données mysql,
  • installer le serveur de noms de domaine bind,
  • installer PHP : mysql-php4 et e libapache-mod-php4
  • installer phpmyadmin, et vérifier,
  • installer squirrelmail
  • puis, tout marchant bien, au bout d'un moment j'installe alternc et toutes ses dépendances.


  • Installation de Postfix: déjà elle inclut pas mal de dépendances et rompt les dépendances d'autres agents de courriers SMTP (MTA), dont courrier-mta.
    • J'accepte le lien symbolique que me propose resolvconf, j'irai ensuite voir dans /etc/network/interfaces,... mais je ne vois pas bien ce qu'il faut ajouter. man interfaces ne mentionne rien pour les dns. resolvonf ne mentionne que les fichiers /etc/resolvonf/resolv.conf.d/
    • je configure Postfix comme un site internet (il sera connecté en permanence et sait faire du SMTP vers la totalité de l'internet,
    • je configure le nom canonique d'envoi à celui de mon serveur dans mon domaine (pas celui que me propose mon hébergeur),
    • j'ajoute mon domaine, belvil.net, à la liste des domaines acceptés (Pour l'instant, ce serveur n'étant pas listé dans les MX du domaine, on ne risque pas de m'écrire, sauf moi même, exprès, en le forçant. Ainsi je continue de recevoir mes mails dans mes serveurs haituels),
  • installer apache et apache-ssl comme serveur web:
    • j'aurais voulu installer apache 2 (j'aime sa manière de construire les conf, mais alternc requiert Apache 1.3, dommage)
    • je desactive suExec: pour le moment, il n'y a que moi qui installe des CGI. (Je n'en fais pas perso, je les installcomme des paquets Debian en root. Pas d'hébergé potentiel qui le requiert. Autant donc maximiser la sécurité pour ça).
    • je configure mon certificat racine du serveur SSL (belvil.eu, canton Belleville)
    • Depusi un navigateur sur ma station travail, je vois bien une page basique sur http://laica.belvil.net/
  • installer mysql-server
    • je tente la plus récente version de la sarge de mysql 4.1.x
    • mysql s'installe sans encombres, j'ai vérifié avec succès la bonne configuration du hostname (c'était plsu compliqué ésur un serveur virtuel...)
  • installer bind9: aucun problème!
 laica:~# netstat -lp
 Connexions Internet actives (seulement serveurs)
 Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
 tcp        0      0 localhost.localdo:mysql *:*                     LISTEN     11393/mysqld
 tcp        0      0 *:www                   *:*                     LISTEN     26668/apache
 tcp        0      0 localhost.locald:domain *:*                     LISTEN     12546/named
 tcp        0      0 sd-1058.dedibox.:domain *:*                     LISTEN     12546/named
 tcp        0      0 *:ssh                   *:*                     LISTEN     1069/sshd
 tcp        0      0 localhost.localdoma:953 *:*                     LISTEN     12546/named
 tcp        0      0 *:smtp                  *:*                     LISTEN     1399/master
 tcp        0      0 *:https                 *:*                     LISTEN     11748/apache-ssl
 udp        0      0 localhost.locald:domain *:*                                12546/named
 udp        0      0 sd-1058.dedibox.:domain *:*                                12546/named
 udp        0      0 *:33469                 *:*                                12546/named
 Sockets du domaine UNIX actives(seulement serveurs)
 Proto RefCpt Indicatrs   Type       Etat          I-Node PID/Program name    Chemin
 unix  2      [ ACC ]     STREAM     LISTENING     603574   15677/gcache        /var/run/gcache_port  
 unix  2      [ ACC ]     STREAM     LISTENING     606627   11393/mysqld        /var/run/mysqld/mysqld.sock
 unix  2      [ ACC ]     STREAM     LISTENING     597828   1399/master         public/cleanup
  • ah... je ne vois qu'un dictionnaire ispell (étasunien, en plus) il faudra que je fasse select-default-... et select-default-wordlist. mais il me prpose la même chose. Dans aptitude, je vais voir ispell et je vois qu'il recommande wordlist, qui est défini par langue. J'installe le français, le british et l'espagnol (là, c'est mon goût)

.

  • J'ai un bug à l'install de alternc : les dpkg lancés par aptitude donnent:
  Paramétrage de alternc (0.9.5) ...
  Updating /etc/alternc/local.sh
  checking for upgrades
  config phpmyadmin
  running alternc.install
  Setup MySQL and database...
  Setting AlternC alternc system table and privileges
  Installing AlternC schema
  Granting users
  MYSQL.SH OK!
  Restarting apache.
  Restarting apache-ssl.
  
  Fatal error: Call to undefined function:  mysql_connect() in /usr/lib/alternc/slave_dns on line 39
  dpkg : erreur de traitement de alternc (--configure) :
   le sous-processus post-installation script a retourné une erreur de sortie d'état 255
  Paramétrage de libdps1 (4.3.0.dfsg.1-14sarge1) ...

Bigbrother me donne la solution qui se trouve là: [1], dans le cryptique final:

  cat /etc/php4/cli/php.ini | grep mysql.so

On peut chercher ce fichier :

 laica:/etc/apt# locate mysql.so               // ne trouve rien la première fois,
 laica:/etc/apt# updatedb                      // mais je mets à jour les index du système,
 laica:/etc/apt# locate mysql.so               // et là je trouve:
 /usr/lib/perl5/auto/DBD/mysql/mysql.so
 /usr/lib/php4/20020429/mysql.so
 /usr/lib/postfix/dict_mysql.so

Dans /etc/php4/cli/php.ini, il faut décommenter la ligne:

  ; Example lines:
  extension=mysql.so
  ;extension=gd.so

Et là, un

  laica:#alternc.install

et tout marche bien. ... enfin, à tester... Je peux ensuite me connecter dans l'interface alternc au DNS défini.

Complément: Alternc sur une etch et/ou sur un vserver =

les paquets Alternc sont maintenant disponibles ici (ligne pour le sources.list):

 deb http://builder.koumbit.net/debian/ build main

Sur une distribution etch, il faut tuner un ou deux détails:

  • ca marche avec mysql5, mais il fuat laisser mysql san smot d epasse root le temps de l'installation (mais après il faut absolument en mettre un, car sinon toutes les bases mysql sont accessibles publiquement via phpmyadmin.
  • il manque un ou deux modules à apache et apache-ssl dans leur version de distribution pour faire fonctionnel AlternC. Voici la liste de mon /etc/apache/modules.conf:
LoadModule vhost_alias_module /usr/lib/apache/1.3/mod_vhost_alias.so
LoadModule config_log_module /usr/lib/apache/1.3/mod_log_config.so
LoadModule mime_magic_module /usr/lib/apache/1.3/mod_mime_magic.so
LoadModule mime_module /usr/lib/apache/1.3/mod_mime.so
LoadModule negotiation_module /usr/lib/apache/1.3/mod_negotiation.so
LoadModule status_module /usr/lib/apache/1.3/mod_status.so
LoadModule autoindex_module /usr/lib/apache/1.3/mod_autoindex.so
LoadModule dir_module /usr/lib/apache/1.3/mod_dir.so
LoadModule cgi_module /usr/lib/apache/1.3/mod_cgi.so
LoadModule userdir_module /usr/lib/apache/1.3/mod_userdir.so
LoadModule alias_module /usr/lib/apache/1.3/mod_alias.so
LoadModule rewrite_module /usr/lib/apache/1.3/mod_rewrite.so
LoadModule access_module /usr/lib/apache/1.3/mod_access.so
LoadModule auth_module /usr/lib/apache/1.3/mod_auth.so
LoadModule expires_module /usr/lib/apache/1.3/mod_expires.so
LoadModule setenvif_module /usr/lib/apache/1.3/mod_setenvif.so
LoadModule php5_module /usr/lib/apache/1.3/libphp5.so
LoadModule gzip_module /usr/lib/apache/1.3/mod_gzip.so

pour les activer, ne pas modifier le fichier directement, mais comme indiqué dans l'entête lancer: apache-modeconf apache enable <module>.

Quelques ajustements

Bien évidemmment tout ne marche pas parfaitement. J'ai dû mofifier quelques fichiers de configuration. Avec alternc, il ne faut pas modifier directement les ficheirs de configuration de certains paquets (apache, bind, ...) dans etc/ mais changes les modèles par lesquels les remplace alternc, qui sont dans: /etc/alternc/templates

  • changer légèrement la configuration de bind pour que la résolution de noms fonctionne bien:

Dans /etc/alternc/templates/bind/named j'ai décommenté les lignes:

       forwarders {
               88.191.254.60;
               88.191.254.70;
       };

en ajoutant les serveurs de nom de mon hébergeur, et commenté la ligne:

      //      recursion no;

Ceci est dû au fait que dans mon fichier de règles de firewall, on n'autorise les requêtes DNS que vers ces deux serveurs.

 root@laica:/etc# /etc/init.d/apache-ssl restart
 Restarting apache-sslstart-stop-daemon: warning: failed to kill 19791: No such process

Mais au deuxième essai:

 root@laica:/etc# /etc/init.d/apache-ssl restart
 Restarting apache-ssl.

et j'ai bien une page sécurisée à l'adresse du bureau alternc.

Synchronisation du temps

Mon horloge n'est pas vraiment à l'heure, j'installe le paquet ntp. Seule configuration, dans /etc/ntp.conf j'ajoute les lignes:

  server fr.pool.ntp.org
  server fr.pool.ntp.org
  server fr.pool.ntp.org

Oui, trois fois la même ligne, car ce domaine donnera au hasard trois fois trois serveurs différents avec lesquels se synchroniser au mieux.


Service SMTP sur SSL authentifié

Un service qui ne marche pas correctement à l'installation est le SMTP sur SSL. En fait, il s'agit du demon saslauthd, qui assure l'authentification IMAP (issue de courier) pour le service SMTP (dans postfix).

Deux choses à corriger:

  • Il manque simplement le sous-répertoire accessible par postfix et par sasl dans lequel gérer les sockets. Afin d'y pallier, il faut exécuter:
cd /var/spool/postfix/
mkdir var
mkdir var/run
mkdir var/run/saslauthd 
chown -R root:sasl /var/spool/postfix/var/

  • dans le fichier /etc/alternc/templates/default/saslauthd, il faut remplacer la variable obsolète PARAM par OPTIONS. Ce fichier devra donc contenir:
# %%warning_message%%

START=yes
MECHANISMS="rimap"
PWDIR=/var/spool/postfix/var/run/saslauthd
PIDFILE="${PWDIR}/saslauthd.pid"
OPTIONS="-r -m /var/spool/postfix/var/run/saslauthd -O localhost -c"