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
.
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.
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
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