La sĂ©curitĂ© dâun serveur nâest pas Ă prendre Ă la lĂ©gĂšre. Chaque jour qui passe, de nombreux robots ou humains chercheront Ă pĂ©nĂ©trer ton serveur. Pour tout casser, pour utiliser tes ressources, pour lâhonneur, etc âŠ
Bon, en gĂ©nĂ©ral, dâaprĂšs mon expĂ©rience personnelle, la plupart des attaques sont des attaques de force brute en SSH totalement stupides qui essaye du mot de passe en brute force pour diffĂ©rent utilisateurs communs (root, admin, administrator, âŠ). Il est extrĂȘmement rare dâĂȘtre la cible dâune attaque rĂ©flĂ©chie. Sauf bien sĂ»r si tu hĂ©berge un site ou un service trĂšs connu. Mais en bon admin serveur, tu dois garder le contrĂŽle de ton serveur ! On va voir comment faire pour attendre un bon niveau de sĂ©curitĂ©.
Source : https://www.remipoignon.fr/securiser-son-serveur-linux/
Commençons par le commencement, tu viens de recevoir ton nouveau VPS (serveur privé virtuel) ou ton nouveau serveur dédié.
1.Modifie ton mot de passe root !
Pour la gestion de tes mots de passe, je te conseille lâutilisation dâun gestionnaire de mot de passe. Tu pourra alors stocker des mots de passe complexes et diffĂ©rents. Il te suffira simplement de connaĂźtre un mot de passe pour dĂ©verrouiller les autres. KeepassXC est gratuit et multi-plateforme, il encrypte vos mots de passe avec lâalgo AES avec SHA-256, il permet dâutiliser une clĂ© privĂ©e. Bref, je te le recommande, un bon admin systĂšme ne met jamais les mĂȘme mots de passe sur ses serveurs !
PremiĂšre chose Ă faire, si comme moi tu as reçu ton mot de passe root par mail, considĂšre le comme potentiellement interceptĂ©. (Comme pour tout tes mots de passe que tu reçois par mail dâailleurs). Ton mot de passe root ne doit ĂȘtre connu que par toi et nâĂȘtre accessible par personne dâautre, alors on le change tout de suite. Connectes toi en SSH sur ton serveur et change ton mot de passe avec la commande :
passwd root
2.Root câest fini, bonjour admin
Comme je lâai dis, la plupart des attaques sont des attaques oĂč des robots vont tenter de se connecter en SSH sur ton serveur avec lâutilisateur root en tentant des combinaisons diffĂ©rentes de mot de passe. Une bonne pratique de sĂ©curitĂ© consiste donc Ă bloquer root et de le remplacer par un utilisateur de ton choix qui aura les privilĂšges root.
Commences par ajouter un utilisateur, ici, je lâappelle « kody » :
adduser kody
On installe le paquet sudo pour permettre à certains utilisateurs autorisés de prendre les droits root :
apt install sudo
Puis on ajoute lâutilisateur aux groupes lui permettant dâavoir les privilĂšges root (jâai rajoutĂ© le groupe adm pour pouvoir consulter les logs sans devoir utiliser sudo) :
usermod -aG root,sudo,adm kody
On modifie maintenant la configuration SSH pour interdire la connexion en tant que root. Tu peux aussi modifier ton port de connexion SSH si tu le souhaite, ça tâĂ©vitera 99.99% des attaques par brute force mais câest un peu pĂ©nible pour la suite de devoir toujours indiquer ton numĂ©ro de port âŠ
/etc/ssh/sshd_config
...
# Interdire Ă root de se connecter en SSH
PermitRootLogin no
# Facultatif : Modifier le port de connexion pour le SSH
Port 4854
# Facultatif : Seul admin peux se connecter en SSH
AllowUsers kody
# Facultatif : Seul les utilisateurs du groupe sshusers peuvent se connecter en SSH
AllowGroups sshusers
...
Attention ! Avant de redĂ©marrer ton service SSH, avec une mauvaise configuration, tu risques de perdre complĂštement lâaccĂšs Ă ton serveur ! Penses Ă garder ta session ssh root active le temps de vĂ©rifier que tout va bien et que tu dispose bien des privilĂšges root avec le nouvel utilisateur.
On redémarre le service SSH :
service ssh restart
On se connecte en SSH avec le nouvel utilisateur et on test que la commande sudo fonctionne bien :
sudo ls -l ./
Si ça ne fonctionne pas, ne quittes surtout par ta session root et fais ce quâil faut pour que ça marche.
Le principe de sudo est simple, tout ce que tu exĂ©cutes en utilisant le prĂ©fixe sudo va exĂ©cuter la commande avec les droits root. Tu peux mĂȘme prendre la main sur lâutilisateur root avec la commande (mais Ă Ă©viter) :
sudo su
Combien dâadmin systĂšme qui ne respecte pas cette bonne pratique se retrouve connectĂ© au serveur en root, puis lors dâune pause cafĂ©, laisse parfois leur session connectĂ© sans surveillance ? DĂ©jĂ sâil te plaĂźt, verrouilles toujours ta session quand tu abandonnes ton poste. Sudo apporte une sĂ©curitĂ© supplĂ©mentaire, il faut confirmer ton mot de passe pour exĂ©cuter une commande root.
DĂ©sactiver le compte root
passwd --lock root
Actviver le compte root
sudo passwd root
3.Un firewall strict = maĂźtrise des portes dâentrĂ©es / sorties
Sur ton serveur, plusieurs services sont en cours dâexĂ©cution et certains sont Ă lâĂ©coute sur des ports ouverts ce qui peut prĂ©senter un risque si le logiciel derriĂšre le port ouvert contient une faille. Il est important de configurer un firewall qui bloquera tous les ports sauf ceux dont nous avons besoin et dont le logiciel qui lâutilise est sĂ©rieux, rĂ©putĂ© pour ĂȘtre sĂ©curisĂ© et dont on a confiance.
Aller hop ! On installe lâincontournable paquet iptable :
sudo apt install iptables
On définit les rÚgles du firewall, en fonction des services que tu utilises, commentes, dé-commentes ou ajoute des lignes :
nano /etc/init.d/firewall
#! /bin/sh ### BEGIN INIT INFO # Provides: PersonalFirewall # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Personal Firewall # Description: Init the firewall rules ### END INIT INFO # programme iptables IPV4 et IPV6 IPT=/sbin/iptables IP6T=/sbin/ip6tables # Les IPs #IP_TRUSTED=xx.xx.xx.xx do_start() { # Efface toutes les regles en cours. -F toutes. -X utilisateurs $IPT -t filter -F $IPT -t filter -X $IPT -t nat -F $IPT -t nat -X $IPT -t mangle -F $IPT -t mangle -X $IP6T -t filter -F $IP6T -t filter -X $IP6T -t mangle -F $IP6T -t mangle -X # strategie (-P) par defaut : bloc tout l'entrant le forward et autorise le sortant $IPT -t filter -P INPUT DROP $IPT -t filter -P FORWARD DROP $IPT -t filter -P OUTPUT ACCEPT $IP6T -t filter -P INPUT DROP $IP6T -t filter -P FORWARD DROP $IP6T -t filter -P OUTPUT ACCEPT # Loopback $IPT -t filter -A INPUT -i lo -j ACCEPT $IPT -t filter -A OUTPUT -o lo -j ACCEPT $IP6T -t filter -A INPUT -i lo -j ACCEPT $IP6T -t filter -A OUTPUT -o lo -j ACCEPT # Permettre a une connexion ouverte de recevoir du trafic en entree $IPT -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IP6T -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ICMP $IPT -t filter -A INPUT -p icmp -j ACCEPT # DNS:53 $IPT -t filter -A INPUT -p tcp --dport 53 -j ACCEPT $IPT -t filter -A INPUT -p udp --dport 53 -j ACCEPT $IP6T -t filter -A INPUT -p tcp --dport 53 -j ACCEPT $IP6T -t filter -A INPUT -p udp --dport 53 -j ACCEPT # SSH:22 # ATTENTION, indiques bien ton port personnalisé si tu l'as changé $IPT -t filter -A INPUT -p tcp --dport 22 -j ACCEPT $IP6T -t filter -A INPUT -p tcp --dport 22 -j ACCEPT # HTTP:80 $IPT -t filter -A INPUT -p tcp --dport 80 -j ACCEPT $IP6T -t filter -A INPUT -p tcp --dport 80 -j ACCEPT # HTTPS:443 $IPT -t filter -A INPUT -p tcp --dport 443 -j ACCEPT $IP6T -t filter -A INPUT -p tcp --dport 443 -j ACCEPT # SMTP:25/587/465 $IPT -t filter -A INPUT -p tcp --dport 25 -j ACCEPT $IP6T -t filter -A INPUT -p tcp --dport 25 -j ACCEPT $IPT -t filter -A INPUT -p tcp --dport 587 -j ACCEPT $IP6T -t filter -A INPUT -p tcp --dport 587 -j ACCEPT # $IPT -t filter -A INPUT -p tcp --dport 465 -j ACCEPT # $IP6T -t filter -A INPUT -p tcp --dport 465 -j ACCEPT # POP3:110/995 # $IPT -t filter -A INPUT -p tcp --dport 110 -j ACCEPT # $IP6T -t filter -A INPUT -p tcp --dport 110 -j ACCEPT # $IPT -t filter -A INPUT -p tcp --dport 995 -j ACCEPT # $IP6T -t filter -A INPUT -p tcp --dport 995 -j ACCEPT # IMAP / SIEVE : 143/993/4190 # $IPT -t filter -A INPUT -p tcp --dport 143 -j ACCEPT # $IP6T -t filter -A INPUT -p tcp --dport 143 -j ACCEPT $IPT -t filter -A INPUT -p tcp --dport 993 -j ACCEPT $IP6T -t filter -A INPUT -p tcp --dport 993 -j ACCEPT $IPT -t filter -A INPUT -p tcp --dport 4190 -j ACCEPT $IP6T -t filter -A INPUT -p tcp --dport 4190 -j ACCEPT # accepte tout d'une ip en TCP # $IPT -t filter -A INPUT -p tcp -s $IP_TRUSTED -j ACCEPT echo "firewall started [OK]" } # fonction qui arrete le firewall do_stop() { # Efface toutes les regles $IPT -t filter -F $IPT -t filter -X $IPT -t nat -F $IPT -t nat -X $IPT -t mangle -F $IPT -t mangle -X $IP6T -t filter -F $IP6T -t filter -X $IP6T -t mangle -F $IP6T -t mangle -X # remet la strategie $IPT -t filter -P INPUT ACCEPT $IPT -t filter -P OUTPUT ACCEPT $IPT -t filter -P FORWARD ACCEPT $IP6T -t filter -P INPUT ACCEPT $IP6T -t filter -P OUTPUT ACCEPT $IP6T -t filter -P FORWARD ACCEPT # echo "firewall stopped [OK]" } # fonction status firewall do_status() { # affiche les regles en cours clear echo Status IPV4 echo ----------------------------------------------- $IPT -L -n -v echo echo ----------------------------------------------- echo echo status IPV6 echo ----------------------------------------------- $IP6T -L -n -v echo } case "$1" in start) do_start exit 0 ;; stop) do_stop exit 0 ;; restart) do_stop do_start exit 0 ;; status) do_status exit 0 ;; *) echo "Usage: /etc/init.d/firewall {start|stop|restart|status}" exit 1 ;; esac
Il faut donner les droits dâexĂ©cution au script :
sudo chmod +x /etc/init.d/firewall Attention ! Si tu dĂ©finis mal les rĂšgles, tu peux te bloquer toi mĂȘme et ne plus pouvoir accĂ©der au serveur. Je te conseille fortement dâexĂ©cuter le script puis essaye de te rĂ©-authentifier en SSH. Si aprĂšs exĂ©cution du script, tout est bloquĂ©, tu as perdu ta session et impossible de te reconnecter, redĂ©marre le serveur pour rĂ©initialiser le firewall.
Câest partit ! On lance le script :
sudo /etc/init.d/firewall start
Si tout va bien et que tu peux toujours te connecter en SSH, alors on peut indiquer au serveur que tu veux que le script soit exécuté au démarrage pour que jamais le firewall ne soit corrompu :
sudo update-rc.d firewall defaults
Si tu changes dâavis, tu peux le retirer avec la commande :
sudo update-rc.d -f firewall remove
4.Toujours Ă jour avec cron-apt
Bon, câest bien beau, mon serveur est sĂ©curisĂ© mais que se passe il le jour oĂč une faille dans un logiciel est dĂ©couverte pendant que je suis en vacance ? Un pirate aura tout son temps pour en profiter.
Un serveur fait les choses de façon automatique non ? HĂ© bien quâil se mette Ă jour tout seul ! Aller on installe le paquet cron-apt :
sudo apt install cron-apt
On veux faire les mises à jour de sécurité uniquement, donc on créé un nouveau fichier de source :
grep security /etc/apt/sources.list > /etc/apt/security.sources.list
Un peu de configuration :
nano /etc/cron-apt/config
APTCOMMAND=/usr/bin/apt-get
OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list"
MAILTO="moi@mondomain.fr"
MAILON="upgrade"
On indique quâon veut que cron-apt installe les mises Ă jour quand il en trouve :
nano /etc/cron-apt/action.d/3-download
dist-upgrade -y -o APT::Get::Show-Upgraded=true
Cron-apt se lance par dĂ©faut toute les nuits Ă 4h du matin, si tu veux modifier ça, câest ici :
nano /etc/cron.d/cron-apt