Outils pour utilisateurs

Outils du site


server:installation

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Dernière révision Les deux révisions suivantes
server:installation [2019/05/04 21:56]
kevin
server:installation [2019/05/12 18:10]
kevin [HTTPS]
Ligne 1: Ligne 1:
-===== À faire ===== +====== Installation et configuration d'un serveur Debian ======
-  * Installer Apache +
-  * Installer MySQL +
-  * Installer PHP +
-  * Installer pare-feu (iptable ? fail2ban ?)+
  
 ===== Préparation du disque d'installation ===== ===== Préparation du disque d'installation =====
Ligne 22: Ligne 18:
  
 Personnalisations : Personnalisations :
- +  * Ne pas forcer l'installation UEFI. 
-Ne pas forcer l'installation UEFI. +  Schéma de partitionnement du disque : ''separate /home, /var, and /tmp partitions'' et garder les valeurs proposées.
- +
-Schéma de partitionnement du disque : separate /home, /var, and /tmp partitions et garder les valeurs proposées.+
  
 ===== Installer sudo ===== ===== Installer sudo =====
Ligne 40: Ligne 34:
 sudo nano /etc/network/interfaces sudo nano /etc/network/interfaces
 </code> </code>
-<code>+<file bash>
 # This file describes the network interfaces available on your system # This file describes the network interfaces available on your system
 # and how to activate them. For more information, see interfaces(5). # and how to activate them. For more information, see interfaces(5).
Ligne 56: Ligne 50:
         netmask 255.255.255.0         netmask 255.255.255.0
         gateway 192.168.1.1         gateway 192.168.1.1
-</code>+</file>
  
 Redémarrer le service réseau : Redémarrer le service réseau :
Ligne 68: Ligne 62:
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-ifup ou reboot+Si l'interface n'est pas définie en ''auto'', alors il sera nécessaire de la remonter manuellement avec la commande ''ifup'' ou en redémarrant la machine.
 </WRAP> </WRAP>
  
Ligne 76: Ligne 70:
   * https://wiki.debian.org/fr/NetworkConfiguration   * https://wiki.debian.org/fr/NetworkConfiguration
  
