• Menu
  • Administration serveur
  • Wordpress
  • E-commerce
  • Outils OpenSource
  • A propos
  • Skip to main content

Le Web d'Antoine

Administration serveur - Wordpress - ecommerce

Debian-serveur-escalier

Configuration de base d’un serveur sous Debian

Mettre en place les bases d’un serveur est toujours une étape délicate pour le novice. Au cours de ce tutoriel, nous allons ensemble configurer les différents services indispensables pour prendre un bon départ afin de se lancer dans l’aventure de l’administration serveur. Je m’appuierai sur la distribution Gnu/Linux Debian version Jessie sur un serveur de type VPS (serveur privé virtuel).

Avant de se lancer tête baissée dans l’édition des fichiers de configuration, il est important de se rappeler que votre serveur se doit au final être au minimum sécurisé et capable de vous envoyer des infos de fonctionnement (ou dysfonctionnement 🙂 ) sur votre boite courriel. Pour cela nous configurerons de manière simple le firewall netfilter via iptables, et Exim en tant que serveur smtp pour les mails sortants.

Configuration des services de bases

Utilisateur et sudo

La plupart du temps votre fournisseur de VPS va vous attribuer un accès root, dans ce cas la première chose à faire c’est changer le mot de passe root

root@lewebdantoine:~$ passwd

Changement du mot de passe pour root.
Mot de passe UNIX (actuel) :
Entrez le nouveau mot de passe UNIX :

La distribution installée sur votre VPS n’est certainement pas à jour, c’est une des premières failles de sécurité, toujours mettre à jour sa distribution. Pour être au fait des mises à jour de sécurité Debian, il suffit de s’abonner à leur flux rss sur la page dédiée à la sécurité.

root@lewebdantoine:~$ apt-get update && apt-get upgrade

Du fait que nous allons interdire le connexion ssh avec root, il va falloir créer un utilisateur qui nous permettra d’effectuer les tâches d’administration, et pour lequel nous devrons lui attribuer la possibilité d’exécuter une tâche en tant que superutilisateur.

root@lewebdantoine:~$ adduser antoine
Ajout de l'utilisateur « antoine » ...
Ajout du nouveau groupe « antoine » (1001) ...
Ajout du nouvel utilisateur « antoine » (1001) avec le groupe « antoine » ...
Création du répertoire personnel « /home/antoine »...
Copie des fichiers depuis « /etc/skel »...
Entrez le nouveau mot de passe UNIX : 
Retapez le nouveau mot de passe UNIX : 
passwd : le mot de passe a été mis à jour avec succès
Modification des informations relatives à l'utilisateur antoine
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
  Nom complet []: 
  N° de bureau []: 
  Téléphone professionnel []: 
  Téléphone personnel []: 
  Autre []: 
Cette information est-elle correcte ? [O/n]

Selon le prestataire, la distribution Debian installée sur le VPS n’a pas sudo installé, on peut le vérifier avec la commande suivante :

root@lewebdantoine:~$ dpkg --status sudo
Package: sudo
Status: install ok installed
Priority: optional
...

Dans ce cas sudo est installé mais s’il ne l’est pas il suffit de lancer la commande suivante :

root@lewebdantoine:~$ apt-get install sudo

Nous allons à présent configurer le fichier sudoers afin d’y ajouter l’utilisateur antoine et changer le timeout du sudo. Pour modifier ce fichier il est préconiser de le faire en root et avec visudo

root@lewebdantoine:~$ visudo -f /etc/sudoers

 

antoine ALL=(ALL)ALL
Defaults timestamp_timeout=2 # (pour 2min)

A partir de ce moment on peut administrer le serveur avec l’utilisateur nouvellement créé : on se déconnecte puis se reconnecte avec l’utilisateur (e.g antoine) et ses clé ssh.

Connexion à votre serveur par clés ssh

Pour cette partie, vous pouvez vous référer à la gestion des clés ssh sous Debian. Ainsi, il vous faudra générer les clés ssh pour votre utilisateur créé ci-dessus uniquement et surtout pas pour root. Pour une bonne sécurité, il est possible de ne plus utiliser le mot de passe de connexion hormis la passphrase associée à votre clé ssh, mais faites attention de ne pas égarer votre clé privée et/ou votre passphrase.

Vim l’éditeur de texte

