2010-09-17 25 views
21

Je suis en train de mettre en place un chroot minimal et je veux éviter d'avoir sudo ou su dedans mais toujours exécuter mes processus en tant que non-root. C'est un peu une astuce en tant que racine de requins chroot en cours d'exécution. Je pourrais écrire un programme qui fait cela qui ressemblerait à quelque chose comme:Comment exécuter une commande dans une prison chroot pas en tant que root et sans sudo?

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 est-il un outil standard qui fait ça pour moi?


je roulais mon here:

Répondre

23

Si vous invoquez chroot depuis la racine, l'option chroot vous aidera. La commande chroot a l'option --userspec=USER:GROUP pour s'exécuter sous UID/GID non-root. D'ailleurs, l'option '--userspec' est d'abord introduite dans coreutils-7.5 selon un référentiel git git://git.sv.gnu.org/coreutils.

+0

Cela ressemble exactement à ce que je veux, mais je ne trouve pas de documentation à ce sujet. (Je regarde les pages man et info.) Avez-vous un lien vers certains docs? – BCS

+0

Je suis désolé mais il semble que l'option '--userspec' soit introduite RHEL> = 6.0 ou Fedora> = 13. – kamae

16

fakechroot, en combinaison avec fakeroot, vous permettra de le faire. Ils feront en sorte que tous les programmes en cours d'exécution agissent comme s'ils étaient exécutés dans un chroot en tant que root, mais ils fonctionneront réellement comme vous. Voir aussi fakechroot's man page.

+2

je besoin d'un vrai chroot que je vais être compiler et d'exécuter du code non fiable qui pourrait inclure ASM en ligne. – BCS

+1

Depuis que je suis tombé sur ce fil, même des années plus tard, je dois ajouter: ne jamais utiliser chroot pour la sécurité. https://lwn.net/Articles/252794/ – domenukk

8

Vous pouvez utiliser les capacités linux pour donner à votre binaire la possibilité d'appeler chroot() sans être root. Par exemple, vous pouvez faire cela au binaire chroot. Comme non-root, normalement vous obtiendrez ceci:

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

Mais une fois que vous exécutez la commande setcap:

sudo setcap cap_sys_chroot+ep /usr/sbin/chroot 

Il vous permettra de faire l'appel chroot.

Je ne vous recommande pas de faire ceci à chroot du système, que vous le faites plutôt à votre propre programme et appelez le chroot. De cette façon, vous avez plus de contrôle sur ce qui se passe, et vous pouvez même abandonner le privilège cap_sys_chroot après l'avoir appelé, ainsi les appels successifs à chroot dans votre programme échoueront.

+0

Ainsi, cela permettra à un utilisateur arbitraire d'appeler le chroot sys-call au moyen de n'importe quel binaire accédé comme '/ usr/sbin/chroot'? Cela permettrait alors à n'importe quel processus à l'intérieur d'un chroot d'appeler l'appel sys chroot à condition qu'il puisse créer un fichier exécutable nommé '/ usr/sbin/chroot' par rapport à la racine actuelle. - Je préfère ne pas le faire en desserrant le modèle de sécurité des noyaux. – BCS

+0

J'ai mis à jour la réponse pour refléter le fait que le réglage sur le binaire chroot n'était qu'un exemple. Vous voudriez faire ce setcap sur votre propre binaire. –

8

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; 
} 

font que suid root et appartenant à un groupe personnalisé vous ajoutez votre utilisateur privilégié (et pas d'accès « autre »).

1

Vous pouvez utiliser Linux Containers pour créer un environnement chroot qui est dans un espace de noms totalement différent (IPC, système de fichier, et même réseau)

Il y a même LXD qui est capable de gérer la création de conteneurs à base d'images et configurez-les pour qu'ils s'exécutent en tant qu'utilisateurs non privilégiés afin que si le code non fiable parvient à échapper d'une façon ou d'une autre au conteneur, il ne pourra exécuter que du code en tant qu'utilisateur non privilégié et non en tant que racine du système.

Recherche « Linux Containers » et « LXD » sur votre moteur de recherche préféré;)