Comment mettre à jour un serveur Linux qui n’est pas connecté à Internet ?
Sommaire
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
- Configuration réseau :
- 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
- Configuration réseau :
III. Reverse Socks proxy
Pour vous illustrer ce principe de connexion, je vous propose le schéma suivant :
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").
Merci pour ces astuces. Ça pourrait servir.
Merci pour ton retour 🙂
Merci
Bravo, ça c’est du très bon boulot.
Le laboratoire de cybersécurité presque parfait.
Merci pour ton commentaire elogieux 😉
Merci beaucoup, j’avais besoin de plus d’informations pour faire ça et votre article m’a donné tout ce qu’il me fallait, il n’y a plus qu’a tester 😀
Genial, merci pour ton retour !
Bonjour,
merci du tuto qui m’a bien servi !
Une précision sur la version en cours de Ubuntu 22.04 LTS (jammy), le paquet n’est pas en version 1.8.5.
Il faut récupérer la version pour kinetic : https://packages.ubuntu.com/kinetic/apt-offline
wget http://fr.archive.ubuntu.com/ubuntu/pool/universe/a/apt-offline/apt-offline_1.8.5-1_all.deb
sudo dpkg -i *.deb
Dans le tuto j’ai vu une petite coquille :
sudo apt-offline get –bundle bundle_update_upgrade.zip update_upgrade.zip
sudo apt-offline get –bundle bundle_update_upgrade.zip update_upgrade.sig