Comme nous allons effectuer de nombreuses éditions de fichiers il est nécessaire d’installer un éditeur de texte, j’ai une préférence pour vim. Après son installation, il faut activer la coloration syntaxique de cet éditeur.

antoine@lewebdantoine:~$sudo vi /usr/share/vim/vimrc

Dans ce fichier de configuration il faut décommenter

set nocompatible
syntax on

et ajouter

set number
set smartindent

Quelques commandes rapides pour travailler avec vim :

antoine@lewebdantoine:~$sudo vi fichier_a_editer

i : permet l’insertion de texte, on peut se déplacer avec les flèches.

:10 : le curseur se déplace à la ligne numéro 10

:10d : supprime la ligne numéro 10

$ : déplace le curseur à la fin de la ligne

0 : déplace le curseur au début de la ligne

/texteàchercher : chaine à chercher dans le fichier, en appuyant sur n on passe à l’occurrence suivante

:w : sauvegarde des modifications apportées au fichier

:wq! : sauvegarde du fichier et fermeture de l’éditeur

Modifications des paramètres du serveur ssh

Cette partie n’est pas à négliger car ces modifications vont nous permettre de faire les réglages nécessaires à l’emploi exclusif des clés ssh lors de la connexion, interdire la connexion au serveur avec root et changer le port ssh.

Faisons au préalable une sauvegarde du fichier sshd_config

antoine@lewebdantoine:~$sudo cp /etc/ssh/sshd_config	/etc/ssh/sshd_config.bak

antoine@lewebdantoine:~$sudo vi /etc/ssh/sshd_config

Voici ce que je vous propose de modifier :

Port XXXX		#Changer le port ssh qui par défaut est 22
AllowUsers utilisateur	#L'utilisateur peut utiliser ssh

Logingracetime 60	#Temps permettant à  l'utilisateur de se connecter au serveur
PermitRootLogin no	#On interdit le login en superutilisateur root
xX11Forwarding no 	#On ne veux pas utiliser le serveur X (graphique)
PrintMotd yes		#Activation de la bannière d'accueil
PrintLastLog yes	#Affichage des détails de la dernière connection

ClientAliveInterval 60	#Test de la connexion toute les 30 secondes
ClientAliveCountMax 5	#Nombre de tentative de connection avant deconnexion
TCPKeepAlive yes		#Test si la connexion est toujours valide

PasswordAuthentication no
UsePAM	no

Redémarrage du serveur ssh

antoine@lewebdantoine:~$sudo /etc/init.d/ssh restart

Paramétrages régionaux

Nous allons paramétrer la langue et le fuseau horaire.

antoine@lewebdantoine:~$sudo dpkg-reconfigure locales

Sélectionner le jeux de paramètres fr_FR.UTF-8 UTF-8 puis confirmer.

Votre serveur doit vraiment être à l’heure de la région où vous décidez de déployer votre site web ou autre application, ne serait-ce dans un premier temps pour vos futures tâches cron.

antoine@lewebdantoine:~$sudo dpkg-reconfigure tzdata

Sélectionner Europe puis Paris.

Désactivation de l’ipv6

Il n’est pas obligatoire de désactiver l’ipv6, dans notre cas il est plus simple de faire sans, sachant que certains fournisseurs d’accès internet n’ont pas encore activé la gestion de l’ipv6 dans leur box, donc le navigateur qui accédera à votre future site web utilisera l’ipv4.

Nous allons éditer le fichier sysctl.conf

antoine@lewebdantoine:~$sudo vi /etc/sysctl.conf

et l’on ajoute :

# on désactive l'ipv6 pour l'ensemble des interfaces

  net.ipv6.conf.all.disable_ipv6 = 1

# on désactive l'auto-configuration de l'ipv6 sur l'ensemble des interfaces

  net.ipv6.conf.all.autoconf = 0

# Si une nouvelle interface est ajoutée l'ipv6 est désactivée

  net.ipv6.conf.default.disable_ipv6 = 1

# l'auto-configuration des nouvelles interfaces est désactivée pour l'ipv6

  net.ipv6.conf.default.autoconf = 0

A ce stade nous allons redémarrer le serveur qui s’effectue la plupart du temps via l’interface de configuration chez votre fournisseur de vps.

Mise en place du firewall grâce à iptables

