SCHROOT(1) | 2014 | SCHROOT(1) |
schroot — entrer de manière sécurisée dans un environnement de chroot
schroot [-h|--help | -V|--version | -l|--list | -i|--info | --config | --location | --automatic-session | -b|--begin-session | --recover-session | -r|--run-session | -e|--end-session] [-f|--force] [-n nom-de-session|--session-name=nom-de-session] [-d répertoire|--directory=répertoire] [-u utilisateur|--user=utilisateur] [-u utilisateur|--user=utilisateur] [-p|--preserve-environment][-s shell|--shell=shell] [-q |--quiet | -v|--verbose] [-c chroot|--chroot=chroot | --all | --all-chroots | --all-source-chroots | --all-sessions] | --exclude-aliases [-o|--option=clé=valeur] [--] [COMMANDE [ ARG1 [ ARG2 [ ARGn]]]]
schroot autorise l'utilisateur à exécuter une commande ou un interpréteur de commande de connexion dans un environnement de chroot. Si aucune commande n'est précisée, un interpréteur de commande de connexion sera démarré dans le répertoire de travail courant de l'utilisateur à l'intérieur du chroot.
La commande est un programme plus autant d'arguments optionnels que requis. Chaque argument doit être déclaré séparément.
Le répertoire dans lequel la commande ou l'interpréteur de commande de connexion sont exécutés dépend du contexte. Voir l'option --directory ci-dessous pour une description complète.
Toute utilisation de chroot sera enregistrée dans les journaux du système. Dans certaines circonstances, l'utilisateur pourrait devoir s'identifier ; consultez la section “Authentification” ci-dessous.
Si aucun chroot n'est spécifié, le nom de chroot ou alias ‘default’ sera utilisé à la place. Cela est équivalent à “--chroot=default”.
Il est souvent nécessaire d'exécuter des programmes dans des environnements virtualisés plutôt que directement sur le système hôte. À la différence des autres systèmes de virtualisation comme kvm ou Xen, schroot ne virtualise pas le système en entier ; il virtualise seulement le système de fichiers, et certaines parties du système de fichiers peuvent toujours être partagées avec l'hôte. Il est par conséquent rapide, léger et flexible. Cependant, il ne virtualise pas les autres aspects du système, comme la mémoire partagée, le réseau, les périphériques, etc., et par conséquent peut être moins sécurisé que d'autres systèmes, en fonction de l'utilisation voulue. Des exemples d'utilisations connues de schroot sont :
Un chroot peut être utilisé directement en exécutant chroot(8), mais les utilisateurs standard ne sont pas autorisés à exécuter cette commande. schroot autorise l'accès à des chroots pour des utilisateurs normaux en utilisant le même mécanisme, mais avec plusieurs caractéristiques supplémentaires. Alors que schroot utilise un répertoire comme chroot exactement comme chroot(8), il n'a pas besoin que celui-ci soit un répertoire ordinnaire du système de fichier. Bien que cela soit la valeur par défaut, le chroot peut également être créé à partir d'un fichier, d'un système de fichiers, incluant les instantanés LVM et Btrfs et les montages « loopback », ou composé d'une surcouche unionfs. schroot étant extensible par l'utilisateur, les possibilités de création de chroot provenant de sources différentes ne sont limités que par votre imagination. schroot effectue des vérifications de permission et autorise des mises en place automatiques supplémentaires de l'environnement de chroot, comme le montage de systèmes de fichiers supplémentaires et d'autres tâches de configuration. Cette mise en place automatique est faite par l'action de scripts de mise en place qui peuvent être configurés et étendus pour effectuer toute action nécessaire. Les actions typiques incluent le montage du répertoire personnel de l'utilisateur, la configuration du réseau et des bases de données du système et même le démarrage de services. Ils sont également entièrement personnalisables par l'administrateur. Les scripts de mise en place sont exécutés pour tous les types de chroot, à l'exception de ceux de type ‘plain’, le type de chroot le plus simple qui ne permet aucune mise en place automatique. La configuration de schroot est décrite plus en détail dans schroot.conf(5).
schroot accepte les options suivantes :
Si l'utilisateur n'est pas un utilisateur autorisé, ou membre d'un groupe autorisé (ou en cas de changement vers root, un utilisateur root autorisé ou un groupe root autorisé) pour le chroot spécifié, les permissions seront immédiatement refusées. En cas de changement d'utilisateur et si l'utilisateur exécutant la commande y est autorisé, l'utilisateur devra s'authentifier lui-même en utilisant les identifiants de l'utilisateur vers lequel le changement sera fait.
Pour les systèmes prenant en charge le système d'authentification « Pluggable Authentication Modules » (PAM), schroot utilisera PAM pour l'authentification et l'autorisation des utilisateurs. Si besoin, schroot demandera un mot de passe. Si PAM n'est pas disponible, toutes les authentifications échoueront automatiquement (le changement d'utilisateur sans PAM n'est pas pris en charge).
Notez que quand PAM est utilisé, l'utilisateur root n'obtiendra aucun privilège particulier par défaut dans le programme. Cependant, la configuration par défaut de PAM permet à root de se connecter sans mot de passe (pam_rootok.so), mais cela peut être désactivé pour empêcher root d'accéder à des chroots quelconques sauf ceux spécifiquement permis. Dans une telle situation, root doit être ajouté aux utilisateurs ou groupes autorisés comme n'importe quel utilisateur ou groupe. Si PAM n'est pas disponible, l'utilisateur root pourra accéder à tous les chroots, même non explicitement autorisé.
Il y a trois types de chroot différents : les chroots ordinnaires, les chroots source et les chroots session. Ces différents types de chroot sont séparés dans différents espaces de noms. Un espace de noms est un préfixe à un nom de chroot. Pour le moment, il y a trois espaces de noms : ‘chroot:’, ‘source:’ et ‘session:’. Utilisez --list --all pour lister tous les chroots disponibles dans tous les espaces de noms. Parce que ‘:’ est utilisé comme séparateur entre l'espace de noms et les noms de chroots, il n'est pas permis d'utiliser ce caractère dans les noms de chroot.
En fonction de l'action que vous demandez à schroot d'exécuter, celui-ci peut rechercher le chroot dans l'un de ces trois espaces de noms, ou un espace de noms particulier peut être spécifié. Par exemple, un chroot nommé “sid” est en fait nommé “chroot:sid” si l'espace de noms est inclus, mais l'espace de noms peut être omis pour la plupart des actions.
Certains types de chroot, par exemple les instantanés LVM ou Btrfs, fournissent des instantanés du chroot de type « copie en cas d'écriture » contrôlés par la session. Ils fournissent également un chroot source pour permettre un accès facile au système de fichiers utilisé comme source de création d'instantané. Ce sont des chroots ordinaires également, mais désactivant la création d'instantané. Pour un chroot nommé “sid-snapshot” (c'est-à-dire avec “chroot:sid-snapshot” comme nom complet qualifié), il y aura également un chroot source nommé “source:sid-snapshot”. Les versions précédentes de schroot fournissent des chroots source avec un suffixe ‘-source’. Ces suffixes sont également fournis à des fins de compatibilité. Dans notre exemple il serait appelé “chroot:sid-snapshot-source”. Cette dénomination de compatibilité sera abandonnée dans une version future, les programmes et les scripts devraient donc être modifiés pour utiliser des noms utilisant les espaces de noms au lieu des vieux suffixes.
Toute session créée avec l'option --begin-session est placée dans l'espace de noms ‘session:’. Une session nommée avec --session-name peut avoir différents noms, même un nom identique au chroot à partir duquel elle a été créée, à condition qu'il soit unique dans l'espace de noms. Cela n'était pas permis dans les versions précédentes de schroot qui n'avaient pas d'espaces de noms.
Toutes les actions utilisent ‘chroot:’ comme espace de noms par défaut, avec quelques exceptions pour des actions de sessions. --run-session, --recover-session et --end-session utilisent ‘session:’ comme espace de noms par défaut, car ces actions agissent sur les chroots session. Le résultat est que l'espace de noms n'est normalement jamais requis, sauf quand vous avez besoin de travailler avec un chroot dans un espace de noms différent de celui par défaut, comme lorsque vous utilisez un chroot source. Pour effectuer une sélection de chroot sans ambigüité, il est toujours possible d'utiliser le nom complet incluant l'espace de noms, même quand cela n'est pas strictement nécessaire.
Les performances sur certains systèmes de fichiers, par exemple Btrfs, sont mauvaises lors de l'utilisation de dpkg à cause de la quantité d'opérations fsync à effectuer. Cela peut être limité par l'installation du paquet eatmydata et ensuite par l'ajout de eatmydata à la clé de configuration command-prefix, ce qui désactivera toutes les opérations fsync. Notez que cela ne doit être effectué que dans les chroots d'instantanés où la perte de données n'est pas un problème. C'est utile lors de l'utilisation d'un chroot pour une construction de paquets, par exemple.
Schroot sélectionnera un répertoire approprié à utiliser à l'intérieur du chroot si un interpréteur de commande de connexion est utilisé ou une commande exécutée et également si l'option --directory est utilisée. Dans le cas de l'exécution directe ou en spécifiant explicitement un répertoire, seulement un répertoire sera utilisé par mesure de sécurité et de cohérence, alors que pour un interpréteur de commande de connexion plusieurs possibilités peuvent être testées. La sous-section suivante liste la séquence de substitution pour chaque cas. CWD est le répertoire de travail courant, DIR est le répertoire spécifié par --directory.
Transition | |
(Hôte → Chroot) | Commentaire |
CWD → CWD | Comportement normal (si --directory n'est pas utilisé) |
CWD → $HOME | Si CWD n'existe pas et --preserve-environment est utilisé |
CWD → passwd pw_dir | Si CWD n'existe pas (ou --preserve-environment est utilisé et aucun $HOME n'existe) |
CWD → / | Aucun des répertoires ci-dessus n'existe |
FAIL | Si / n'existe pas |
Transition | |
(Hôte → Chroot) | Commentaire |
CWD → CWD | Comportement normal (si --directory n'est pas utilisé) |
FAIL | Si CWD n'existe pas |
Aucune solution de repli ne devrait exister en toute circonstance.
Transition | |
(Hôte → Chroot) | Commentaire |
CWD → DIR | Comportement normal |
FAIL | Si CWD n'existe pas |
Aucune solution de repli ne devrait exister en toute circonstance.
Notez que --debug=notice affichera la liste interne des répertoires de repli calculée pour la session.
% schroot -l↵
chroot:default
chroot:etch
chroot:sid
chroot:testing
chroot:unstable
% schroot -i -c sid↵
——— Chroot ———
Name sid
Description Debian sid (unstable)
Type plain
Priority 3
Users rleigh
Groups sbuild
Root Users
Root Groups sbuild
Aliases unstable unstable-sbuild unstable-p owerpc-sbuild
Environment Filter ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|I\ FS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMA\ IN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TE\ RMPATH)$
Run Setup Scripts true
Script Configuration script-defaults
Session Managed true
Personality linux32
Location /srv/chroot/sid
Utilisez --all ou -c plusieurs fois pour utiliser plusieurs ou tous les chroots respectivement.
% schroot -c sid /bin/ls↵ [sid chroot] Running command: “/bin/ls” CVS sbuild-chroot.c sbuild-session.h schroot.conf.5 Makefile sbuild-chroot.h schroot.1 schroot.conf.5.in Makefile.am sbuild-config.c schroot.1.in Makefile.in sbuild-config.h schroot.c pam sbuild-session.c schroot.conf % schroot -c sid -- ls -1 | head -n 5↵ [sid chroot] Running command: “ls -1” ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL
Utilisez -- pour autoriser les options débutant avec ‘-’ ou ‘--’ pour la commande à exécuter dans le chroot. Cela empêche qu'elles soient interprétées en tant qu'options de schroot. Notez que la première ligne a été affichée sur l'erreur standard et le reste sur la sortie standard. C'est intentionnel, pour que la sortie du programme exécuté dans le chroot puisse être redirigée à l'aide d'un pipe si besoin ; les données seront les mêmes que si la commande était exécutée directement sur le système hôte.
% schroot -c sid -u root↵
Password:
[sid chroot] (rleigh→root) Running login shell: “/bin/bash”
#
Si l'utilisateur ‘rleigh’ était dans root-users de /etc/schroot/schroot.conf, ou un des groupes auxquels il appartient était dans root-groups, un accès root lui sera fourni sans authentification, mais l'étape d'autorisation PAM est toujours appliquée.
Un chroot peut être nécessaire pour exécuter plus d'une commande. En particulier, quand le chroot est créé à la volée à partir d'un volume logique LVM ou d'un fichier sur le disque, il est nécessaire de rendre le chroot persistant pendant qu'une tâche donnée (ou un jeu de tâches) est exécutée. Les sessions existent pour cette raison. Pour les chroots de type simple comme ‘plain’ et ‘directory’, des sessions peuvent être créées mais ne sont pas strictement nécessaires.
Commençons par examiner un chroot capable d'utiliser des sessions :
% schroot -i -c sid-snap↵
——— Chroot ———
Name sid-snap
Description Debian sid snapshot
Type lvm-snapshot
Priority 3
Users maks rleigh
Groups sbuild
Root Users
Root Groups root sbuild
Aliases
Environment Filter ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|I\ FS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMA\ IN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TE\ RMPATH)$
Run Setup Scripts true
Script Configuration script-defaults
Session Managed true
Personality linux
Device /dev/hda_vg/sid_chroot
Mount Options -o atime,async,user_xattr
Source Users
Source Groups root rleigh
Source Root Users
Source Root Groups root rleigh
LVM Snapshot Options --size 2G -c 128
Notez que l'option Session Managed est définie à ‘true’. Cela est requis pour utiliser le gestionnaire de session et est pris en charge par la plupart des types de chroot. Ensuite nous allons créer une nouvelle session :
% schroot -b -c sid-snap↵
sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f
L'identifiant de session de la session nouvellement créée est renvoyé sur la sortie standard. Il est habituel de le conserver comme ceci :
% SESSION=$(schroot -b -c sid-snap)↵ % echo $SESSION↵ sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f
La session peut être utilisée comme n'importe quel chroot. Voici à quoi ressemble la session :
% schroot -i -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f↵
——— Session ———
Name sid-snap-46195b04-0893-49bf-beb8-0d\ 4ccc899f0f
Description Debian sid snapshot
Type lvm-snapshot
Priority 3
Users maks rleigh
Groups sbuild
Root Users
Root Groups root sbuild
Aliases
Environment Filter ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|I\ FS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMA\ IN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TE\ RMPATH)$
Run Setup Scripts true
Script Configuration script-defaults
Session Managed true
Personality linux
Mount Location /var/lib/schroot/mount/sid-snap-461\ 95b04-0893-49bf-beb8-0d4ccc899f0f
Path /var/lib/schroot/mount/sid-snap-461\ 95b04-0893-49bf-beb8-0d4ccc899f0f
Mount Device /dev/hda_vg/sid-snap-46195b04-0893-\ 49bf-beb8-0d4ccc899f0f
Device /dev/hda_vg/sid_chroot
Mount Options -o atime,async,user_xattr
Source Users
Source Groups root rleigh
Source Root Users
Source Root Groups root rleigh
LVM Snapshot Device /dev/hda_vg/sid-snap-46195b04-0893-\ 49bf-beb8-0d4ccc899f0f
LVM Snapshot Options --size 2G -c 128
Maintenant que la session a été créée, il est possible d'exécuter des commandes comme ceci :
% schroot -r -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f -- \
uname -sr↵ I: [sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f chroot] Running \ command: “uname -sr” Linux 2.6.18-3-powerpc % schroot -r -c $SESSION -- uname -sr↵ I: [sid-snap-fe170af9-d9be-4800-b1bd-de275858b938 chroot] Running \ command: “uname -sr” Linux 2.6.18-3-powerpc
Quand toutes les commandes à exécuter dans la session ont été effectuées, la session peut être terminée :
% schroot -e -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f↵ % schroot -e -c $SESSION↵
Finalement, les noms de session peuvent être longs et peu maniables. Un nom peut être spécifié à la place de l'identifiant de session généré automatiquement :
% schroot -b -c sid-snap -n mon-nom-session↵ mon-nom-session
Si quelque chose ne fonctionne pas, et qu'il n'est pas facile de déterminer ce qui ne va pas à partir des messages d'erreur, vous pouvez utiliser l'option --debug=niveau pour activer les messages de débogage. Cela donnera un plus grand nombre d'informations. Les niveaux de débogage valables sont ‘none’, ‘notice’, ‘info’, ‘warning’ et ‘critical’ par ordre croissant de sévérité. Plus le niveau de sévérité est faible, plus il y a de sortie.
Si vous avez toujours des problèmes, les
développeurs peuvent être contactés sur la liste de
diffusion (en anglais) :
Debian buildd-tools Developers
<buildd-tools-devel@lists.alioth.debian.org>
Sur les architectures mips et mipsel, les noyaux Linux, jusqu'à la version 2.6.17 incluse, ont une prise en charge cassée des personality(2), qui a pour conséquence un échec de la mise en place des personnalités. Cela se manifeste par une erreur “Operation not permitted” (EPERM). Pour contourner ce problème, définissez personality à ‘undefined’ ou mettez à niveau votre noyau vers une version plus récente.
Par défaut, l'environnement n'est pas préservé et les variables d'environnement suivantes sont définies : HOME, LOGNAME, PATH, SHELL, TERM (préservée si déjà spécifiée) et USER. Les variables d'environnement SCHROOT_COMMAND, SCHROOT_USER, SCHROOT_GROUP, SCHROOT_UID et SCHROOT_GID sont définies à l'intérieur du chroot spécifiant respectivement la commande exécutée, le nom d'utilisateur, le nom de groupe, l'identifiant de l'utilisateur et l'identifiant du groupe. En plus, les variables d'environnement SCHROOT_SESSION_ID, SCHROOT_CHROOT_NAME et SCHROOT_ALIAS_NAME définissent respectivement l'identifiant de session, le nom de chroot d'origine avant la création de la session et l'alias utilisé pour identifier le chroot d'origine sélectionné.
Les variables d'environnement, potentiellement dangereuses, suivantes sont retirées par défaut pour des raisons de sécurité : BASH_ENV, CDPATH, ENV, HOSTALIASES, IFS, KRB5_CONFIG, KRBCONFDIR, KRBTKFILE, KRB_CONF, LD_.*, LOCALDOMAIN, NLSPATH, PATH_LOCALE, RES_OPTIONS, TERMINFO, TERMINFO_DIRS, et TERMPATH. Si nécessaire, la clé de configuration environment-filter permettra de modifier la liste d'exclusion. Consultez schroot.conf(5) pour plus de détails.
Chaque répertoire contient un répertoire ou un fichier avec le nom de chaque session. Tous les types de chroot n'utilisent pas tous les répertoires ci-dessous.
Roger Leigh.
Copyright © 2005-2012 Roger Leigh <rleigh@debian.org>
schroot est un logiciel libre : vous pouvez le redistribuer et/ou le modifier aux conditions définies dans la licence publique générale GNU telle que publiée par la Free Software Foundation, version 2 ou, selon votre préférence, toute version ultérieure.
dchroot(1), sbuild(1), chroot(2), schroot.conf(5), schroot-setup(5), schroot-faq(7), run-parts(8).
05 | May |