Comment exécuter une commande dans une prison chroot pas en tant que root et sans sudo?

Je suis en train de mettre en place un chroot minimal et je veux éviter que sudo ou su y soit, mais j’exécute toujours mes processus en tant que non-root. C’est un peu une astuce, car exécuter chroot requier root. Je pourrais écrire un programme qui fait ceci qui ressemblerait à quelque chose comme:

uid = LookupUser(args[username]) // no /etc/passwd in jail chroot(args[newroot]) cd("/") setuids(uid) execve(args[exe:]) 

Est-ce mon meilleur pari ou existe-t-il un outil standard qui fait ça pour moi?


J’ai roulé le mien ici :

    Si vous invoquez chroot depuis root, l’option chroot --userspec=USER:GROUP exécutera la commande sous l’ --userspec=USER:GROUP non root.

    Par ailleurs, l’option ‘–userspec’ est d’abord introduite dans coreutils-7.5 selon un repository git://git.sv.gnu.org/coreutils .

    Fakechroot , en combinaison avec fakeroot , vous permettra de le faire. Ils feront en sorte que tous les programmes en cours d’exécution fonctionnent comme s’ils étaient exécutés dans un chroot en tant que root, mais ils s’exécuteront en réalité comme vous.

    Voir aussi la page de manuel de fakechroot .

    Un chrooter personnalisé n’est pas du tout difficile à écrire:

     #define _BSD_SOURCE #include  #include  const char newroot[]="/path/to/chroot"; int main(int c, char **v, char **e) { int rc; const char *m; if ( (m="chdir" ,rc=chdir(newroot)) == 0 && (m="chroot",rc=chroot(newroot)) == 0 && (m="setuid",rc=setuid(getuid())) == 0 ) m="execve", execve(v[1],v+2,e); perror(m); return 1; } 

    Ajoutez cette racine setuid à un groupe personnalisé auquel vous ajoutez votre utilisateur préféré (et aucun autre access).

    Vous pouvez utiliser les capacités linux pour donner à votre binary la possibilité d’appeler chroot () sans être root. Par exemple, vous pouvez le faire sur le binary chroot . En tant que non-root, vous obtenez normalement ceci:

     $ chroot /tmp/ chroot: cannot change root directory to /tmp/: Operation not permitted 

    Mais après avoir exécuté la commande setcap :

     sudo setcap cap_sys_chroot+ep /usr/sbin/chroot 

    Il vous laissera faire l’appel chroot.

    Je ne vous recommande pas de faire cela sur le chroot du système, mais plutôt sur votre propre programme et d’appeler chroot. De cette façon, vous avez plus de contrôle sur ce qui se passe, et vous pouvez même supprimer le privilège cap_sys_chroot après l’avoir appelé, afin que les appels successifs à chroot dans votre programme échouent.

    Vous pouvez utiliser des conteneurs Linux pour créer un environnement chroot qui se trouve dans un espace de noms totalement différent (IPC, système de fichiers et même réseau).

    Il existe même LXD qui est capable de gérer la création de conteneurs basés sur des images et de les configurer pour qu’ils fonctionnent en tant qu’utilisateurs non privilégiés, de sorte que si le code non fiable parvient à échapper au conteneur, pas comme la racine du système.

    Recherchez “Conteneurs Linux” et “LXD” sur votre moteur de recherche préféré;)