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
le