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

18

J'exécute un serveur et je dois 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.

Manishearth
la source
2
La réponse courte: utilisez un chroot.
Chris Down
@Chris Care à développer cela dans une réponse? Manish et moi avons lutté avec cela et je n'arrive pas à le faire fonctionner.
Annuler
Où serait situé le mysqlprogramme? L'utilisateur doit pouvoir le lire, ainsi que toutes les bibliothèques et fichiers de données dont il a besoin.
Gilles 'SO- arrête d'être méchant'
@Gilles Hmm. C'est une installation mysql standard d'apt-get, pour autant que je sache (pas mon système, c'est Undo).
Manishearth

Réponses:

18

ACL négatifs

Vous pouvez empêcher un utilisateur d'accéder à certaines parties du système de fichiers en définissant des listes de contrôle d'accès . Par exemple, pour vous assurer que l'utilisateur abcdne 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 abcdpas pouvoir accéder.

Chroot

Pour obtenir un contrôle positif sur ce qui abcdpeut être vu, 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 mysqlet toutes ses dépendances, si vous voulez que l'utilisateur puisse s'exécuter mysql) sous le chroot. Disons que le chemin vers le chroot est /home/restricted/abcd; le mysqlprogramme 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 ChrootDirectorydirective à /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.

Gilles 'SO- arrête d'être méchant'
la source
Un moyen beaucoup plus simple de donner des autorisations de lecture et d'écriture à un répertoire particulier ne consiste-t-il pas à créer des groupes? Par exemple, il pourrait créer un nouveau groupe et utiliser chown pour faire du propriétaire du groupe d'annuaire le groupe créé et ajouter l'utilisateur au groupe. Enfin, accordez au répertoire des autorisations de lecture et d'écriture sur les groupes.
Qasim
@Qasim Cela nécessite que tous les fichiers aient leurs autorisations et leur propriété comme vous le souhaitez. Il y a tellement de choses qui peuvent mal tourner (fichiers copiés ailleurs ou extraits d'une archive avec leurs autorisations préservées, fichiers qui doivent appartenir à un autre groupe, fichiers qui ne devraient pas être lisibles en groupe, utilisateurs qui font des erreurs ou peuvent '' t être dérangé pour vous assurer que l'accessibilité du groupe reste comme vous le souhaitez…) que les groupes ne résolvent pas vraiment ce problème.
Gilles 'SO- arrête d'être méchant'
Je veux dire que je ne vois pas comment les fichiers devraient avoir leurs propres autorisations si les autorisations de groupe sur le répertoire étaient définies de manière à ce qu'aucun utilisateur ne puisse "cd" dans le répertoire ou "ls" dans le répertoire.
Qasim
@Qasim Chaque fichier sous /var/www/allowfolderet ses sous-répertoires doivent être accessibles, pas seulement /var/www/allowfolderlui - même. Et inversement, les autres fichiers ne doivent pas être accessibles. En fait, une solution basée uniquement sur les autorisations de fichiers et ACL ne peut pas répondre complètement aux exigences: elle permettrait au moins à l'utilisateur de tester si un nom donné existe sous /var/www, car ils doivent avoir une autorisation x /var/wwwpour accéder /var/www/allowfolder.
Gilles 'SO- arrête d'être méchant'
Oh ok je vois mais si nous excluons le répertoire / var de cela et disons que nous parlons d'un répertoire normal dans le répertoire / home / user?
Qasim
5

Vous devez utiliser chroot. La chrootcommande 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 y a un répertoire appelé diravec trois fichiers: a, b, cet ls. Les trois premiers sont des fichiers réguliers. lsest un lien dur vers le vrai lsbinaire afin que nous puissions lister les fichiers dans le chroot.

Je vais chrooten 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 chrootentrer dir. L' /bin/bashargument choisit le processus à exécuter avec le nouveau répertoire racine. Il est par défaut /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 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 chrootcommande. Fondamentalement, ce que vous devez faire pour résoudre votre problème est d'exécuter une chrootcommande en tant qu'utilisateur à chaque connexion. Peut-être la mettre dans un script de démarrage?

Un lien dur 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 durs pointent vers des inodes, pas des chemins). Ainsi, afin de permettre à l'utilisateur d'accéder par exemple à la mysqlcommande, vous devez exécuter:

ln /usr/bin/mysql /path/to/chroot/target
strugee
la source
Mais cela ne m'obligerait-il pas à configurer un environnement chroot complet avec tous les liens symboliques? Ne serait-il pas plus facile d'exécuter une commande pour que le nouvel utilisateur n'ait pas accès aux autres répertoires, mais que des programmes comme apache n'y perdent pas accès?
Manishearth
Fondamentalement, existe-t-il un moyen (via chmod) de faire perdre à un utilisateur l'accès en lecture au reste des fs sans affecter l'accès des autres utilisateurs?
Manishearth
@Manishearth il n'y a pas de moyen simple avec chmod. quand vous dites "ne serait-il pas plus facile d'exécuter une commande ... ne perdez pas l'accès à eux", cette commande est chroot. si vous expliquez ce que vous entendez par "un environnement chroot entier", ou pourquoi ce serait un problème, je comprendrais peut-être mieux. (notez que vous pouvez donner accès à tous les executables avec oneliner: ln /bin/* /path/to/chroot/target)
strugee
@Manishearth si mon exemple n'a pas de sens, je vous encourage à jouer avec chrootvous-même ou faites-moi savoir ce qui n'a pas de sens. encore mieux, faites les deux. (et lisez les pages de manuel.)
strugee
@Manishearth si cette réponse vous a suffisamment aidé à vous conduire à la réponse, vous devriez envisager de l'accepter.
strugee