Come eseguire parte di uno script con privilegi ridotti?


7

Ho il seguente problema: Su ogni macchina che esegue Postgresql c'è un utente speciale postgres . Questo utente ha accesso amministrativo al server di database.

Ora voglio scrivere uno script Bash che esegue un comando di database con psql come postgres dell'utente (psql deve essere eseguito come postgres dell'utente , non lo script). Finora, non sarebbe stato un problema: avrei potuto semplicemente eseguire lo script come postgres dell'utente .

Tuttavia, voglio scrivere l'output di psql in un file in una directory in cui postgres non ha accesso in scrittura.

Come lo posso fare?

Ho pensato di cambiare l'EUID nella sceneggiatura stessa, tuttavia:

  1. Non sono riuscito a trovare un modo per cambiare l'EUID in uno script Bash
  2. Come posso cambiare l'EUID quando uso qualcosa del genere
    psql -U postgres -c "<command>" > file?

come posso cambiare la password dell'utente postgres in subshell (su -c 'psql -U postgres -c "ALTER USER forip PASSWORD \' password \ ';"' postgres)
Fndiaz,

Risposte:


5

Usa una subshell: (su -c 'psql -U postgres -c "<command>"' postgres) > file

All'interno della subshell è possibile rilasciare le autorizzazioni per svolgere il proprio lavoro, ma l'output viene reindirizzato alla shell originale che ha ancora le autorizzazioni originali.


5

Potresti voler usare questo trucco:

{ anycommand } | su -c 'tee file' user

tee(1) è l'utilità POSIX, quindi puoi fare affidamento sulla sua disponibilità.


Oppure, con sudo:

{ anycommand } | sudo -u user 'tee file'

Grazie per la tua idea Tuttavia, sto riscontrando due problemi: su non ha un'opzione -u, almeno sulla mia macchina. L'esecuzione corretta (su -c command user) comporta un altro problema, ovvero che su deve essere eseguito da un terminale. Probabilmente non funzionerebbe comunque poiché su apre una nuova subshell con quel comando.

@Legate hai sudo sul tuo sistema?
Ulidtko,

@ulidtko: Sì, lo so.

1
quindi basta usare sudo -u postgres psql -c '...' > filee modificare i sudoer per disabilitare le richieste di password per questo comando
gelraen,

1

È possibile eseguire lo script di shell con l'utente che ha una migliore autorizzazione di scrittura (come root) e quando si esegue l'output i dati devono scrivere in una cartella su cui l'utente postgres del database può scrivere (come / tmp)

al termine della scrittura dei dati, spostalo nella directory in cui lo script della shell è autorizzato a scrivere (come l'utente root può scrivere ovunque)


0

Se stai cercando modi complicati per aggirare le restrizioni di sicurezza, è meglio che ti chieda se il tuo obiettivo è davvero saggio. Non so nulla di postgresql - hai davvero bisogno di aver effettuato l'accesso con l'account admin per fare quello che stai cercando di fare, o c'è un modo per concedere autorizzazioni di sola lettura per qualunque cosa sia a un normale account utente?


La ringrazio per la risposta. Tuttavia, non c'è alcun problema nell'esecuzione dello script come root, quindi non si verificano elusioni delle restrizioni di sicurezza.

0

Perché non lo fai in questo modo sudo su postgres -c "psql ..." >/path/to/file:?


Grazie per la risposta. Tuttavia, un rapido test con sudo su postgres -c "echo test"rivela che tale comando non stampa nulla. Il passaggio al root con sudo -se quindi l'esecuzione su postgres -c "echo test"fa il test di stampa , quindi sembra che in sudoqualche modo mangi l'output. Non ho idea del perché, la mia ipotesi è che sudoe su -cusare subshells il cui stdout non è trascinato attraverso la mia shell.
Christoph Wurm,

Devi perdere qualcosa. sudo su postgres -c "echo \$USER"stampe postgressulla mia scatola.
alex

Bene, funziona sul mio notebook Ubuntu, ma non sul server Debian in cui deve essere eseguito lo script.
Christoph Wurm,
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.