Nous allons mettre en place quelques règles netfilter qui nous permettrons de n’ouvrir que les ports nécessaires à notre configuration. Ce firewall est basique et ne fait que ce que l’on lui demande : autoriser ou non le passage des paquets au travers les ports. Pour filtrer les requêtes liées à votre site web vous devrez installer un waf (web application firewall) comme par exemple modsecurity, ou si votre site est propulsé par wordpress  vous pouvez essayer Ninjafirewall.

Tout d’abord nos règles de filtrages ne concerneront que l’ipv4 car nous avons préalablement désactivés la gestion de l’ipv6. Si vous souhaitez travailler avec l’ipv6 les règles commenceront par ip6tables. N’oubliez pas que vous devrez écrire une règle pour ipv4 et une pour ipv6.

Un peu de vocabulaire …

Trois tables sont utilisées couramment : NAT, FILTER et MANGLE. C’est la table FILTER qui nous intéressera ici, celle-ci permet l’usage de trois chaînes prédéfinies :

  • INPUT : chaîne pour les paquets entrants
  • OUTPUT : chaîne pour les paquets sortants
  • FOWARD : chaîne routant les paquets à travers le système

-t : défini la table sur laquelle on travaille, par défaut il s’agit de FILTER

ex : iptables -t mangle -F (toutes les chaînes de la table mangle sont effacées)

-X : efface une chaîne

-F : efface toutes les chaînes d’une tables si aucune chaîne n’est spécifiée

-P : change la règle par défaut pour une chaîne prédéfinie

ex : iptables -P INPUT DROP (aucun paquet n’entre)

-A : ajoute une règle à la fin de la chaîne

ex : iptables -A INPUT …

-m : correspond à (match)

–state : spécifie l’état du paquet à associer avec par exemple les états ESTABLISHED, RELATED

-j : aller vers la cible après vérification d’une règle associée une chaine :

  • DROP : rejet d’un paquet sans spécifier un message d’erreur à l’expéditeur
  • REJECT : rejet d’un paquet en spécifiant un message d’erreur à l’expéditeur
  • ACCEPT: accepte un paquet

-p : permet de spécifier le protocole pour lequel une règle doit s’appliquer

–dport : spécifie le port de destination

Le script que nous allons écrire va nous permettre d’effectuer plusieurs actions : la première étant d’activer le firewall au démarrage du serveur, la deuxième de l’arrêter et la troisième de le redémarrer. Dans notre cas nous allons tout bloquer puis ouvrir les ports nécessaires au bon fonctionnement du serveur.

L’entête du script bash donne les instructions nécessaires à l’activation du firewall au démarrage du serveur:

#!/bin/bash

### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Démarre les règles iptables
# Description:       Charge la configuration du firewall iptables
### END INIT INFO

Ensuite on place dans la variable ipt le chemin permettant l’exécution de la commande iptables

ipt=/sbin/iptables

S’ensuit la fonction do_start() dans laquelle nous allons :

  • Réinitialiser tous les filtres
  • Fermer tous les ports
  • Établir les règles de filtrages
do_start() {

  #Toutes les règles iptables présentes sont effacées
  
  $ipt -t filter -F
  $ipt -t filter -X
  $ipt -t nat -F
  $ipt -t nat -X
  $ipt -t mangle -F
  $ipt -t mangle -X
  
  #Tous les paquets sont bloqués
  
  $ipt -P INPUT DROP
  $ipt -P OUTPUT DROP
  $ipt -P FORWARD DROP
  
  #Les paquets des connexions déjà établies sont autorisés à passer
  
  $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  $ipt -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  
  #Les paquets à destination/provenance de la boucle locale sont autorisés
  
  $ipt -A INPUT -i lo -j ACCEPT
  $ipt -A OUTPUT -o lo -j ACCEPT
  
  #Les paquets transitants par icmp sont autorisés
  
  $ipt -A INPUT -p icmp -j ACCEPT
  $ipt -A OUTPUT -p icmp -j ACCEPT
  
  #Les paquets SSH sur le port xxxx sont autorisés
  
  $ipt -A INPUT -p tcp --dport xxxx -j ACCEPT
  $ipt -A OUTPUT -p tcp --dport xxxx -j ACCEPT
  
  #les paquets passant via le DNS (domaine) sont acceptés
  
  $ipt -A INPUT -p tcp --dport 53 -j ACCEPT
  $ipt -A OUTPUT -p tcp --dport 53 -j ACCEPT
  $ipt -A INPUT -p udp --dport 53 -j ACCEPT
  $ipt -A OUTPUT -p udp --dport 53 -j ACCEPT
  
  #Les paquets transitants par le port 25 (smtp) sont autorisés
  
  $ipt -A OUTPUT -p tcp --dport 25 -j ACCEPT
  
  #Les paquets transitants par le port 443 sont autorisés
  
  $ipt -A INPUT -p tcp --dport 443 -j ACCEPT
  $ipt -A OUTPUT -p tcp --dport 443 -j ACCEPT
  
  #Les paquets http sur le port 80 sont autorisés
  
  $ipt -A INPUT -p tcp --dport 80 -j ACCEPT
  $ipt -A OUTPUT -p tcp --dport 80 -j ACCEPT
  
  #Lutter contre l'inondation de connexions (SYN-FLOOD)
  
  $ipt -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
  
  #Lutter contre le balayage furtif des ports
  
  $ipt -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
  
  #Lutter contre l'UDP flood
  
  $ipt -A INPUT -p udp -m limit --limit 1/s -j ACCEPT

}

