web-dev-qa-db-fra.com

Accordez à l'utilisateur un accès en lecture / écriture à un seul répertoire

J'utilise un serveur et j'ai besoin de donner un accès en lecture/écriture à un répertoire particulier à un seul utilisateur. J'ai essayé ce qui suit:

Sudo adduser abcd
Sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

Ce qui précède semble fonctionner, mais il donne à l'utilisateur un accès en lecture seule au reste du serveur.

Comment puis-je configurer des autorisations pour que l'utilisateur puisse uniquement lire et écrire dans un dossier particulier? L'utilisateur doit également pouvoir exécuter des programmes comme mysql.

19
Manishearth

ACL négatifs

Vous pouvez empêcher un utilisateur d'accéder à certaines parties du système de fichiers en définissant listes de contrôle d'accès . Par exemple, pour vous assurer que l'utilisateur abcd ne peut accéder à aucun fichier sous /home:

setfacl -m user:abcd:0 /home

Cette approche est simple, mais vous devez vous rappeler de bloquer l'accès à tout ce que vous ne voulez pas que abcd puisse accéder.

Chroot

Pour obtenir un contrôle positif sur ce que abcd peut voir, configurez un chroot , c'est-à-dire restreignez l'utilisateur à une sous-arborescence du système de fichiers.

Vous devez créer tous les fichiers dont l'utilisateur a besoin (par exemple mysql et toutes ses dépendances, si vous voulez que l'utilisateur puisse exécuter mysql) sous le chroot. Dites que le chemin vers le chroot est /home/restricted/abcd; le programme mysql doit être disponible sous /home/restricted/abcd. Un lien symbolique pointant à l'extérieur du chroot n'est pas bon car la recherche de lien symbolique est affectée par la prison chroot. Sous Linux, vous pouvez faire bon usage des montures de liaison:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

Vous pouvez également copier des fichiers (mais vous devrez alors vous assurer qu'ils sont à jour).

Pour restreindre l'utilisateur au chroot, ajoutez une directive ChrootDirectory à /etc/sshd_config .

Match User abcd
    ChrootDirectory /home/restricted/abcd

Vous pouvez le tester avec: chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

Cadre de sécurité

Vous pouvez également utiliser des cadres de sécurité tels que SELinux ou AppArmor. Dans les deux cas, vous devez écrire une configuration assez délicate, pour vous assurer de ne laisser aucun trou.

Vous devez utiliser chroot. La commande chroot modifie le répertoire racine que tous les processus enfants voient. Je vais donner un exemple pour montrer comment cela fonctionne.

Cela a été écrit sur place; Je ne suis pas actuellement devant une machine UNIX pour le moment. Dans cet exemple, il existe un répertoire appelé dir avec trois fichiers: a, b, c et ls. Les trois premiers sont des fichiers réguliers. ls est un lien dur vers le vrai binaire ls afin que nous puissions lister les fichiers dans le chroot.

Je vais chroot dans dir. (Notez que j'oublie probablement certains répertoires du répertoire racine.)

Voici la configuration, sous forme de sortie Shell:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

Maintenant, je vais chroot dans dir. L'argument /bin/bash Choisit quel processus doit être exécuté avec le nouveau répertoire racine. Il s'agit par défaut de /bin/sh.

$ chroot /bin/bash dir
$ # this Prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

Maintenant, nous quittons le chroot:

$ exit
$ # this Prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

J'espère que cela illustre le fonctionnement de la commande chroot. Fondamentalement, ce que vous devez faire pour résoudre votre problème est d'exécuter une commande chroot en tant qu'utilisateur à chaque connexion. Peut-être la mettre dans un script de démarrage?

Un lien physique vers un fichier continuera de fonctionner à l'intérieur d'un chroot, même si ce fichier n'est pas accessible par d'autres moyens (cela fonctionne car les liens physiques pointent vers des inodes, pas des chemins). Ainsi, afin de permettre à l'utilisateur d'accéder par exemple la commande mysql, vous exécuteriez:

ln /usr/bin/mysql /path/to/chroot/target
5
strugee