-===== Liens utiles =====+===== Configurer SSH ===== 
 +Éditer le fichier ''/etc/ssh/sshd_config''
 +<code bash> 
 +sudo nano /etc/ssh/sshd_config 
 +</code> 
 + 
 +Interdire la connexion de l'utilisateur ''root'' et n'autoriser que l'utilisateur ''toto'' à se connecter : 
 +<file bash> 
 +PermitRootLogin no 
 +AllowUsers toto 
 +</file> 
 + 
 +Redémarrer le service SSH : 
 +<code bash> 
 +sudo service ssh restart 
 +</code> 
 + 
 +<WRAP center round tip 60%> 
 +Il peut être utile de consulter les logs de temps en temps (en particulier les accès ayant échoué) : 
 +<code bash> 
 +sudo cat /var/log/auth.log | grep Invalid 
 +</code> 
 +</WRAP> 
 + 
 +==== Sources ==== 
 +  * https://debian-facile.org/doc:reseau:ssh:serveur 
 +  * https://guide.ubuntu-fr.org/server/openssh-server.html 
 +  * https://help.ubuntu.com/community/SSH/OpenSSH/Configuring 
 + 
 +===== Configurer le pare-feu ===== 
 +Afficher les règles de filtrage en IPv4 : 
 +<code bash> 
 +sudo iptables -L 
 +</code> 
 + 
 +Garder les règles après un reboot : 
 +<code bash> 
 +sudo apt-get install iptables-persistent 
 +</code> 
 + 
 +Répondre oui pour la sauvegarde des règles actuelles. 
 + 
 +Il y a à présent deux fichiers de configuration à éditer pour configurer le pare-feu : 
 +  * ''/etc/iptables/rules.v4'' pour IPv4 
 +  * ''/etc/iptables/rules.v6'' pour IPv6 
 + 
 +On édite la configuration pour IPv4 : 
 +<code bash> 
 +sudo nano /etc/iptables/rules.v4 
 +</code> 
 + 
 +Contenu par défaut : 
 +<file bash rules.v4> 
 +# Generated by iptables-save v1.6.0 on Sun May  5 09:35:53 2019 
 +*filter 
 +:INPUT ACCEPT [0:0] 
 +:FORWARD ACCEPT [0:0] 
 +:OUTPUT ACCEPT [0:0] 
 +COMMIT 
 +# Completed on Sun May  5 09:35:53 2019 
 +</file> 
 + 
 +Tout est autorisé par défaut. 
 + 
 +J'ai suivi les indications données dans le [[https://www.geek17.com/fr/content/debian-9-stretch-securiser-votre-serveur-avec-le-firewall-iptables-32|tuto]], donc : 
 +  * Le trafic transfert (FORWARD) est bloqué 
 +  * Le trafic sortant est non filtré 
 +  * Le trafic entrant est bloqué, sauf ce qui nous intéresse 
 + 
 +<file bash rules.v4> 
 +# Generated by iptables-save v1.6.0 on Sun May  5 09:35:53 2019 
 +*filter 
 +:INPUT DROP [0:0] 
 +:FORWARD DROP [0:0] 
 +:OUTPUT ACCEPT [0:0] 
 + 
 +# Allow internal traffic on the loopback device 
 +-A INPUT -i lo -j ACCEPT 
 + 
 +# Continue connections that are already established or related to an established connection 
 +-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 
 + 
 +# Drop non-conforming packets, such as malformed headers, etc. 
 +-A INPUT -m conntrack --ctstate INVALID -j DROP 
 + 
 +# Accept SSH 
 +-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 
 + 
 +# Chain for preventing ping flooding - up to 6 pings per second from a single 
 +# source, again with log limiting. Also prevents us from ICMP REPLY flooding 
 +# some victim when replying to ICMP ECHO from a spoofed source. 
 +-N ICMPFLOOD 
 +-A ICMPFLOOD -m recent --name ICMP --set --rsource 
 +-A ICMPFLOOD -m recent --name ICMP --update --seconds 1 --hitcount 6 --rsource --rttl -m limit --limit 1/sec --limit-burst 1 -j LOG --log-prefix "iptables[ICMP-flood]:
 +-A ICMPFLOOD -m recent --name ICMP --update --seconds 1 --hitcount 6 --rsource --rttl -j DROP 
 +-A ICMPFLOOD -j ACCEPT 
 + 
 +# Permit useful IMCP packet types. 
 +# Note: RFC 792 states that all hosts MUST respond to ICMP ECHO requests. 
 +# Blocking these can make diagnosing of even simple faults much more tricky. 
 +# Real security lies in locking down and hardening all services, not by hiding. 
 +-A INPUT -p icmp --icmp-type 0  -m conntrack --ctstate NEW -j ACCEPT 
 +-A INPUT -p icmp --icmp-type 3  -m conntrack --ctstate NEW -j ACCEPT 
 +-A INPUT -p icmp --icmp-type 8  -m conntrack --ctstate NEW -j ICMPFLOOD 
 +-A INPUT -p icmp --icmp-type 11 -m conntrack --ctstate NEW -j ACCEPT 
 + 
 +# Drop all incoming malformed NULL packets 
 +-A INPUT -p tcp --tcp-flags ALL NONE -j DROP 
 + 
 +# Drop syn-flood attack packets 
 +-A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP 
 + 
 +# Drop incoming malformed XMAS packets 
 +-A INPUT -p tcp --tcp-flags ALL ALL -j DROP 
 + 
 +COMMIT 
 +# Completed on Sun May  5 09:35:53 2019 
 +</file> 
 + 
 +Redémarrer le service pour recharger et appliquer les règles : 
 +<code bash> 
 +sudo service netfilter-persistent restart 
 +</code> 
 + 
 +==== Sources ==== 
 +  * https://www.geek17.com/fr/content/debian-9-stretch-securiser-votre-serveur-avec-le-firewall-iptables-32 
 +  * https://debian-facile.org/doc:reseau:iptables-pare-feu-pour-un-client 
 +  * https://debian-facile.org/doc:reseau:iptables-pare-feu-pour-une-passerelle 
 +  * https://wiki.debian.org/DebianFirewall 
 +  * https://wiki.debian.org/iptables 
 +  * https://wiki.debian-fr.xyz/Netfilter/Iptables_introduction 
 +  * https://doc.ubuntu-fr.org/iptables 
 + 
 +===== Installer et configurer fail2ban ===== 
 +<code bash> 
 +sudo apt install fail2ban 
 +</code> 
 + 
 +Le fichier ''/etc/fail2ban/jail.conf'' contient l'ensemble des plugins qu'il est possible d'activer pour protéger les services de la machine. 
 + 
 +Cependant, il ne **pas** modifier ce fichier directement, car il pourrait être remplacé lors d'une mise à jour du système ! Celui-ci doit servir de référence et de documentation. 
 + 
 +À la place, il faut modifier le fichier ''/etc/fail2ban/jail.d/defaults-debian.conf'' (ou créer un autre fichier dans ce répertoire) : 
 +<code bash> 
 +sudo nano /etc/fail2ban/jail.d/defaults-debian.conf 
 +</code> 
 +<file bash> 
 +[sshd] 
 +enabled = true 
 +</file> 
 + 
 +On constate donc que le service SSH est déjà protégé par défaut. 
 + 
 +Redéfinir globalement le temps du bannissement (10 minutes par défaut), le temps depuis lequel une anomalie est recherchée dans les logs (10 minutes par défaut) et les adresses IP à ignorer (ici, tout le réseau local) : 
 +<file bash> 
 +[sshd] 
 +enabled = true 
 + 
 +[DEFAULT] 
 +# "bantime" is the number of seconds that a host is banned. 
 +bantime  = 3600 
 + 
 +# A host is banned if it has generated "maxretry" during the last "findtime" 
 +# seconds. 
 +findtime = 3600 
 + 
 +# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not 
 +# ban a host which matches an address in this list. Several addresses can be 
 +# defined using space (and/or comma) separator. 
 +ignoreip = 127.0.0.1/8 192.168.0.1/24 
 +</file> 
 + 
 +Redémarrer le service : 
 +<code bash> 
 +sudo service fail2ban restart 
 +</code> 
 + 
 +==== Commandes utiles ==== 
 + 
 +Consulter les logs : 
 +<code bash> 
 +sudo nano /var/log/fail2ban.log 
 +</code> 
 +ou 
 +<code bash> 
 +sudo tail -f /var/log/fail2ban.log 
 +</code> 
 + 
 +Voir le status du jail ''sshd'' (avec la liste des adresses IP bannies) : 
 +<code bash> 
 +sudo fail2ban-client status sshd 
 +</code> 
 + 
 +Débannir une adresse IP du jail ''sshd'' (//pas testé//) : 
 +<code bash> 
 +sudo fail2ban-client set sshd unbanip 1.2.3.4 
 +</code> 
 + 
 +==== Sources ==== 
 +  * https://www.geek17.com/fr/content/debian-9-stretch-securiser-votre-serveur-avec-fail2ban-31 
 +  * https://sebsauvage.net/wiki/doku.php?id=mint_customization_17_3#autres 
 +  * https://doc.ubuntu-fr.org/fail2ban 
 + 
 +===== Installer et configurer ddclient ===== 
 +''ddclient'' est un client dynamic DNS. 
 + 
 +Installer ''ddclient''
 +<code bash> 
 +sudo apt install ddclient 
 +</code> 
 + 
 +Éditer le fichier de configuration : 
 +<code bash> 
 +sudo nano /etc/ddclient.conf 
 +</code> 
 + 
 +<file bash> 
 +# Configuration file for ddclient generated by debconf 
 +
 +# /etc/ddclient.conf 
 + 
 +syslog=yes 
 +#verbose=yes 
 +daemon=21600 
 +ssl=yes 
 +protocol=dyndns2 
 +use=web 
 +server=www.ovh.com 
 +login=mondomaine.net-login 
 +password='password' 
 +dyn.mondomaine.net 
 +</file> 
 + 
 +<WRAP center round important 60%> 
 +Le paquet ''libio-socket-ssl-perl'' doit être installé pour que la connexion SSL puisse s'établir ! 
 +</WRAP> 
 + 
 +Redémarrer le service : 
 +<code bash> 
 +sudo service ddclient restart 
 +</code> 
 + 
 +Vérifier que le service soit démarré : 
 +<code bash> 
 +sudo /etc/init.d/ddclient status 
 +</code> 
 + 
 +Vérifier que le processus est en cours : 
 +<code bash> 
 +sudo ps aux | grep ddclient 
 +</code> 
 + 
 +Vérifier les logs : 
 +<code bash> 
 +sudo cat /var/log/daemon.log | grep ddclient 
 +</code> 
 + 
 +==== Sources ==== 
 +  * https://www.lacaveatonton.ovh/ddclient-le-client-dynhost-sous-linux/ 
 +  * https://help.ubuntu.com/community/DynamicDNS 
 +  * https://doc.ubuntu-fr.org/ddclient 
 +  * https://perhonen.fr/blog/2016/03/dynhost-dyndns-de-chez-ovh-2446 
 +  * https://www.monlinux.net/2014/08/dns-dynamique-client-no-ip-dyndns-debian/ 
 + 
 +===== Services web (Apache, MariaDB, PHP) ===== 
 +==== MariaDB ==== 
 +Installer MariaDB : 
 +<code bash> 
 +sudo apt install mariadb-server mariadb-client 
 +</code> 
 + 
 +Lancer l'assistant de sécurisation : 
 +<code bash> 
 +sudo mysql_secure_installation 
 +</code> 
 + 
 +<code [enable_line_numbers="true",highlight_lines_extra="9,15,16,17,28,34,41,50"]> 
 +NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB 
 +      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY! 
 + 
 +In order to log into MariaDB to secure it, we'll need the current 
 +password for the root user.  If you've just installed MariaDB, and 
 +you haven't set the root password yet, the password will be blank, 
 +so you should just press enter here. 
 + 
 +Enter current password for root (enter for none): 
 +OK, successfully used password, moving on... 
 + 
 +Setting the root password ensures that nobody can log into the MariaDB 
 +root user without the proper authorisation. 
 + 
 +Set root password? [Y/n] y 
 +New password: <mot de passe> 
 +Re-enter new password: <mot de passe> 
 +Password updated successfully! 
 +Reloading privilege tables.. 
 + ... Success! 
 + 
 + 
 +By default, a MariaDB installation has an anonymous user, allowing anyone 
 +to log into MariaDB without having to have a user account created for 
 +them.  This is intended only for testing, and to make the installation 
 +go a bit smoother.  You should remove them before moving into a 
 +production environment. 
 + 
 +Remove anonymous users? [Y/n] y 
 + ... Success! 
 + 
 +Normally, root should only be allowed to connect from 'localhost' This 
 +ensures that someone cannot guess at the root password from the network. 
 + 
 +Disallow root login remotely? [Y/n] y 
 + ... Success! 
 + 
 +By default, MariaDB comes with a database named 'test' that anyone can 
 +access.  This is also intended only for testing, and should be removed 
 +before moving into a production environment. 
 + 
 +Remove test database and access to it? [Y/n] y 
 + - Dropping test database... 
 + ... Success! 
 + - Removing privileges on test database... 
 + ... Success! 
 + 
 +Reloading the privilege tables will ensure that all changes made so far 
 +will take effect immediately. 
 + 
 +Reload privilege tables now? [Y/n] y 
 + ... Success! 
 + 
 +Cleaning up... 
 + 
 +All done!  If you've completed all of the above steps, your MariaDB 
 +installation should now be secure. 
 + 
 +Thanks for using MariaDB! 
 +</code> 
 + 
 +MariaDB est dès à présent sécurisé. 
 + 
 +=== Créer un utilisateur avec tous les privilèges === 
 +<code bash> 
 +sudo mysql 
 +</code> 
 + 
 +<code sql> 
 +GRANT ALL ON *.* TO 'nom_utilisateur'@'localhost' IDENTIFIED BY 'mot_de_passe' WITH GRANT OPTION; 
 +</code> 
 +<code sql> 
 +FLUSH PRIVILEGES; 
 +</code> 
 +<code sql> 
 +QUIT; 
 +</code> 
 + 
 +==== Apache ==== 
 +Installer Apache : 
 +<code bash> 
 +sudo apt install apache2 
 +</code> 
 + 
 +Ajouter une règle dans le pare-feu (voir [[installation#configurer_le_pare-feu|cette section]]) : 
 +<file bash> 
 +# Accept HTTP 
 +-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
 +</file> 
 + 
 +Chemins à connaître : 
 +  * Racine des documents : ''/var/www'' 
 +  * Fichier de configuration : ''/etc/apache2/apache2.conf'' 
 +  * Modules : ''/etc/apache2/mods-enabled'' 
 +  * Virtual hosts : ''/etc/apache2/sites-enabled'' 
 +  * Global configuration fragments : ''/etc/apache2/conf-enabled'' 
 + 
 +=== Déplacer le répertoire www === 
 +Copier le répertoire ''/var/www/'' et son contenu dans le nouvel emplacement (ici, ''/home/www/'') : 
 +<code bash> 
 +sudo cp -r /var/www/ /home/www/ 
 +</code> 
 + 
 +Il est également possible de copier le répertoire (et les droits associés) avec [[https://www.digitalocean.com/community/tutorials/how-to-move-an-apache-web-root-to-a-new-location-on-debian-8|rsync]]. 
 + 
 +Remplacer toutes les occurrences de ''/var/www/'' par le nouveau chemin dans les fichiers suivants : 
 +  * ''/etc/apache2/apache2.conf'' 
 +  * ''/etc/apache2/sites-enabled/000-default.conf'' 
 +  * ''/etc/apache2/sites-available/default-ssl.conf'' 
 + 
 +Redémarrer Apache : 
 +<code bash> 
 +sudo systemctl restart apache2 
 +</code> 
 + 
 +==== PHP ==== 
 +Installer PHP et plusieurs modules courants : 
 +<code bash> 
 +sudo apt install php libapache2-mod-php php-mysql php-curl php-gd php-intl php-json php-mbstring php-xml php-zip php-sqlite3 php-imagick php-mcrypt php-memcache 
 +</code> 
 + 
 +Redémarrer Apache : 
 +<code bash> 
 +sudo systemctl restart apache2 
 +</code> 
 + 
 +Tester : 
 +<code bash> 
 +sudo nano /home/www/html/info.php 
 +</code> 
 + 
 +<file php info.php> 
 +<?php 
 +phpinfo(); 
 +</file> 
 + 
 +==== phpMyAdmin ==== 
 +Installer phpMyAdmin : 
 +<code bash> 
 +sudo apt install phpmyadmin 
 +</code> 
 + 
 +FIXME Configurer 
 + 
 +Tester le fonctionnement de phpMyAdmin en se rendant sur http://192.168.1.10/phpmyadmin 
 + 
 +S'il n'est pas accessible, il faut modifier la configuration du serveur Apache. 
 + 
 +Éditer ''/etc/apache2/apache2.conf''
 +<code bash> 
 +sudo nano /etc/apache2/apache2.conf 
 +</code> 
 + 
 +Ajouter la ligne suivante à la fin du fichier : 
 +<file bash> 
 +Include /etc/phpmyadmin/apache.conf 
 +</file> 
 + 
 +Redémarrer le serveur Apache : 
 +<code bash> 
 +sudo systemctl restart apache2 
 +</code> 
 + 
 +==== HTTPS ==== 
 +Activer le module SSL : 
 +<code bash> 
 +sudo a2enmod ssl 
 +</code> 
 + 
 +Recharger la configuration d'Apache : 
 +<code bash> 
 +sudo systemctl reload apache2 
 +</code> 
 + 
 +Finalement, suivre les instructions données [[https://doc.ubuntu-fr.org/apache2#mise_en_place_de_https_avec_certbot|ici]]. 
 + 
 +==== Sources ==== 
 +  * https://www.howtoforge.com/tutorial/install-apache-with-php-and-mysql-lamp-on-debian-stretch/ 
 +  * https://doc.ubuntu-fr.org/lamp 
 +  * https://doc.ubuntu-fr.org/tutoriel/lamp_repertoires_de_travail 
 +  * https://doc.ubuntu-fr.org/apache2 
 +  * https://doc.ubuntu-fr.org/php 
 +  * https://doc.ubuntu-fr.org/mariadb 
 +  * https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-debian 
 +  * https://www.linode.com/docs/web-servers/lamp/lamp-on-debian-8-jessie/ 
 + 
 +===== Divers liens utiles =====
   * https://www.howtoforge.com/   * https://www.howtoforge.com/
   * https://wiki.debian.org/   * https://wiki.debian.org/
server/installation.txt · Dernière modification: 2019/05/12 18:21 de kevin