Si l’on souhaite arrêter le firewall il va falloir créer une fonction dédiée à cet effet. Dans ce cas celui-ci sera réinitialisé avec les paramètres par défaut.

do_stop() {
  
  $ipt -t filter -F
  $ipt -t filter -X
  $ipt -t nat -F
  $ipt -t nat -X
  $ipt -t mangle -F
  $ipt -t mangle -X
  
  $ipt -t filter -P INPUT ACCEPT
  $ipt -t filter -P OUTPUT ACCEPT
  $ipt -t filter -P FORWARD ACCEPT
  
}

Pour finir nous allons mettre en place les trois actions start|stop|restart grâce à la commande case bien pratique ici car très lisible.

case "$1" in
    start)
        do_start

        exit 0 
    ;;

    stop)
        do_stop

        exit 0
    ;;

    restart)
        do_stop
        do_start

        exit 0
    ;;

    *)
        # Si "start"ou "stop" ne sont pas entrés nous générerons une erreur
        echo "Vous devez utilisez: /etc/init.d/firewall {start|stop|restart}"
        
        exit 1
    ;;

esac

Il vous suffit maintenant de concaténer les trois morceaux de script dans un fichier que vous pouvez appeler firewall avec l’extention .sh (firewall.sh), puis le copier dans le dossier /etc/init.d/ .Il faudra également le rendre exécutable avec la commande suivante :

antoine@lewebdantoine:~$sudo chmod +x firewall.sh

Pour être sûr que votre soit actif au démarrage vous devrez exécuter cette commande :

antoine@lewebdantoine:~$sudo update-rc.d firewall.sh defaults

Si toutefois vous souhaitez plus que celui-ci se charge au démarrage de votre serveur:

antoine@lewebdantoine:~$sudo update-rc.d -f firewall.sh remove

Ce script est pratique lorsque vous souhaitez modifier ou créer une règle, pour que celle-ci soit effective il suffit de redémarrer votre parefeu avec la commande suivante

antoine@lewebdantoine:~$sudo /etc/init.d/firewall restart

Configuration du serveur mail avec Exim (courriels sortants)

Recevoir des informations de fonctionnement de votre serveur est capital pour sa maintenance préventive et d’urgence. En effet, il existe de nombreux outils qui seront capables de vous alerter par mail lorsqu’un service s’arrêtera de fonctionner (e.g monit), de vous envoyer une synthèse des logs (logwatch) ou bien de vous informer si un fichier à été modifié (tripwire). Afin que toutes ces informations remontent à vous, il vous faut un serveur mail, et c’est avec Exim que nous allons envoyer nos courriels.

Définir un Fully Qualified Domain Name (FQDN)

Le FQDN est essentiel au DNS et donc au bon routage de vos mails, sans lui il vous sera bien compliqué d’envoyer vos courriels. Pour créer celui-ci nous allons éditer deux fichiers.

Nous allons dans un premier temps changer (ou non) le hostname :

antoine@lewebdantoine:~$sudo vi /etc/hostname

Puis entrez le hostname que vous souhaitez, dans les exemples de cet article il s’agit de lewebdantoine.

Ensuite en édite le fichier host :

antoine@lewebdantoine:~$sudo vi /etc/hosts

Dans lequel nous allons écrire :

