TP3: Sécurisation du VPS - SaigoNoo/Admin-II GitHub Wiki

Sécurisation du VPS

Informations sur les administrateurs du VPS

Bien que certaines procédures nous aient été recommandées, nous avons malgré cela décidé de pas toujours les suivre, nous préciserons sous le point concerné quels motifs nous y ont poussés et ce que nous avons mis en place pour protéger cette possible faille, très souvent en cherchant le meilleur compromis entre sécurité et praticité basé sur notre propre expérience personnelle avec les serveurs publiques. Sachez également que tout ceci est visible directement sur Webmin

Mise à jour

⚠️ Une mise à jour des paquets est importante d'un point de vue sécurité et stabilité !

En effet certains programmes, peuvent contenir des failles qui n'auraient pas été pensées par les développeurs. En mettant à jour vos paquets, vous êtes sûr déjà d'avoir la dernière version de vos utilitaires et minimisez les failles que les pirates peuvent exploiter !

Procédure

sudo apt-get update
sudo apt-get upgrade -y
Commande Description
update Met à jour l'index local dans votre distribution avec les versions disponible
upgrade Met à jour les programmes de l'OS ! -y permet de mettre à jour sans confirmation

Mise à niveau

⚠️ Une mise à niveau représente la mise à jour des paquets systèmes, est importante d'un point de vue sécurité et stabilité et prends en charge plus d'éléments qu'une mise à jour !

Procédure

sudo apt-get dist-upgrade -y
Commande Description
dist-upgrade Met à jour les outils systèmes de l'OS ! -y permet de mettre à jour sans confirmation

⚠️ A savoir qu'un reboot peut-être nécessaire !

SSH

SSH est un protocole réseau qui permet d'accéder au terminal réseau au travers du réseau !

Exemple de commande pour se connecter:

ssh username@ip -p port
Paramètre Définition
username Votre nom d'utilisateur, dans notre cas debian
password Le mot de passe lié à la session
ip Addresse IP ou dns vers le serveur, dans notre cas 54.36.181.57 ou ephec.doussis.be
port Port lié sur le protocole, très souvent la valeur sera de 22, et dans ce cas -p 22 ne sera pas nécessaire

Pas de changement de numéro de port !

En effet, il était recommandé de changer le port par défaut, parce que ce port étant exposé, il devient vulnérable aux attaques externes.

Cependant, cela ne résout pas le problème initial qui consiste à mettre en place certaines mesures ! Nous avons donc mis en places les mécanismes suivants qui seront développés plus loin dans ce wiki:

  • Désactivation du compte utilisateur root qui est souvent la cible d'attaques
  • Désactiver la connexion sans mot de passe
  • Limiter l'accès à SSH a un seul utilisateur debian
# /etc/ssh/sshd_conf
PermitRootLogin no
PermitEmptyPasswords no
AllowUsers debian

Gestion des droits utilisateurs

Les droits utilisateurs permettent de donner certains droits sur des commandes ou fichiers aux utilisateurs.

Pas d'utilisation d'un utilisateur aux droits normaux

En effet, nous avons décidé de continuer à travailler avec l'utilisateur debian, alors que les risques suivants sont possibles:

  • Suppression d'un fichier système important pouvant être nocif pour le fonctionnement de l'OS
  • Risque de détruire le serveur si quelqu'un obtient les logins.

À savoir que la raison derrière ce choix, est que l'un des deux étudiants est un habitué des serveurs sous Linux et des infrastructures serveur, il garantit que nos choix n'impacteront pas la sécurité du système et de nos services !

Cependant voici les commandes pour créer l'utilsateur ephec avec des accès limités:

debian@vps-69a439fb:~$ sudo adduser ephec
Adding user `ephec' ...
Adding new group `ephec' (1001) ...
Adding new user `ephec' (1001) with group `ephec (1001)' ...
Creating home directory `/home/ephec' ...
Copying files from `/etc/skel' ...
New password: *********
Retype new password: *********
passwd: password updated successfully
Changing the user information for ephec
Enter the new value, or press ENTER for the default
        Full Name []: EPHEC 2T
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y
Adding new user `ephec' to supplemental / extra groups `users' ...
Adding user `ephec' to group `users' ...

A la dernière ligne vous verrez Adding user `ephec' to group `users' ..., par défaut vous serez ajouté dans le groupe users.

Il existe plusieurs groupes que vous pourrez voir via la commande suivante:

