Mathieu GAILLARD

Configuration d'un serveur Ubuntu 16.04

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.

Sources