Outils pour utilisateurs

Outils du site


installation_d_un_serveur_web_sous_debian_gnu_linux

Installation d'un serveur web sous Debian GNU Linux

Installation de base

A l'installation de Debian, lorsque la selection de logiciels se présentera, cochez les cases indispensables à un serveur web :

  • serveur web
  • bases de données SQL
  • serveur SSH
  • utilitaires usuels du système

Un peu de moquette dans la console

Pour donner un peu de couleurs à la console et aux différentes commandes et activer quelques alias simples, il faut modifier le fichier /root/.bashrc afin qu'il ressemble à ça :

# ~/.bashrc: executed by bash(1) for non-login shells.
 
# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022
 
# colorisation console
export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
 
# You may uncomment the following lines if you want `ls' to be colorized:
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
 
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'

Besoin de firmware propriétaires ?

Parfois, votre machine a besoin de firmware spécifiques pour faire fonctionner correctement les différents matériels. Pour se faire, ajouter au fichier de source des paquets /etc/apt/sources.list le dépôt jessie-updates (dans le cas d'une debian 8) :

# jessie-updates, previously known as 'volatile'
deb http://debian.proxad.net/debian/ jessie-updates main contrib non-free
deb-src http://debian.proxad.net/debian/ jessie-updates main contrib non-free

Puis resynchroniser les sources, et installer les firmwares :

$ apt-get update
$ apt-get install firmware-linux-nonfree

Utilitaires et paquets utiles

  • htop : pour voir la charge du serveur “graphiquement” en temps réel
  • nload : pour voir le debit de données en entrée et en sortie en temps réel
  • iotop : pour voir les entrées/sorties (lecture/écriture) sur le disque dur en temps réel
  • mcrypt : librairie d'encryption servant à plein de paquets
  • curl : permet d'interroger des URL distantes (notamment)
  • unzip : permet la compression/décompression des fichiers .zip
  • rsync : permet de synchroniser des répertoires locaux et/ou distants

La commande qui va bien :

$ apt-get install htop nload iotop mcrypt curl unzip rsync

SSH

Le serveur est accessible par défaut sur le port 22 en SSH et c'est plutôt pas très très bien. Avant de modifier la configuration SSH, ajouter un nouvel utilisateur à travers lequel se connecter en remplacement de root (qui sera donc interdit de se connecter) en tapant la commande suivante dans le terminal :

$ adduser usersympa

Puis, modifier le fichier /etc/ssh/sshd_config en changeant quelques paramètres comme suit :

Pour changer le port de connection SSH (mettre une valeur au-delà de 10000 idéalement) :

Port 43210

Pour interdire la connection avec l'utilisateur root (d'où la création de l'utilisateur usersympa ci-dessus) :

PermitRootLogin no

Puisque c'est un serveur sans interface graphique, pas besoin de ça :

X11Forwarding no

Pour limiter la liste des utilisateurs autorisés à se connecter en SSH :

AllowUsers usersympa autreuser encoreunuser

Pour n'autoriser que la connexion avec une clef ssh (ce qui évite le risque de voir circuler le password en clair)

PasswordAuthentication no

Pour mémoire, il faut alors ajouter la clef ssh publique de l'utilisateur dans un répertoire et un fichier à éventuellement créer et à affecter à l'utilisateur si vous faites tout ça en tant que root :

nano ~/.ssh/authorized_keys #copier dans ce fichier la clef soit le contenu du fichier ~/.ssh/id_rsa.pub situé sur son ordi
chmod -R go= ~/.ssh
chown -R mon_user: ~/.ssh

FTP avec VSFTPD

Nous utiliserons VSFTPD parce qu'il faut bien en choisir un.

On va configurer VSFTPD pour :

  • restreindre les utilisateurs qui se connectent dans leur home : ils n'ont pas accès au reste des fichiers du serveurs. Une petite prison dorée quoi.
  • avoir une connection sécurisée SSL/TLS (appelée aussi SSL implicite)

Avant tout, penser à désactiver SFTP, la méthode classique de connection FTP qui accompagne SSH, en commentant la ligne suivante dans le fichier /etc/ssh/sshd_config :

#Subsystem sftp /usr/lib/openssh/sftp-server

Installation :

$ apt-get install vsftpd

Pour que la connection soit sécurisée, on va devoir créer un certificat et la clef (valables ici pendant 10 ans) qui va avec en tapant la commande :

$ openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout /etc/ssl/private/vsftpd.key.pem -out /etc/ssl/certs/vsftpd.cert.pem

Puis dans le fichier /etc/vsftpd.conf, modifier comme suit :

# Write enable
write_enable=YES
 
# Default umask for local users
local_umask=022
 
# Login banner
ftpd_banner=Message d'accueil affiché lors d'une connection réussie
 
# Chroot les users avec droits d'ecriture
chroot_local_user=YES
chroot_list_enable=YES
# Décommenter et créer ce fichier pour y mettre un user par ligne qui NE SERA PAS chrooté (pas de prison dorée pour lui)
# chroot_list_file=/etc/vsftpd.no_chroot_list
 
# Activer SSL
ssl_enable=YES

Mais il faut aussi ajouter à la fin de ce même fichier :

# SSL Session reuse (breaks many FTP clients if YES)
require_ssl_reuse=NO
 
# Passive mode
pasv_enable=YES
 
# Ports du Passive mode de 3000 à 3005 (à vous d'adapter si besoin)
pasv_min_port=3000
pasv_max_port=3005
 
# Complément au support SSL
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
 
# Les chemins vers le certificat et la clef précédemment créés
rsa_cert_file=/etc/ssl/certs/vsftpd.cert.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key.pem

Fail2Ban

Fail2Ban permet de bannir des IPs qui tenteraient de se connecter trop souvent (via SSH notamment) sans connaitre le mot de passe d'un compte. La technique la + classique des robots est de tester des milliers/millions de mot de passe et ça s'appelle la Force Brute (“Brut Force” pour briller dans les diners). Fail2Ban limite ces tentatives à 5 et banni l'IP 10mn par défaut.

Installation :

$ apt-get install fail2ban

Puis dans le fichier /etc/fail2ban/jail.conf modifier les valeurs comme suit (penser à mettre le bon port SSH configuré auparavant) :

destemail = votre-mail@votre-nom-de-domaine.org
 
action = %(action_)s
 
[ssh]
 
enabled = true
port    = 43210
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 5
 
[ssh-ddos]
 
enabled = true
port    = 43210
filter  = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 5

Voir aussi les préconisations de ce site pour une config plus fine de fail2ban

Firewall avec IPTables

Il faut choisir soit l'installation du Firewall via iptables soit via ufw (voir plus bas)

Ressources

Commandes utiles

Lister les règles actuelles :

$ iptables -L

Exporter les règles actuelles :

$ iptables-save > monserveur.rules

Restorer les règles d'un fichier :

$ iptables-restore < monserveur.rules

Vider toutes les règles :

$ iptables -F

Voir les modules chargés :

$ lsmod | grep ip

Script pour remettre les règles par defaut

Dans un coin sécurisé de votre serveur, par exemple /root/scripts, créer un fichier firewall-reset.sh et restreindre son usage à root :

$ touch firewall-reset.sh
$ chmod 700 firewall-reset.sh

Dans ce fichier, mettre ceci :

#!/bin/sh
 
echo ""
echo "* Remet les règles iptables par default"
 
#----------
# Back to default Policy ACCEPT
#----------
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
 
#----------
# Back to default Policy for table NAT
#----------
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
 
#----------
# Flush all rules
#----------
iptables -F
iptables -t nat -F
 
#----------
# Remove user rules
#----------
iptables -X
iptables -t nat -X
 
echo "[OK]"
echo ""
 
#----------
# Reset Fail2Ban (si installé)
#----------
service fail2ban restart
 
exit 0

Pour executer le fichier, mettez vous dans son répertoire et tappez :

$ ./firewall-reset.sh

Script pour redémarrer le Firewall avec toutes les règles

Toujours dans le même coin sécurisé de votre serveur, par exemple /root/scripts, créer un fichier firewall-restart.sh et restreindre son usage à root :

$ touch firewall-restart.sh
$ chmod 700 firewall-restart.sh

Et dans ce fichier mettre :

#!/bin/sh
 
# Reset le firewall
echo ""
echo "Reset le Firewall"
/root/scripts/firewall-reset.sh
echo "[OK]"
 
# Start le firewall avec mes règles
echo ""
echo "Charge les règles personnalisées"
/root/scripts/firewall-start.sh
echo "[OK]"
echo ""
 
exit 0

Firewall avec UFW

UFW est un utilitaire qui va faciliter la mise en place de règles pour iptables

Ressources

Mise en place des règles de base

Ports à ouvrir pour le traffic vers Jitsi Meet server:

  80 TCP - for SSL certificate verification / renewal with Let's Encrypt
  443 TCP - for general access to Jitsi Meet
  10000 UDP - for general network video/audio communications
  22 TCP - if you access you server using SSH (change the port accordingly if it's not 22)
  3478 UDP - for quering the stun server (coturn, optional, needs config.js change to enable it)
  5349 TCP - for fallback network video/audio communications over TCP (when UDP is blocked for example), served by coturn

En passant les commandes suivantes :

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 10000/udp
sudo ufw allow 22/tcp
sudo ufw allow 3478/udp
sudo ufw allow 5349/tcp
sudo ufw enable

Vérification du statut du firewall

sudo ufw status verbose

Ajout de règles pour, par exemple, transfert de port vers un container

Changer dans le fichier /etc/default/ufw le paramètre DEFAULT_FORWARD_POLICY

DEFAULT_FORWARD_POLICY="ACCEPT"

Configure /etc/ufw/sysctl.conf pour autoriser ipv4 forwarding

net.ipv4.ip_forward=1
#net/ipv6/conf/default/forwarding=1
#net/ipv6/conf/all/forwarding=1

Ajouter à /etc/ufw/before.rules AVANT les filter rules.

  *nat
  :PREROUTING ACCEPT [0:0]
  -A PREROUTING -i enp35s0 -p udp --dport 30000 -j DNAT --to 10.0.3.243:30000
  COMMIT

Ajouter des règles pour dhcp du container LXC

ufw allow in on lxcbr0
ufw allow out on lxcbr0

Redémarrer le tout

sudo ufw disable && sudo ufw enable
installation_d_un_serveur_web_sous_debian_gnu_linux.txt · Dernière modification : 2023/04/11 21:49 de Benjamin Labomedia