Il a deux jours, j’ai réalisé que les performances de mon serveur DigitalOcean étaient diminuées considérablement. En fait, le service web ne répondait plus. Après avoir analysé les fichiers d’activités (logs), j’ai réalisé que des milliers de tentatives de connexion SSH avait été lancées sur le serveur. Plusieurs tentatives par seconde avec plusieurs noms d’utilisateur différents. Les requêtes provenaient de la Chine.
C’est à ce moment que j’ai réalisé les dangers du far west du World Wide Web.
Voici donc les éléments traités à considérer afin d’améliorer la sécurité de votre serveur Web Ubuntu :
- Identification des tentatives de connexion au serveur
- Mise à jour des logiciels sur Ubuntu
- Application des correctifs de sécurité sur Ubuntu
- Identification des ports ouverts et services sur votre serveur Ubuntu
- Mise en place d’un pare-feu
Carte des attaques Norse Map
La Norse Corp offre une carte qui présente les différentes attaques en temps réel grâce aux WebSockets. Il est intéressant de voir le type d’attaque, l’origine des attaques et les destinations. Cette belle application Web démontre à quel point les attaques sont fréquentes et mondiales. Après quelques heures d’analyse il est possible d’identifier les pays qui attaquent le plus : la Chine et la Russie.
Akamai offre aussi une carte temps-réel des attaques.
Analyse des dernières connexions SSH
Pour débuter, voici un truc utile afin d’identifier les connexions suspectes sur votre serveur web. Il est proposé d’utiliser les commandes last et lastb afin d’afficher les informations des dernières connexions.
Les dernières connexions avec last
La commande last affiche les dernières connexions au système. On y retrouve le nom de l’utilisateur utilisé, l’adresse IP de la connexion ainsi que l’heure de connexion.
1 2 3 4 5 6 7 |
$ last reboot system boot 3.13.0-85-generi Tue Apr 5 09:15 - 11:35 (2+02:19) guser pts/28 :0 Sat Apr 2 12:18 - 09:14 (2+20:56) guser pts/27 :0 Sat Apr 2 07:57 - 09:14 (3+01:17) guser pts/24 105.237.110.168 Fri Apr 1 20:38 - 09:14 (3+12:36) guser pts/26 :0 Fri Apr 1 20:33 - 09:14 (3+12:40) |
Les dernières connexions pour chaque utilisateur Ubuntu
Pour sa part, lastlog affiche la liste de tous les utilisateurs avec la date de dernière connexion.
1 2 3 4 5 6 7 8 9 10 11 12 |
$ lastlog avahi **Never logged in** lightdm **Never logged in** colord **Never logged in** hplip **Never logged in** pulse **Never logged in** ggreen tty2 Tue Jan 27 11:09:31 -0500 2015 mysql **Never logged in** newman **Never logged in** mongodb **Never logged in** redis **Never logged in** |
Filtrer les dernières connexions SSH
Afin d’éliminer les utilisateurs qui ne se sont jamais connectés, la commande grep est utilisée avec l’option -v qui permet d’inverser le résultat.
1 |
$ lastlog | grep -v Never # <strong>-v, --invert-match</strong> |
Les dernières connexions SSH refusées avec lastb
La commande lastb quant à elle, affiche la liste des dernières connexions refusées. C’est cette commande qui permettra de savoir si des tentatives de connexions par essais et erreurs sont lancées sur votre serveur web.
1 |
$ lastb |
C’est dans le fichier /var/log/btmp que ces tentatives de connexions sont sauvegardées. La taille de ce fichier peut augmenter considérablement lorsqu’une attaque est lancée sur votre serveur web.
Voici un échantillon de la sortie pour commande lastb. Il est il intéressant de noter que les adresses IP des attaquants sont sauvegardées.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
ts ssh:notty 13.76.96.92 Sun May 1 08:40 - 08:40 (00:00) nagios ssh:notty 120.27.53.213 Sun May 1 08:37 - 08:37 (00:00) postgres ssh:notty 120.27.53.213 Sun May 1 08:28 - 08:28 (00:00) root ssh:notty 51.174.217.114 Sun May 1 08:22 - 08:22 (00:00) git ssh:notty 218.14.192.52 Sun May 1 08:21 - 08:21 (00:00) www ssh:notty 120.27.53.213 Sun May 1 08:20 - 08:20 (00:00) root ssh:notty 51.174.217.114 Sun May 1 08:15 - 08:15 (00:00) vagrant ssh:notty 120.27.53.213 Sun May 1 08:11 - 08:11 (00:00) vagrant ssh:notty 120.27.53.213 Sun May 1 08:11 - 08:11 (00:00) root ssh:notty 51.174.217.114 Sun May 1 08:09 - 08:09 (00:00) ghost ssh:notty 120.27.53.213 Sun May 1 08:02 - 08:02 (00:00) ghost ssh:notty 120.27.53.213 Sun May 1 08:02 - 08:02 (00:00) root ssh:notty 51.174.217.114 Sun May 1 07:55 - 07:55 (00:00) tanner ssh:notty 178.239.180.101 Sun May 1 07:44 - 07:44 (00:00) |
Géolocalisation par IP
Un outil comme iplocation.net permet d’identifier la provenance de ces attaques.
Pour sa part, MaxMind offre la base de données GeoIP2 que vous pouvez mettre en place sur votre application afin de récupérer la ville ou le pays d’une adresse IP.
Liste noire des adresses IP
Void IP est un autre service intéressant qui vous indique si une adresse IP est sur la liste noire (black list). Il suffit d’entrer l’adresse IP qui nous intéresse et un rapport est affiché.
Protéger son accès SSH avec DenyHosts
Lorsque les attaques proviennent des mêmes adresses IP, il est possible de les bannir. DenyHost est un outil python qui détecte les tentatives répétées de connexion et gère un fichier d’adresses IP à bannir. Voici deux liens pour en savoir plus sur DenyHost :
Connexion SSH avec clé RSA
Il est de plus en plus difficile de sélectionner un bon mot de passe et encore plus difficile de s’en souvenir! Les gens sont de plus en plus sensibilisés, mais ne prennent pas les moyens nécessaires afin de mettre en place un mot de passe VRAIMENT sécuritaire.
Une solution consiste à désactiver la connexion de l’utilisateur ROOT par de mot de passe et de forcer la connexion par clé RSA.
Voici quelques avantages :
- Augmente considérablement la sécurité de votre serveur.
- On n’a pas à vérifier la qualité du mot de passe, puisqu’il n’y en a pas.
- Lors d’une connexion, les clés sont automatiquement échangées, donc pas besoin d’entrer un mot de passe.
- L’attaquant ne peut pas utiliser de dictionnaire de mot de passe (brute force) pour se connecter.
Mettre en place une connexion SSH avec clé publique sur Ubuntu
Voici la procédure proposée par Digital Ocean afin de mettre en place une connexion avec clé RSA :
https://www.digitalocean.com/community/tutorials/how-to-use-ssh-keys-with-digitalocean-droplets
Forcer la connexion SSH avec une clé publique
La procédure qui permet de forcer la connexion avec un clé et non un mot de passe est simple sur Ubuntu. Il suffit de modifier le fichier de configuration du service SSH (sshd_config) et d’utiliser l’option without-password.
1 |
$ nano /etc/ssh/sshd_config |
Ajouter la ligne suivante :
1 |
PermitRootLogin without-password |
Par défaut la connexion par mot de passe (PasswordAuthentication) est activée, il faut donc commenter cette option dans le fichier de configuration.
Par la suite, il faut indiquer que seules les connexions avec clé sont possibles.
# Définir la valeur no afin de désactiver la connexion par mot de passe :
1 |
PasswordAuthentication no |
# Il faut aussi ajouter la ligne suivante :
1 |
PermitRootLogin without-password |
# Et ensuite la prochaine ligne :
1 |
PermitRootLogin yes |
# Finalement, relancer le service :
1 |
$ service ssh restart |
Une erreur de débutant qui peut couter cher
Mise à jour des logiciels et correctifs de sécurité
À toutes les semaines, des failles de sécurité sont découvertes dans le code que vous exécutez. Il est donc essentiel de mettre à jours vos logiciels et d’appliquer les correctifs de sécurité rapidement. C’est même extrêmement important si votre machine est connectée à Internet.
Sur Ubuntu, plusieurs commandes vous permettent de faire les mises à jour nécessaires afin d’augmenter la sécurité.
Simulation de mise à jour
Avec l’option simulate, il est possible de voir la liste des paquets qui seront mis à jour.
1 |
$ apt-get --simulate upgrade |
L’option simulate simule la mise à jour des paquets sans réellement les installer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
NOTE: This is only a simulation! apt-get needs root privileges for real execution. Keep also in mind that locking is deactivated, so don't depend on the relevance to the real current situation! Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done The following packages were automatically installed and are no longer required: libhdb9-heimdal libkdc2-heimdal Use 'apt-get autoremove' to remove them. The following packages will be upgraded: gir1.2-gtk-3.0 libgail-3-0 libgtk-3-0 libgtk-3-bin libgtk-3-common libmm-glib0 libnautilus-extension1a modemmanager nautilus nautilus-data oneconf oneconf-common python-oneconf python3-oneconf 14 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. |
Mise à jour avec l’option upgrade ou dist-upgrade?
Afin d’appliquer la mise à jour sur Ubuntu, vous avez deux options : dist-upgrade et upgrade.
1 |
$ sudo apt-get upgrade |
L’option upgrade met à jour tous les paquets installés sur le système vers les dernières versions .
1 |
$ sudo apt-get dist-upgrade |
L’option dist-upgrade met à jour tous les paquets installés vers les dernières versions en installant de nouveaux paquets si nécessaire, par opposition à l’upgrade simple qui n’ajoute pas de nouveaux paquets.
Pour terminer, voici la commande proposée qui combine la mise à jour des dépôts de code et la mise à jour avec dist-upgrade.
1 |
$ sudo apt-get update && sudo apt-get -y dist-upgrade |
Interruption de services lors de la mise à jour
Une fois le processus de mis à jour lancé, une interruption de service pourrait avoir lieu. Par exemple, si le serveur Web Apache est mis à jour, il devra être arrêté et ensuite relancé. Le même problème survient lors de la mise à jour de la base de données comme MySQL. Votre serveur pourrait afficher le message suivant :
Error establishing a database connection
Il est donc recommandé d’appliquer les mises à jour lors d’une période d’affluence minimale. Pour les administrateurs qui appliquent le principe de balance des charges (load balancing), plusieurs serveurs web sont donc disponibles. Il faut donc appliquer les mises à jour serveur après serveur afin d’éviter interruption de service.
Appliquer les mises à jour
La touche finale à votre mise à jour consister à relancer le serveur :
1 |
$ sudo reboot |
Changer de version Ubuntu
Finalement, si vous désirez mettre à jour votre version de Ubuntu, l’option do-release-upgrade est disponible. Cette option vous permettra de passer de la version Ubuntu 14 à Ubuntu 15 par exemple.
1 |
$ sudo do-release-upgrade |
Upgrade the operating system to the latest release from the command-line. This is the preferred command if the machine has no graphic environment or if the machine is to be upgraded over a remote connection.
https://doc.ubuntu-fr.org/apt-get
Identifier les ports ouverts
Pour chaque port ouvert sur votre serveur, vous augmenter les risques d’une attaque fonctionnelle. Il est donc essentiel de connaitre les liste des ports ouverts et de s’assurer qu’il doivent être ouverts.
Identifier les ports ouverts avec nmap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ sudo apt-get install nmap $ nmap localhost Starting Nmap 6.40 ( http://nmap.org ) at 2016-05-02 12:13 EDT Nmap scan report for localhost (127.0.0.1) Host is up (0.0010s latency). Not shown: 993 closed ports PORT STATE SERVICE 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds 631/tcp open ipp 3689/tcp open rendezvous 8000/tcp open http-alt |
Afficher les connexions Internet actives avec netstat
1 2 3 4 5 6 7 8 9 |
$ netstat -atun Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:28017 0.0.0.0:* LISTEN tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN |
Afficher les fichiers ouverts avec lsof
1 2 3 4 5 6 7 8 |
$ lsof -n -i4TCP COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME firefox 7017 g 49u IPv4 545405 0t0 TCP 192.168.0.143:45224->173.194.204.189:https (ESTABLISHED) firefox 7017 g 75u IPv4 542486 0t0 TCP 192.168.0.143:54625->172.217.4.69:https (ESTABLISHED) php 9815 g 7u IPv4 204152 0t0 TCP 127.0.0.1:8000 (LISTEN) chromium- 23616 g 70u IPv4 544338 0t0 TCP 192.168.0.143:34406->96.22.15.24:https (ESTABLISHED) |
lsof -i
1 2 3 4 |
$ lsof -i :8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php 9815 g 7u IPv4 204152 0t0 TCP localhost:8000 (LISTEN) |
Mise en place de règles de pare-feu
Une fois avoir pris connaissance des ports ouverts et des services qui gèrent ces ports, il est important de désactiver les services non utilisés ou de protéger les ports en ajoutant des règles dans votre pare-feu (firewall).
Sur Ubuntu, iptables et ufw sont deux options possibles. Le prochain article présentera quelques éléments de ces pare-feu.
https://help.ubuntu.com/community/UFW
Conclusion
Il ne faut pas sous-estimer les menaces et les esprits malveillants sur le net. Il est temps de prendre les actions nécessaires afin d’éviter qu’un autre prenne le contrôle de votre serveur ou vous le retire.
L’édition mai-juin 2016 de la revue Plan, la revue de l’Ordre des ingénieurs du Québec, soulève la question de la cybersécurité. En faisons-nous assez?
Internet a d’innombrables avantages tant sur la personne que la société. Mais sa grande faiblesse est la sécurité. Dès qu’un serveur, un site ou application est connecté sur le net, il faut qu’il soit au maximum sécurisé. Aujourd’hui, on la crainte tourne autour du vol de données sans oublier les rançongiciels.