Voici les étapes que je suis pour installer un serveur sous Ubuntu 16.04.
Configuration du DNS
Ajouter un enregistrement A pour faire pointer un sous-domaine vers l’adresse IPv4 du serveur.
Dans le cas d’IPv6, utiliser un enregistrement AAAA.
Changer le hostname.
sudo nano /etc/hostname
Mise à jour et mot de passe
$ apt update
$ apt upgrade
Changement mot de passe
$ passwd root
Ajout utilisateur
Attention à bien modifier la valeur de <user>
avec le port SSH souhaité.
$ adduser <user>
$ adduser <user> sudo
Configuration de SSH
$ nano /etc/ssh/sshd_config
Modifier les valeurs suivantes. Attention à bien modifier la valeur de <ssh_port>
avec le port SSH souhaité.
Port <ssh_port>
PermitRootLogin no
Redémarrer le serveur SSH.
$ /etc/init.d/ssh restart
Configuration de Fail2ban
Installation de Fail2ban et ajout d’un fichier de configuration local.
$ apt install fail2ban
$ cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
$ nano /etc/fail2ban/jail.local
Ajouter les configurations suivantes. Attention à bien modifier la valeur de <ssh_port>
avec le port SSH souhaité.
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 3600
maxretry = 3
[sshd]
enable = true
port = ssh, <ssh_port>
logpath = %(sshd_log)s
Redémarrer et vérifier que SSH est géré par Fail2ban.
$ fail2ban-client reload
$ fail2ban-client status sshd
Configuration de Iptables
Pour pouvoir persister les règles, installer iptables-persistent
.
$ apt install iptables-persistent
Exécuter ces commandes pour bloquer tout le trafic excepté : SSH et Web. Attention à bien modifier la valeur de <ssh_port>
avec le port SSH souhaité. Attention à utiliser la bonne interface réseau par exemple : eth0
, ens3
.
# On flush iptables
iptables -F
# On supprime toutes les chaînes utilisateurs
iptables -X
# On drop tout le trafic entrant
iptables -P INPUT DROP
# On drop tout le trafic sortant
iptables -P OUTPUT DROP
# On drop le forward
iptables -P FORWARD DROP
# On drop les scans XMAS et NULL
iptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# Dropper silencieusement tous les paquets broadcastés
iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP
# Permettre à une connexion ouverte de recevoir du trafic en entrée
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
# Permettre à une connexion ouverte de recevoir du trafic en sortie
iptables -A OUTPUT -m state ! --state INVALID -j ACCEPT
# Regle Web
iptables -A INPUT -p tcp -i ens3 --dport 80 -j ACCEPT
# Regle SSH
iptables -A INPUT -p tcp -i ens3 --dport <ssh_port> -j ACCEPT
# On accepte la boucle locale en entrée
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
Pour persister les règles.
$ netfilter-persistent save
Pour vérifier les règles.
$ iptables -L -v -n
Essayer de se connecter en SSH via un autre terminal pour vérifier que tout fonctionne. Redémarrer le serveur et contrôler que les règles sont bien persistées.