Protéger la configuration montée

DockerBeginner
Pratiquer maintenant

Introduction

Un service de rapports doit lire sa configuration et écrire des documents, mais son montage de configuration autorise aussi les écritures. Vous assurez sa maintenance et réduisez cet accès inutile tout en préservant la génération de rapports.

Vous générerez d’abord un rapport normal, protégerez le montage d’entrée et recréerez uniquement le conteneur de rapports. Une connaissance élémentaire du terminal suffit ; Docker, la syntaxe des montages et l’édition sont expliqués avant utilisation.

Générer un rapport normal

Dans cette étape, exécutez la tâche métier normale avant de modifier les permissions. Harbor Books utilise un petit service pour totaliser des commandes et produire un document. Les clients et les nombres sont des données synthétiques de formation.

Utilisez le terminal Maintenance, un rôle de maintenance de l’hôte Linux disposant d’un accès à l’administration Docker. Docker lance les processus dans des conteneurs : chacun voit son système de fichiers et sa liste de processus, tout en partageant le noyau de l’hôte. Un conteneur n’est pas une autre VM. Gérez uniquement report-renderer et les fichiers de /home/labex/project/report-desk.

Le terminal démarre dans ce répertoire. pwd affiche le répertoire actuel :

pwd

Le résultat doit être /home/labex/project/report-desk. Si vous avez changé de répertoire, revenez avec cd /home/labex/project/report-desk.

L’application écoute sur le port 8090. Un port identifie un service ; localhost désigne ici l’hôte de maintenance, dont Docker redirige le port vers le conteneur. curl envoie une requête HTTP, -X POST sélectionne une requête d’action, et -fsS affiche les erreurs en gardant une sortie de réussite concise. Demandez le document de référence :

curl -fsS -X POST http://localhost:8090/render/baseline
{"saved": "/output/baseline.json", "total": 37, "uid": 0}

Le service a lu l’entrée et enregistré un vrai fichier. cat affiche un fichier ; l’hôte voit /output du conteneur dans son répertoire local output :

cat output/baseline.json

Repérez Report for Harbor Books: 37 orders. Les autres champs identifient l’entrée et l’instance du service. Ouvrez Document Desk et actualisez : baseline.json apparaît sous Stored documents. Cette page liste les fichiers réels, sans certifier la sûreté des permissions.

Protéger la déclaration d’entrée

Dans cette étape, reliez les chemins d’entrée et de sortie, démontrez une écriture inutile et modifiez la déclaration de lancement. Un montage bind relie un répertoire de l’hôte à un chemin dans le conteneur. Il est accessible en écriture sauf restriction explicite.

cat launch.sh affiche le script Bash préparé :

cat launch.sh

Une barre oblique inverse poursuit la commande sur la ligne suivante. sudo administre Docker avec les droits de l’administrateur de l’hôte ; il ne détermine pas l’utilisateur applicatif. docker run -d lance le conteneur en arrière-plan, --name le nomme, --user 0:0 sélectionne les identifiants utilisateur/groupe et -p 8090:8090 redirige le port de l’hôte vers celui du conteneur. Le dernier argument est l’image préparée c12-renderer:1.

Chaque --mount comporte des champs séparés par des virgules : type=bind relie un chemin de l’hôte, src est ce chemin et dst celui du conteneur.

Répertoire de l’hôte Répertoire du conteneur Accès requis
report-desk/config /config Lire le lot et le modèle
report-desk/output /output Écrire les documents générés

La configuration contient probe.txt, un échantillon jetable sans données métier. docker exec exécute une commande dans le conteneur nommé en cours d’exécution. touch actualise l’horodatage de l’échantillon ; cet accès applicatif est volontairement inutile :

sudo docker exec report-renderer touch /config/probe.txt

L’absence de sortie indique la réussite. Cela démontre un montage de configuration accessible en écriture sans endommager le lot ni le modèle. Modifier la déclaration de l’hôte change le prochain conteneur créé par Docker ; éditer un fichier dans le conteneur actuel ne change pas son mode de montage.

Utilisez l’éditeur de terminal nano :

nano launch.sh

Déplacez-vous avec les flèches. Sur la ligne contenant dst=/config, ajoutez ,readonly immédiatement après /config, avant l’espace et la barre oblique inverse. Conservez /output accessible en écriture. Enregistrez avec Ctrl+O, Enter, puis quittez avec Ctrl+X. La ligne devient :

  --mount type=bind,src=/home/labex/project/report-desk/config,dst=/config,readonly \

Affichez à nouveau cat launch.sh pour repérer une virgule ou une barre oblique inverse manquante. Rouvrez nano launch.sh pour corriger une faute. Le conteneur actif conserve son ancien montage ; l’étape suivante le remplace.

Appliquer et tester la limite du montage

Dans cette étape, remplacez uniquement le conteneur de rapports et démontrez que le refus d’écriture sur les entrées préserve une sortie fonctionnelle. Modifier le script ne met pas à jour un conteneur existant.

docker rm -f arrête et supprime le conteneur nommé. Les répertoires de l’hôte liés par montage bind sont conservés. bash launch.sh exécute la déclaration modifiée :

sudo docker rm -f report-renderer
bash launch.sh

La seconde commande affiche un nouvel identifiant. Laissez un instant au démarrage. En cas d’erreur de syntaxe ou de montage, corrigez la ligne avec nano launch.sh, supprimez tout nouveau report-renderer avec la même commande de suppression et relancez le script. Ne supprimez pas les répertoires de données de l’hôte.

docker inspect lit les paramètres réels. --format sélectionne un champ ; conservez les apostrophes pour transmettre les accolades sans modification par le shell :

sudo docker inspect report-renderer --format '{{json .Mounts}}'

Repérez "Destination":"/config" avec "RW":false, et /output avec "RW":true. RW signifie lecture/écriture. Confirmez la limite réelle avec le même échantillon :

sudo docker exec report-renderer touch /config/probe.txt
touch: /config/probe.txt: Read-only file system

Ce code de sortie non nul est attendu. Le terminal reste utilisable ; poursuivez avec la commande suivante. Une erreur de connexion ou un conteneur absent est différente et nécessite de corriger ou relancer le script.

Demandez un nouveau document au service recréé :

curl -fsS -X POST http://localhost:8090/render/final
{"saved": "/output/final.json", "total": 37, "uid": 0}
cat output/final.json

Le document contient toujours Report for Harbor Books: 37 orders. Actualisez Document Desk pour voir final.json. Le service lit ses entrées et écrit ses sorties, tandis que le montage de configuration refuse les écritures. Il tourne encore en root ; le prochain laboratoire indépendant traite cette autre permission.

Résumé

Vous avez généré un vrai rapport, relié les chemins de l’hôte et du conteneur, rendu le montage d’entrée accessible en lecture seule et recréé le service. L’inspection réelle du montage et une écriture refusée confirment la protection ; un nouveau rapport confirme le bon fonctionnement de la sortie.