Posso rendere un file accessibile solo a uno script e non a un utente?


11

Ho un utente con accesso limitato al sistema (cioè non è un sudoer); chiamiamolo Bob .

Ho uno script o un file binario di cui io, l'amministratore di sistema, mi fido e che non avrei problemi a eseguirlo come root; chiamiamo la sceneggiatura get-todays-passphrase.sh. Il compito di questo script è leggere i dati da un file "privato" (di proprietà di un utente / gruppo diverso da Bob, o anche root) che si trova in /srv/daily-passphrases, e solo generare una riga specifica dal file: la linea che corrisponde alla data di oggi .

Agli utenti come Bob non è consentito conoscere la passphrase di domani, anche se è elencata nel file. Per questo motivo, il file /srv/daily-passphrasesè protetto dalle autorizzazioni Unix, quindi agli utenti non root come Bob non è consentito accedere direttamente al file. Tuttavia, possono eseguire lo get-todays-passphrase.shscript in qualsiasi momento, restituendo i dati "filtrati".


Per riassumere (la versione TL; DR ):

  1. Bob non riesce a leggere il file protetto
  2. Lo script può leggere il file protetto
  3. In qualsiasi momento, Bob può eseguire lo script in grado di leggere il file

È possibile farlo con le autorizzazioni dei file Unix? O se Bob avvia uno script, lo script sarà sempre destinato a funzionare con le stesse autorizzazioni di Bob?

Risposte:


13

Questo è in realtà comune e abbastanza semplice. sudoconsente di limitare applicazioni specifiche che un utente può invocare. In altre parole, non devi dare loro tutte le radici o niente; puoi dare loro le sudoautorizzazioni per eseguire un comando specifico . Questo è esattamente quello che vuoi ed è una pratica molto comune per cose come consentire agli utenti di inviare repository Git tramite SSH e simili.

Per fare questo, tutto ciò che devi fare è aggiungere una linea /etc/sudoersche assomigli a qualcosa

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

(La NOPASSWD:parte non è richiesta, ma è molto comune in questa situazione.) A quel punto, bobpuò invocare /path/to/command/you/trustvia sudo, ma nient'altro.

Detto questo, dare a qualcuno il root - quello che stiamo facendo qui - potrebbe non essere proprio quello che vuoi. In particolare, se ci fosse qualche difetto nella tua sceneggiatura, rischi di lasciare che la tua casella venga sradicata. Per questo motivo, si potrebbe invece preferire di creare un utente specifico di possedere il file speciale-per esempio, specialuser-Poi chownil file da loro, e hanno il /etc/sudoersmake bobessere che utente speciale. In tal caso, la linea a cui aggiungi sudoerssarebbe semplicemente

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

7
Suggerirei di non andare nel modo "root" - creare un utente / gruppo speciale per questo scopo.
Guntbert,

Buon punto; Emetterò la risposta.
Benjamin Pollack,

7

Prefazione:

Come è stato sottolineato nei commenti e per i motivi spiegati in questa risposta, il kernel di Linux ignora il bit setuid / setguid durante la gestione di uno script. Non ho intenzione di duplicare la risposta di Benjamin, ma sostituirò invece la sceneggiatura con execabe per rendere corretta la mia risposta.


Risposta breve: usa setgid

Passaggi dettagliati:

  1. Crea un nuovo gruppo (ad es. Readpass)
  2. Rendi quel gruppo il proprietario del file passphrase sudo chown :readpass thatfile
  3. Rendi il file leggibile solo dal suo gruppo sudo chmod g=r,o= thatfile
  4. Rendi il tuo eseguibile sgid readpass:sudo chmod g+s thatfile

In questo modo il tuo eseguibile verrà eseguito con le autorizzazioni del gruppo proprietario e sarà quindi in grado di leggere il file.


2
Setgid e setuid non sono facilmente utilizzabili con gli script, giusto?
muru,

1
Non è possibile creare uno script setgid su Linux: il bit setgid verrà ignorato. Invece, aggiungi una regola sudo che consenta a bob di funzionare thatfilecon il gruppo readpass.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.