17/11/2024

Commandes et SystèmeLinux

Comment mettre à jour un serveur Linux qui n’est pas connecté à Internet ?

I. Présentation

Mettre à jour un serveur Linux qui n'est pas connecté à internet peut sembler être une tâche difficile, mais il existe plusieurs techniques pour maintenir votre système à jour même sans connexion à internet.

Dans cet article, je vais vous montrer deux méthodes pour mettre à jour un serveur Linux "offline" (Debian Familly), à savoir :

  • En utilisant une connexion reverse SOCKS proxy avec SSH afin de permettre à notre serveur d'accéder à internet temporairement uniquement à travers notre Proxy SOCKS
  • Via l'utilitaire apt-offline

II. Propos liminaires et prérequis

Il y a plusieurs raisons pour lesquelles certains serveurs ne doivent pas être connectés à Internet :

  • Sécurité : certains serveurs contiennent des informations sensibles ou confidentielles qui ne doivent pas être exposées à Internet. En les isolant du réseau public, on peut réduire les risques de piratage ou d'intrusion.
  • Conformité : des serveurs peuvent être utilisés pour stocker des informations qui doivent respecter des normes de sécurité ou de confidentialité spécifiques, telles que les données de cartes de crédit ou les dossiers médicaux. En les isolant d'Internet, on peut garantir qu'ils respectent ces normes.
  • Fiabilité : certains hôtes peuvent être utilisés pour des applications critiques qui ne doivent pas être interrompues (chaines de production...). En les isolant d'Internet, on peut minimiser les risques de perturbations ou de panne de service.

Dans mon cas, voilà les machines qui composeront mon petit lab' pour la démonstration :

Un hyperviseur (type 2) VMware Workstation

  • Un client Linux (Kali Linux dans mon cas. Il sera parfois nommé Hôte A, pour éviter les répétitions)
    • Configuration réseau :
      • eth0 : 192.168.130.128/24 - vmnet 8 - Accès à internet
      • eth1 : 192.168.24.128/24 - vmnet 2 - Réseau local, sans accès à internet
  • Un serveur Linux (Ubuntu dans mon cas. Il sera parfois nommé Hôte B, pour éviter les répétitions)
    • Configuration réseau :
      • eth0 : 192.168.24.129/24 - vmnet2 - Réseau local, sans accès à internet

III. Reverse Socks proxy

Pour vous illustrer ce principe de connexion, je vous propose le schéma suivant :

Mettre à jour serveur Linux via proxy socks

A. Mise en place du proxy inverse

Dans un premier temps, je vais me connecter en SSH à ce serveur depuis ma machine kali  :

ssh [email protected]

Par défaut, sur ce serveur, je n'ai pas accès à internet comme le prouve la capture suivante :

Afin d'ouvrir un accès provisoire à internet, je vais instancier un reverse proxy socks, pour créer un "tunnel réseau temporaire" entre la machine cliente (Kali) et mon serveur (Ubuntu).

La commande suivante équivaut à dire : "Je veux établir un reverse proxy socks entre mon server (ici : ubuntu) et ma machine cliente (kali), afin de faire transiter tout ou partie de mon traffic réseau via cette connexion".

ssh -D 1337 -q -C -N -f [email protected]

Voici une description des options utilisées dans cette commande SSH :

  • -D : permet de configurer un proxy SOCKS* local sur le port spécifié (1337 dans cet exemple). Cela permet aux applications de se connecter à Internet en passant par ce proxy SOCKS.
  • -q : mode non-verbeux, q pour "quiet"
  • -C : compresse les données transmises. Cela améliore les performances pour les connexions à bas débit.
  • -N : indique à SSH de ne pas exécuter de commandes à distance. Elle doit être utilisée pour les connexions de tunneling uniquement.
  • -f : met en arrière-plan la connexion SSH courante après l'authentification.

Quant à SOCKS : Protocole de "proxy" (couche session (5) du modèle OSI) qui permet à des clients d'envoyer des requêtes à travers un serveur "intermédiaire" aussi appelé mandataire pour atteindre des serveurs distants / internet. Avec SOCKS, vous pouvez encapsuler la majorité des protocoles "commun" comme HTTP, FTP, SSH, etc.

Afin de vérifier si la connexion s'est correctement établie entre les deux hôtes, vérifiez si le port local est bien ouvert, en exécutant la commande suivante sur l'hôte B :

nc -zv localhost 1337

La connexion a bien été établie ! Maintenant, si je souhaite avoir accès à un site web, il me suffit de "proxyfier" ma commande. Voici un exemple avec la commande curl pour atteindre une page web.

curl -x socks5h://localhost:1337 http://google.com/ | head

B. Mise à jour du serveur à travers le reverse proxy socks

Pour mettre à jour mon serveur avec apt voici comment je vais procéder.

Je vais créer le fichier /etc/apt/apt.conf.d/proxy.conf avec le contenu suivant afin d'indiquer à apt que je souhaite que les processus de mise à jour ce fasse à travers ce proxy :

Une fois que les modifications ont été enregistrés, il ne me reste plus qu'a tester si la mise à jour des référentiels distant fonctionne :

sudo apt update

Et voilà.

