web-dev-qa-db-fra.com

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

Je crée un chroot minimal et je veux éviter d'avoir SUDO ou SUI, mais exécutez toujours mes processus comme non root. Ceci est un peu un tour comme la racine courante de Chroot Requiers. Je pourrais écrire un programme qui fait cela 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 que mon meilleur pari ou existe-t-il un outil standard qui pour moi?


J'ai roulé mon propre ici :

22
BCS

Si vous invoquez chroot de la racine, l'option chroot--userspec=USER:GROUP exécutera la commande sous l'UID/gidon non-racine.

Au fait, l'option '-UserSpec' est introduite pour la première fois dans Coreutils-7.5 Selon un référentiel GIT git://git.sv.gnu.org/coreutils.

24
kamae

fakechroot , en combinaison avec fakeroot , vous permettra de le faire. Ils feront tous les programmes qui sont en cours d'exécution comme s'ils sont dirigés dans un chroot en tant que root, mais ils vont réellement courir comme vous.

Voir aussi page homme de fakechroot .

18
Eric Warmenhoven

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

#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
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;
}

Faites cette racine SETUID et possédée par un groupe personnalisé, vous ajoutez votre utilisateur favorisé à (et aucun accès "autre").

9
jthill

Vous pouvez utiliser des capacités Linux pour donner à votre binaire la possibilité d'appeler Chroot () sans être root. À titre d'exemple, vous pouvez le faire sur le binaire chroot binaire. Comme non-racine, normalement, vous obtiendriez cela:

$ 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 

Cela vous laissera faire l'appel de chroot.

Je ne vous recommande pas de faire cela au système chroot, que vous le faites à votre propre programme et appelez Chroot. De cette façon, vous avez plus de contrôle sur ce qui se passe et vous pouvez même laisser tomber le privilège CAP_SYS_CHROOT après l'avoir appelé, des appels successifs à Chroot dans votre programme échoueront.

8
Corey Henderson

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

Il existe même LXD qui est capable de gérer la création de conteneurs à base d'images et de les configurer pour exécuter des utilisateurs non privilégiés afin que si le code non configuré parvient à échapper à la conteneur, il ne pourra exécuter que du code que l'utilisateur non privilégié et pas comme la racine du système.

Recherchez 'Linux conteneurs' et 'lxd' sur votre moteur de recherche préféré;)

2
mike510a