Introduction
La configuration de l’application est déjà en lecture seule, mais celle-ci tourne encore en root. Vous assurez sa maintenance et choisissez l’utilisateur préparé tout en préservant la génération réelle de documents.
Cet environnement indépendant dispose de son propre conteneur et de ses données. Vous examinerez l’UID et le propriétaire de la sortie, modifierez le format de lancement déjà pratiqué, puis recréerez et testerez le service. Terminez d’abord Protéger la configuration montée.
Découvrir l’utilisateur applicatif
Dans cette étape, établissez le fonctionnement normal et distinguez l’utilisateur de maintenance de celui du processus du conteneur. Ce nouvel environnement possède déjà un montage de configuration en lecture seule, mais le générateur tourne encore en root.
Utilisez Maintenance, qui démarre dans /home/labex/project/report-desk. Ce terminal gère uniquement le conteneur préparé report-renderer. Au besoin, revenez avec cd /home/labex/project/report-desk. sudo docker exec demande à Docker d’exécuter une commande dans la cible. id affiche les identifiants numériques d’utilisateur (UID) et de groupe (GID) :
sudo docker exec report-renderer id
uid=0(root) gid=0(root) groups=0(root)
L’UID 0 est root dans ce conteneur. Il possède plus de droits sur les fichiers accessibles que nécessaire. Le root du conteneur n’administre pas une VM distincte : les conteneurs partagent le noyau de l’hôte. L’exercice réduit l’accès aux fichiers, sans résoudre tous les risques des conteneurs.
L’identité préparée est l’UID/GID 1200:1200. Ces identifiants fonctionnent sans ajouter de compte nommé dans l’image. Le propriétaire du répertoire de l’hôte doit autoriser cet utilisateur à écrire. ls -ldn affiche le répertoire lui-même (-d), les permissions détaillées (-l) et les identifiants numériques (-n) :
ls -ldn output
Repérez drwxr-xr-x et le propriétaire/groupe 1200 1200. Le propriétaire a rwx : lecture, écriture et traversée du répertoire. Les autres ont r-x : lecture et traversée, sans écriture. L’environnement a préparé ce répertoire pour l’identité prévue.
Générez un document de référence avec la requête POST déjà pratiquée. curl -fsS signale les erreurs HTTP, et -X POST demande l’action métier :
curl -fsS -X POST http://localhost:8090/render/baseline
{"saved": "/output/baseline.json", "total": 37, "uid": 0}
Le rapport fonctionne, mais l’UID 0 l’a produit. Ouvrez Document Desk pour voir le document enregistré ; la page liste les vrais fichiers de sortie.
Choisir l’identité préparée
Dans cette étape, changez l’identité dans la déclaration de lancement en conservant l’accès nécessaire au système de fichiers. cat affiche le script :
cat launch.sh
sudo autorise l’administration de l’hôte. Séparément, --user détermine l’utilisateur et le groupe de l’application du conteneur. 0:0 signifie UID 0 et GID 0 ; 1200:1200 sélectionne l’identité préparée. Conservez le port 8090, l’image et les deux chemins de montage. La ligne de configuration contient déjà dst=/config,readonly ; la sortie doit rester accessible en écriture.
Ouvrez l’éditeur de terminal :
nano launch.sh
Avec les flèches, remplacez uniquement --user 0:0 par --user 1200:1200. Enregistrez avec Ctrl+O, Enter, puis quittez avec Ctrl+X. Affichez encore le fichier :
cat launch.sh
La ligne d’utilisateur doit être :
--user 1200:1200 \
Modifier la déclaration ne met pas à jour le processus actif. Avant la recréation, fixez explicitement le propriétaire prévu du répertoire de sortie. chown définit le propriétaire et le groupe numériques ; sudo est nécessaire car ils diffèrent de l’utilisateur de maintenance de l’hôte. Cela touche uniquement le répertoire, pas tous ses fichiers existants :
sudo chown 1200:1200 output
Ne rendez pas tout accessible en lecture seule : la création de documents nécessite d’écrire la sortie. N’accordez pas non plus l’écriture à tout le monde pour contourner la propriété ; le propriétaire préparé peut écrire avec les permissions actuelles 755.
Recréer et préserver le résultat métier
Dans cette étape, appliquez la nouvelle identité et testez la sortie normale ainsi que la limite protégée des entrées. Comme précédemment, supprimez uniquement le conteneur cible et lancez son remplaçant :
sudo docker rm -f report-renderer
bash launch.sh
Si le lancement échoue, corrigez launch.sh avec nano, supprimez la cible en échec avec la même commande et relancez le script. Les données de l’hôte restent en place. Vérifiez l’identité active :
sudo docker exec report-renderer id
uid=1200 gid=1200 groups=1200
Laissez un instant au démarrage, puis générez le document final :
curl -fsS -X POST http://localhost:8090/render/final
{"saved": "/output/final.json", "total": 37, "uid": 1200}
Permission denied indique généralement un mauvais propriétaire du répertoire ou un final.json créé auparavant par root. Corrigez le répertoire avec sudo chown 1200:1200 output. Si un ancien fichier final existe, sudo rm output/final.json supprime uniquement ce document généré ; redemandez-le. Read-only file system pour /output signifie que vous avez restreint la sortie par erreur : corrigez la déclaration et recréez le conteneur.
Examinez le fichier généré. ls -ln affiche le propriétaire numérique ; cat affiche le contenu :
ls -ln output/final.json
cat output/final.json
Repérez le propriétaire 1200, "uid": 1200, le total 37 et Report for Harbor Books: 37 orders. Actualisez Document Desk pour voir le fichier. Confirmez enfin le maintien de la protection de configuration :
sudo docker exec report-renderer touch /config/probe.txt
touch: /config/probe.txt: Read-only file system
Cet échec est attendu. L’identité non root et le montage en lecture seule traitent des problèmes distincts : choisir l’UID réduit les droits du processus, tandis que le montage bloque l’écriture de configuration même pour root dans le conteneur. Le générateur accomplit toujours sa vraie tâche.
Résumé
Vous avez distingué l’accès de maintenance de l’hôte de l’identité applicative, choisi l’UID/GID 1200 et conservé le répertoire de sortie. Le processus et le nouveau document utilisent désormais l’UID 1200, tandis que les écritures de configuration restent refusées.



