Lire les fichiers appartenant à un autre utilisateur en tant que non root


9

Je sauvegarde des serveurs sur un serveur de sauvegarde. Chaque serveur sauvegardé possède son propre compte sur le serveur de sauvegarde et les fichiers sont synchronisés. Il est important que les autorisations restent intactes (en utilisant rsync -p) pour simplifier les restaurations.

J'essaie de créer un script qui peut lire les fichiers et créer des statistiques. Je n'aime pas que ce script s'exécute sous l'utilisateur root, et il est également impossible de l'exécuter pour chaque utilisateur de sauvegarde, car le script devrait pouvoir lire tous les fichiers de tous les utilisateurs. Cependant, cela crée un problème lorsqu'un fichier est par exemple chmodded 600. Je ne veux pas toucher aux autorisations, mais un autre utilisateur à l'exception de root et le propriétaire ne peut pas le lire.

Un utilisateur spécifique - non root - devrait pouvoir lire tous les fichiers dans un répertoire ou une partition, quels que soient les niveaux d'autorisation (et le propriétaire des fichiers ne devrait avoir aucun moyen de l'empêcher). Existe-t-il un moyen d'y parvenir? J'utilise FreeBSD avec un volume ZFS.


C'était ma première question sur ce site :) Vous pouvez probablement y jeter un coup d'œil. unix.stackexchange.com/questions/91488/…
Ramesh

Réponses:


4

Utilisez sudo.

Si votre sudoersfichier répertorie une commande exacte et spécifique, la commande doit être appelée exactement comme indiqué dans le sudoersou elle sera refusée.

Par exemple:

backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Dans cet exemple, l'utilisateur backuppeut exécuter la commande exactement comme indiqué:

sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

S'ils appellent sudo rsync...au lieu de sudo /usr/bin/rsyncla commande échoue, ou si les indicateurs ou les chemins sont différents, la commande échoue.

Si vous faites cela dans un script, vous souhaitez activer l'utilisation sans mot de passe de ces commandes:

backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Pour plus d'informations, voir la sudoers(5)page de manuel sous Cmnd_list.


Bonne idée. J'ai ajouté les commandes ls, cat, head, tail etc. au fichier sudoers et je peux maintenant les exécuter avec les privilèges root et lire tous les fichiers. Ce n'est peut-être pas la meilleure solution pour tout le monde, car l'utilisateur est capable de lire tous les fichiers sur le système, mais ce n'est pas un problème dans ma configuration.
Evianon

Eh bien, si vous utilisiez Solaris, j'aurais suggéré RBAC et pfexec. Mais puisque vous êtes sur BSD, sudodevra faire.
bahamat

4

Vous pouvez en écrire une suidversion catqui n'est exécutable que par votre utilisateur de sauvegarde (créer un groupe exclusif à l'utilisateur de sauvegarde et rendre l'exécutable lisible uniquement par ce groupe). Cela catvous permettrait uniquement de lire des fichiers dans le répertoire qui vous intéresse. (Vous voudrez probablement interdire les liens symboliques et faire attention aux astuces comme /dir/../otherdir/.)

Ensuite, votre script peut utiliser cet exécutable pour lire des fichiers sans avoir les privilèges root.


4

AVERTISSEMENT: comme Stephane l'a souligné dans les commentaires ci-dessous, les propriétaires des fichiers pourront toujours révoquer l'ACL.

Si vous avez un accès root à la machine, vous pouvez le faire avec les ACL :

setfacl -R -m u:USERNAME:r /path/to/direcory

Cela donnera un USERNAMEaccès en lecture à tous les fichiers et répertoires sous /path/to/directory.


Les propriétaires des fichiers pourraient toujours supprimer ces ACL.
Stéphane Chazelas

@StephaneChazelas oh. Même si cela a été fait par root? Je ne m'en rendais pas compte. Connaissez-vous un moyen de contourner cela?
terdon

Non, sous Linux, j'aurais envisagé une combinaison de capacités Linux et LSM. Sur FreeBSD, je n'en ai aucune idée.
Stéphane Chazelas

1

Bindfs est un système de fichiers FUSE qui fournit des vues d'une arborescence de répertoires avec différentes autorisations et propriétés. Il n'y a pas de port pour FreeBSD, mais vous pouvez compiler à partir des sources.

Pour donner à l'utilisateur backupper(et seulement à cet utilisateur) une vue d' /some/filesoù tous les fichiers sont lisibles, montez une vue lisible par tous /some/filesdans un répertoire privé de backupper.

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files

0

ZFS dispose de certains mécanismes pour cela.

L'un des mécanismes est toujours en cours et n'est pas encore implémenté, mais permet de monter un jeu de données avec une priorité 'propriétaire'. Dans ce cas, vous pouvez cloner un instantané, le monter avec le propriétaire remplacé par l'utilisateur de sauvegarde, le sauvegarder, puis détruire le clone. l'inconvénient est que vous ne sauvegardez pas la véritable propriété des fichiers.

La meilleure solution est probablement les ACL de style nfsv4 ZFS


0

J'ai deux idées pour résoudre ce problème en utilisant des technologies spécifiques à FreeBSD, mais je n'ai pas essayé non plus:

  • Utilisez Capsicum. C'est ma méthode préférée. De plus, comme il a récemment été porté sur Linux, il devrait également y fonctionner. Cela se passerait comme ceci:

    1. Créez une commande drop-cap-write qui supprime CAP_WRITE puis exécute une commande fournie sur la ligne de commande
    2. Utilisez sudo pour permettre à l'utilisateur de sauvegarde d'exécuter cette commande sans mot de passe
    3. Facultativement, utilisez la directive ForceCommand de sshd_config pour exécuter automatiquement cette commande chaque fois que l'utilisateur de sauvegarde se connecte. De cette façon, l'utilisateur distant n'aurait pas besoin de spécifier drop-cap-write dans son script de sauvegarde.
  • Utilisez le contrôle d'accès obligatoire. Cela ne fonctionne pas sur Linux AFAIK, et il est plus difficile à configurer. Cela se passerait comme ceci:

    1. Créez une sauvegarde-prison dont le répertoire racine est /. Codez en dur le jailid.
    2. exécutez sshd dans la prison de sauvegarde. Autoriser root à se connecter ici, même si vous n'autorisez pas les connexions root dans le sshd normal
    3. Définissez ugidfw_enable = "YES" dans /etc/rc.conf
    4. Utilisez une règle ugidfw qui ressemble à ceci:

    ugidfw add subject uid root jailid BACKUP_JAIL_ID mode rsx

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.