127.0.0.1   localhost.localdomain localhost
127.0.1.1   hostname.votredomaine.tld hostname
IP_serveur hostname.votredomaine.tld hostname

Si l’on prend l’exemple du webdantoine

127.0.0.1   localhost.localdomain localhost
127.0.1.1   lewebdantoine.lewebdantoine.fr lewebdantoine
IP_serveur lewebdantoine.lewebdantoine.fr lewebdantoine

Il convient d’effectuer un redémarrage du serveur afin que le FQDN soit pris en compte.

Configurer Exim

Nous allons à présent configurer exim en serveur smtp. Pour cela on installe le paquet requis puis on lance la configuration de exim.

antoine@lewebdantoine:~$sudo apt-get install exim4-daemon-light
antoine@lewebdantoine:~$sudo dpkg-reconfigure exim4-config

# Configuration de exim en 'Distribution directe par smtp : internet site'

# Nom de courrier du système :
hostname.domaine.tld (c'est votre FQDN)


# Liste d'adresses IP où Exim sera en attente de connexions SMTP entrantes :
127.0.0.1

# Autres destinations dont le courrier doit être accepté :
vide

# Domaines à relayer :
vide

# Machines à relayer :
vide

# Faut-il minimiser les requêtes DNS (connexions à la demande) ?
non

# Méthode de distribution du courrier local :
Format « mbox » dans /var/mail

# Faut-il séparer la configuration dans plusieurs fichiers ?
non

Si vous ne souhaitez pas avoir un paniclog  il vous faudra désactiver l’usage de l’ipv6 par exim en ajoutant ceci :

antoine@lewebdantoine:~$sudo vi /etc/exim4/update-exim4.conf.conf

disable_ipv6='true'

Effectuons un redémarrage d’exim :

antoine@lewebdantoine:~$sudo /etc/init.d/exim4 restart

Puis on fait un test pour confirmer le bon envoi des mails depuis votre serveur

antoine@lewebdantoine:~$ echo "Mail envoyé le $(date)" | mail -s "Test envoi de mail depuis $HOST" votreadressemail

 Analyse quotidienne des logs avec Logwatch

Lorsqu’un service plante ou que votre serveur s’arrête sans raison apparente, il est nécessaire de regarder du côté des logs. C’est grâce à ces fichiers de journalisation que vous allez pouvoir accéder à la cause de votre problème, ce sont eux également qui donneront de précieuses information sur l’évolution de votre serveur.

Installons Logwatch

antoine@lewebdantoine:~$sudo apt-get install logwatch

Puis éditons son fichier de configuration :

antoine@lewebdantoine:~$sudo vi /usr/share/logwatch/default.conf/logwatch.conf


MailTo = root

Range = yesterday

Detail = High

Service = exim

Service = secure

Service = sudo

Les services vont vous permettre de choisir les logs qui vous seront envoyés par mails, rassurez-vous Logwatch ne va pas vous envoyer l’ensemble des logs par mails mais une synthèse de ceux-ci.

Les mails sont envoyés à root, mais root n’a pas de boite mail définie sur votre serveur, il va donc falloir lui adjoindre une adresse mail en créant un ‘alias’. Évitez gmail et consort pour des raisons de confidentialité.

antoine@lewebdantoine:~$sudo vi /etc/aliases

root: votreadressemail

On peut tester le bon fonctionnement de logwatch en executant la commande suivante

antoine@lewebdantoine:~$sudo logwatch --range=Today --output mail

Si vous ne recevez pas votre rapport quotidien dans votre boite mail vous pouvez vérifier si la tâche cron est bien place :

antoine@lewebdantoine:~$ cd /etc/cron.daily/

antoine@lewebdantoine:~$ sudo vi 00logwatch

/usr/sbin/logwatch --output mail

Une fin marquant le commencement de votre aventure

Vous voilà fin prêt à débuter l’aventure de l’administration serveur, tout ce qui a été décrit ci-dessus est une manière parmi d’autres d’installer les premiers services sur votre serveur. Avec l’expérience que vous acquerrez, vous adapterez sans nul doute cette méthode à vos propres exigences.

N’ayant pas la science infuse et cet article étant perfectible, n’hésitez pas à me faire part de vos remarques et suggestions.

 

Article rédigé et publié par Antoine le 16 mars 2016

 

 

Antoine Bussière - 2015 - Tous droits réservés