Pour les pentester en herbe, je vous invite à garder cet exemple dans un coin de votre tête, cette méthode pourrait vous être fort utile dans un contexte de pivoting.

IV. apt-offline

apt-offline est un outil de ligne de commande qui permet de mettre à jour et d'installer des paquets sur un système Debian ou Ubuntu qui n'est pas connecté à internet. Cependant, ce paquet n'est pas nativement présent... bien dommage car de ce fait vous êtes obligé de récupérer ce paquet en connectant votre machine à internet "directement" au moins une fois. J'espère que cet outil sera présent nativement sur les prochaines versions.

Je vais donc installer ce paquet sur mes deux machines :

sudo apt update && sudo apt install apt-offline

voici en quelques lignes comment cela fonctionne :

  • Depuis la machine déconnectée, apt-offline génère un fichier au format .sig qui contient toutes les meta-données nécessaires pour mettre à jour ou installer des paquets, y compris toutes les dépendances associés au(x) paquet(s).
  • Ce fichier doit être par la suite transféré sur votre machine - disposant d'une connexion internet et du paquet apt-offline - afin de générer un fichier "bundle" (.zip). Celui-ci contiendra tous les artefacts liés aux mises à jour / installation de paquet(s).
  • Ensuite, il suffit d'effectuer le transfert de ce fichier .zip de nouveau vers votre machine déconnectée d'internet et de lancer le processus de mise à jour depuis le fichier "bundle" au format ZIP.

Nous avons vu la théorie, maintenant passons à la pratique !

Remarque : si vous testez cette méthode après avoir fait la première, je vous invite à supprimer le fichier que nous avons crée précédemment dans le but d'éviter tout comportement hasardeux d'apt (fichier : /etc/apt/apt.conf.d/proxy.conf)

A. Mise à jour des référentiels apt

Générez le fichier .sig depuis le serveur "déconnecté" comme cela :

sudo apt-offline set --update apt-offline-update.sig

Dès lors, transférez ce fichier sur votre machine disposant d'internet (et du paquet apt-offline) afin de lancer le processus de mise à jour.

sudo apt-offline get --bundle bundle-update.zip apt-offline-update.sig

Une fois que le processus est terminé, on peut constater que le fichier bundle-update.zip a bien été crée. Il représente l'empactement des "artefact" des mise à jour pour notre serveur ubuntu déconnecté. Nous devons transférer ce fichier (dans mon cas bundle-update.zip) sur le serveur distant, à travers l'une des méthodes suivantes (liste non exhaustive) :

  • ftp
  • sftp/scp
  • support physique

Je n'ai plus qu'à copier ce fichier sur machine "déconnectée", puis à réaliser l'extraction des artefacts de mise à jour en saisissant :

sudo apt-offline install bundle-update.zip

B. Mise à niveau de votre système

Pour mettre à niveau votre système, voici comment il faut procéder :

Générez le fichier descriptif update_upgrade.sig depuis l'hôte B.

Après le transfert du fichier .sig de l'hôte B vers l'hôte A, vous devez empaqueter les mises à jour dans le fichier bundle_update_upgrade.zip :

sudo apt-offline get --bundle bundle_update_upgrade.zip update_upgrade.zip 

Puis, réalisez l'extraction des mises à jour afin de les insérer provisoirement dans le cache d'apt de l'hôte B.

sudo apt-offline install bundle_update_upgrade.zip

On termine par la mise à jour de l'hôte B :

sudo apt upgrade

C. Installation d'un package

Pour installer un package, voici comment procéder. Dans cet exemple, je souhaite installer le package fortune :

sudo apt-offline set --install-packages fortune --update apt-offline-update-install-fortune.sig

Depuis l'hôte A disposant d'une connexion internet :

sudo apt-offline get --bundle bundle-update-install-fortune.zip apt-offline-update-install-fortune.sig

Transférez le fichier .zip sur votre "hôte déconnecté", et lancez le processus d'extraction (les données concernant la mise à jour seront insérées dans le cache du processus apt) :

sudo apt-offline install bundle-update-install-fortune.zip

Dès lors, vous pouvez installer le paquet fortune via la commande suivante :

sudo apt install fortune

V. Conclusion

En fonction de votre contexte technique et de vos contraintes, si vous souhaitez mettre un jour un serveur qui est déjà dans un environnement de production "déconnecté" d'internet, utilisez la première méthode.

Pour un serveur qui va être mis en production (et qui peut encore bénéficier d'un accès à la toile), préférez la deuxième option et installez le paquet apt-offline en amont. Je le répète mais c'est bien dommage que apt-offline ne soit pas un paquet installé nativement chez Ubuntu (22.04) pour le moment (ce n'est peut être pas le cas pour les autres distribution de la "Debian Family").

author avatar
Geoffrey Sauvageot-Berland Ingénieur Cybersécurité
Ingénieur diplômé par l’état en Informatique et Cybersécurité. Généraliste, à l'origine administrateur systèmes et réseaux, j’occupe actuellement un poste d’auditeur en sécurité offensive. J’apprécie également la programmation/automatisation. Fondateur du blog : "Le Guide du SecOps", anciennement "Le Guide du SysOps"
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

8 commentaires sur “Comment mettre à jour un serveur Linux qui n’est pas connecté à Internet ?

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 comment les données de vos commentaires sont utilisées.