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
.
permissions
files
account-restrictions
Manishearth
la source
la source
mysql
programme? L'utilisateur doit pouvoir le lire, ainsi que toutes les bibliothèques et fichiers de données dont il a besoin.Réponses:
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
abcd
ne peut accéder à aucun fichier sous/home
:Cette approche est simple, mais vous devez vous rappeler de bloquer l'accès à tout ce que vous ne voulez
abcd
pas pouvoir accéder.Chroot
Pour obtenir un contrôle positif sur ce qui
abcd
peut ê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
mysql
et toutes ses dépendances, si vous voulez que l'utilisateur puisse s'exécutermysql
) sous le chroot. Disons que le chemin vers le chroot est/home/restricted/abcd
; lemysql
programme 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:Vous pouvez également copier des fichiers (mais vous devrez alors vous assurer qu'ils sont à jour).
Pour restreindre l'utilisateur au chroot, ajoutez une
ChrootDirectory
directive à/etc/sshd_config
.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.
la source
/var/www/allowfolder
et ses sous-répertoires doivent être accessibles, pas seulement/var/www/allowfolder
lui - 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/www
pour accéder/var/www/allowfolder
.Vous devez utiliser
chroot
. Lachroot
commande 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é
dir
avec trois fichiers:a
,b
,c
etls
. Les trois premiers sont des fichiers réguliers.ls
est un lien dur vers le vrails
binaire afin que nous puissions lister les fichiers dans le chroot.Je vais
chroot
endir
. (Notez que j'oublie probablement certains répertoires du répertoire racine.)Voici la configuration, sous forme de sortie shell:
Maintenant je vais
chroot
entrerdir
. L'/bin/bash
argument choisit le processus à exécuter avec le nouveau répertoire racine. Il est par défaut/bin/sh
.Maintenant, nous quittons
chroot
:J'espère que cela illustre le fonctionnement de la
chroot
commande. Fondamentalement, ce que vous devez faire pour résoudre votre problème est d'exécuter unechroot
commande 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 à lamysql
commande, vous devez exécuter:la source
chmod
. quand vous dites "ne serait-il pas plus facile d'exécuter une commande ... ne perdez pas l'accès à eux", cette commande estchroot
. 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
)chroot
vous-même ou faites-moi savoir ce qui n'a pas de sens. encore mieux, faites les deux. (et lisez les pages de manuel.)