, , , , ,

Améliorer la sécurité d’un serveur Ubuntu

améliorer la sécurité d'un serveur Ubuntu

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.

$ 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.

$ 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.

$ lastlog | grep -v Never        # -v, --invert-match

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.

$ 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.

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é.

IP Void IP scan

 

Protéger son accès SSH avec DenyHosts

 

denyhost logo

 

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.

Note

Avant de procéder à ces modifications, s’assurer qu’il est déjà possible de se connecter avec une clé sans mot de passe.

 

$ nano /etc/ssh/sshd_config

Ajouter la ligne suivante :

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 :

PasswordAuthentication no

# Il faut aussi ajouter la ligne suivante :

PermitRootLogin without-password

# Et ensuite la prochaine ligne :

PermitRootLogin yes

# Finalement, relancer le service :

$ service ssh restart

Une erreur de débutant qui peut couter cher

Note

Jouer avec le système d’authentification est risqué. Après avoir ajouté une clé publique au fichier know_host, il faut sauvegardé le fichier en question. La structure du fichier est simple mais importante : chaque ligne contient l’information d’une clé de domaine. Lors de la sauvegarde du fichier avec nano, des retours de chariots ont été ajoutés automatiquement au fichier rendant incompréhensible la nouvelle structure du fichier par le démon SSH. Imaginez perdre l’accès de votre propre serveur par cette erreur de débutant.

 

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é.

Note

Même si ces opérations de mise à jour sont fiables, elles pourraient tout de même rendre votre serveur inutilisable. Il est donc primordial de faire des sauvegardes des configurations et fichiers importants avant de procéder.

Simulation de mise à jour

Avec l’option simulate, il est possible de voir la liste des paquets qui seront mis à jour.

$ apt-get --simulate upgrade

L’option simulate simule la mise à jour des paquets sans réellement les installer.

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.

$ sudo apt-get upgrade

L’option upgrade met à jour tous les paquets installés sur le système vers les dernières versions .

$ 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.

Note

Pour ma part, j’ai sélectionné l’option dist-upgrade qui me garanti que toutes les dépendances nécessaires aux paquets mis à jour seront bien installées.

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.

$ 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 :

$ 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.

$ 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

$ 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

$ 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

$ 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

$ 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?


 

 

 

Facebook Comments

1 réponse
  1. ArkeUp Paris
    ArkeUp Paris dit :

    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.

    Répondre

Laisser un commentaire

Rejoindre la discussion?
N’hésitez pas à contribuer !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.