Donner à l'user un access en lecture / écriture à un seul directory

J'exécute un server et j'ai besoin de donner un access en lecture / écriture à un directory particulier à un seul user. 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'user un access en lecture seule au rest du server.

Comment puis-je configurer des permissions pour que l'user puisse uniquement lire et écrire dans un dossier particulier? L'user devrait également être capable d'exécuter des programmes comme mysql .

LCA négatives

Vous pouvez empêcher un user d'accéder à certaines parties du système de files en définissant des lists de contrôle d'access . Par exemple, pour vous assurer que l'user abcd ne peut accéder à aucun file sous /home :

 setfacl -m user:abcd:0 /home 

Cette approche est simple, mais vous devez vous callbacker de bloquer l'access à tout ce dont vous ne souhaitez pas que abcd puisse accéder.

Chroot

Pour get un contrôle positif sur ce que abcd peut voir, configurez un chroot , c'est-à-dire limitez l'user à une sous-arborescence du système de files.

Vous devez faire tous les files dont l'user a besoin (par exemple mysql et toutes ses dependencies, si vous voulez que l'user puisse exécuter mysql ) sous le chroot. Disons que le path vers le chroot est /home/ressortingcted/abcd ; le programme mysql doit être disponible sous /home/ressortingcted/abcd . Un lien symbolique pointant vers l'extérieur du chroot n'est pas bon parce que la search de lien symbolique est affectée par la prison chroot. Sous Linux, vous pouvez faire un bon usage des assemblys bind:

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

Vous pouvez également copyr des files (mais vous devrez faire attention à ce qu'ils soient à jour).

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

 Match User abcd ChrootDirectory /home/ressortingcted/abcd 

Cadre de security

Vous pouvez également utiliser des frameworks de security tels que SELinux ou AppArmor. Dans les deux cas, vous devez écrire une configuration assez délicate afin de ne pas laisser de trous.

Vous devriez utiliser chroot . La command chroot modifie le directory racine que tous les process 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. Dans cet exemple, il existe un directory appelé dir avec trois files: a , b , c et ls . Les trois premiers sont des files réguliers. ls est un lien vers le binary réel ls afin que nous puissions listr les files dans le chroot.

Je vais chroot dans dir . (Notez que j'oublie probablement quelques directorys dans le directory racine.)

Voici la configuration, sous forme de sortie shell:

 $ pwd /home/alex/test $ l dir $ ls dir abc ls $ ./ls dir # does the same thing abc 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 process doit être exécuté avec le nouveau directory racine. Il utilise par défaut /bin/sh .

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

Maintenant nous sortons du 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 command chroot . Fondamentalement, ce que vous devez faire pour résoudre votre problème est d'exécuter une command chroot tant qu'user chaque fois qu'ils se connectent. Peut-être le mettre dans un script de démarrage?

Un hardlink vers un file continuera à fonctionner dans un chroot , même si ce file ne peut pas être accédé par d'autres moyens (cela fonctionne parce que les liens durs pointent vers les inodes, pas les paths). Ainsi, afin de permettre à l'user d'accéder par exemple à la command mysql , vous devez exécuter:

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