Puis-je rendre un fichier uniquement accessible à un script et non à un utilisateur?


11

J'ai un utilisateur avec un accès limité sur le système (c'est-à-dire qu'il n'est pas sudoer); appelons-le Bob .

J'ai un script ou un binaire que moi, l'administrateur système, approuvons et n'aurais aucun problème à l'exécuter en tant que root; appelons le script get-todays-passphrase.sh. Le travail de ce script est de lire les données d'un fichier "privé" (appartenant à un utilisateur / groupe autre que Bob, ou même root) situé dans /srv/daily-passphrases, et de ne sortir qu'une ligne spécifique du fichier: la ligne qui correspond à la date du jour .

Les utilisateurs comme Bob ne sont pas autorisés à connaître la phrase secrète de demain, même si elle est répertoriée dans le fichier. Pour cette raison, le fichier /srv/daily-passphrasesest protégé par des autorisations Unix, donc les utilisateurs non root comme Bob ne sont pas autorisés à accéder directement au fichier. Ils sont toutefois autorisés à exécuter le get-todays-passphrase.shscript à tout moment, ce qui renvoie les données "filtrées".


Pour résumer (la version TL; DR ):

  1. Bob ne peut pas lire le fichier protégé
  2. Le script peut lire le fichier protégé
  3. À tout moment, Bob peut exécuter le script qui peut lire le fichier

Est-il possible de le faire avec les permissions des fichiers Unix? Ou si Bob démarre un script, le script sera-t-il toujours voué à s'exécuter avec les mêmes autorisations que Bob?

Réponses:


13

C'est en fait courant et assez simple. sudovous permet de limiter les applications spécifiques qu'un utilisateur peut invoquer. En d'autres termes, vous n'avez pas besoin de leur donner tous racine ou rien; vous pouvez leur donner des sudoautorisations pour exécuter une commande spécifique . C'est exactement ce que vous voulez, et c'est une pratique très courante pour des choses comme permettre aux utilisateurs de pousser les référentiels Git via SSH et autres.

Pour ce faire, il vous suffit d'ajouter une ligne /etc/sudoersqui ressemble à quelque chose

bob ALL=(root) NOPASSWD: /path/to/command/you/trust

(La NOPASSWD:partie n'est pas requise, mais est très courante dans cette situation.) À ce stade, bobpeut être invoqué /path/to/command/you/trustvia sudo, mais rien d'autre.

Cela dit, donner à quelqu'un une racine — ce que nous faisons ici — peut ne pas être tout à fait ce que vous voulez. Notamment, s'il y avait un défaut dans votre script, vous risqueriez de laisser votre boîte s'enraciner. Pour cette raison, vous pouvez plutôt préférer créer un utilisateur spécifiquement pour posséder le fichier spécial - disons, - specialuserpuis chownle fichier pour eux, et avoir la /etc/sudoersmarque bobcomme cet utilisateur spécial. Dans ce cas, la ligne à laquelle vous ajoutez sudoersserait simplement

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust

7
Je suggère de ne pas suivre la voie "root" - créez un utilisateur / groupe spécial à cet effet.
guntbert

Bon point; Je modifierai la réponse.
Benjamin Pollack

7

Préface:

Comme cela a été souligné dans les commentaires et pour les raisons expliquées dans cette réponse, le noyau linux ignore le bit setuid / setguid lors de la manipulation d'un script. Je ne vais pas dupliquer la réponse de Benjamin mais remplacerai plutôt le script par executabe pour rendre ma réponse correcte.


Réponse courte: utilisez setgid

Étapes détaillées:

  1. Créer un nouveau groupe (par exemple, readpass)
  2. Rendre ce groupe propriétaire du fichier de phrase secrète sudo chown :readpass thatfile
  3. Rendre le fichier lisible par son groupe uniquement sudo chmod g=r,o= thatfile
  4. Faites votre readpass sgid exécutable :sudo chmod g+s thatfile

De cette façon, votre exécutable s'exécutera avec les autorisations du groupe propriétaire et pourra ainsi lire le fichier.


2
Setgid et setuid ne sont pas facilement utilisables sur les scripts, non?
muru

1
Vous ne pouvez pas créer un script setgid sous Linux: le bit setgid sera ignoré. Ajoutez plutôt une règle sudo permettant à bob de courir thatfileavec le groupe readpass.
Gilles 'SO- arrête d'être méchant'
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.