debian@vps-69a439fb:~$ getent group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:debian
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:debian
fax:x:21:
voice:x:22:
cdrom:x:24:debian
floppy:x:25:debian
tape:x:26:
sudo:x:27:debian
audio:x:29:debian
dip:x:30:debian
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
shadow:x:42:
utmp:x:43:
video:x:44:debian
sasl:x:45:
plugdev:x:46:debian
staff:x:50:
games:x:60:
users:x:100:ephec
nogroup:x:65534:
systemd-journal:x:999:
systemd-network:x:998:
systemd-timesync:x:997:
input:x:101:
sgx:x:102:
kvm:x:103:
render:x:104:
uuidd:x:105:
messagebus:x:106:
systemd-resolve:x:996:
tcpdump:x:107:
_ssh:x:108:
polkitd:x:995:
debian:x:1000:
docker:x:994:debian
ssl-cert:x:109:
ephec:x:1001:

Maintenant ce qui va nous intéresser, c'est de dire a ephec qu'il a les droits super user sur docker, nous allons donc ajouter ephec au groupe docker qui a l'ID 994 via cette commande:

sudo usermod -aG docker ephec

Vous pouvez ainsi vérifier après si l'utilisateur a bien été ajouté:

debian@vps-69a439fb:~$ groups ephec
ephec : ephec users docker

Pare-feu

Un pare-feu est un programme présent sur tout appareil connecté ! Son rôle est de contrôler le trafic réseau entrant / sortant sur base d'un port, d'un protocol ou d'une route.

Il existe différents logiciels pour cela:

  • iptable
  • ufw

ufw étant très simple et évident, nous allons employer celui là.

⚠️ Si vous ne l'avez pas installé: sudo apt-get install ufw -y

Vous avez les possibilité suivantes, qui sont les plus intéressantes dans notre cas:

Instruction Argument Description
enable / Active le pare-feu.
disable / Désactive le pare-feu.
allow <port> Permet l'accès au port 22 ou au service SSH.
reject <port> Rejette les connexions sur le port spécifié, sans répondre.
deny <port> Refuse les connexions sur le port spécifié et répond par un message d'erreur.

⚠️ Par défaut le pare-feu est désactivé, activé le avec sudo ufw enable. Une fois activé, tout les ports seront fermés !

Autoriser le protocole HTTP, HTTPS et SSH (en supposant que ce sont les ports respectifs sinon mettez les votres)

sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 22
sudo ufw reject 10000

Dans mon cas le port 10000 est celui de Webmin. Donc en théorie je dois ne pas avoir accès a webmin (sauf en localhost ou tout les portes sont accessibles)... Voyons ca: image Comme vous le voyez le service est inaccessible.

Vérifier quels ports sont ouverts:

⚠️ Pour cela nous allons utiliser nmap, si vous ne l'avez pas: sudo apt-get install nmap -y

debian@vps-69a439fb:~$ nmap ephec.doussis.be
Starting Nmap 7.93 ( https://nmap.org ) at 2025-02-20 20:46 UTC
Nmap scan report for ephec.doussis.be (54.36.181.57)
Host is up (0.00024s latency).
rDNS record for 54.36.181.57: vps-69a439fb.vps.ovh.net
Not shown: 995 closed tcp ports (conn-refused)
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
443/tcp   open  https
10000/tcp open  snet-sensor-mgmt

Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds

Fail2Ban

fail2ban est un utilitaire linux, qui sur base d'une config bloque les connexion répétitive faisant penser a du bruteforce, pour une durée définie.

Configuration

⚠️ sudo apt-get install fail2ban -y

# /etc/fail2ban/jail.conf
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 600
findtime = 600
logpath = /var/log/auth.log
Paramètre Valeur par défaut Description
enabled true/false Active (true) ou désactive (false) une jail spécifique.
port ssh, http, etc. Spécifie le port ou le service à protéger.
maxretry 3 Nombre maximal de tentatives de connexion échouées avant bannissement.
bantime 600 (10 min) Durée du bannissement en secondes. Une valeur négative bannit à vie.
findtime 600 Intervalle de temps (en secondes) pendant lequel maxretry doit être atteint pour qu'un bannissement ait lieu.
ignoreip 127.0.0.1/8 ::1 Liste des IPs à ignorer (ne seront jamais bannies).
logpath /var/log/auth.log (par défaut pour SSH) Chemin du fichier journal analysé par Fail2Ban.
action iptables-multiport Définit la méthode utilisée pour bloquer une IP (iptables, firewall-cmd, etc.).
⚠️ **GitHub.com Fallback** ⚠️