Wie führe ich einen Teil eines Skripts mit reduzierten Berechtigungen aus?

7

Ich habe das folgende Problem: Auf jedem Computer, auf dem Postgresql ausgeführt wird, gibt es einen speziellen Benutzer postgres . Dieser Benutzer hat Administratorzugriff auf den Datenbankserver.

Jetzt möchte ich ein Bash-Skript schreiben, das einen Datenbankbefehl mit psql als Benutzer postgres ausführt (psql wird als Benutzer postgres ausgeführt , nicht als Skript). Bisher wäre das kein Problem: Ich könnte das Skript einfach als Benutzer postgres ausführen .

Ich möchte jedoch die Ausgabe von psql in eine Datei in einem Verzeichnis schreiben, in dem postgres keinen Schreibzugriff hat.

Wie kann ich das machen?

Ich dachte jedoch darüber nach, EUIDs im Skript selbst zu ändern:

  1. Ich konnte keine Möglichkeit finden, die EUID in einem Bash-Skript zu ändern
  2. Wie kann ich die EUID ändern, wenn ich so etwas verwende
    psql -U postgres -c "<command>" > file?
Christoph Wurm
quelle
Wie kann ich das Passwort für den Postgres-Benutzer in der Subshell ändern (su -c 'psql -U postgres -c "ALTER USER forip PASSWORD \' password \ ';"' postgres)
Fndiaz

Antworten:

5

Verwenden Sie eine Unterschale: (su -c 'psql -U postgres -c "<command>"' postgres) > file

Innerhalb der Subshell können Sie Berechtigungen für Ihre Arbeit löschen, die Ausgabe wird jedoch an Ihre ursprüngliche Shell umgeleitet, die noch über Ihre ursprünglichen Berechtigungen verfügt.

Kowh
quelle
5

Vielleicht möchten Sie diesen Trick anwenden:

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

tee(1) ist das POSIX-Dienstprogramm, daher können Sie sich auf seine Verfügbarkeit verlassen.


Oder mit sudo:

{ anycommand } | sudo -u user 'tee file'
ulidtko
quelle
Vielen Dank für Ihre Idee. Ich habe jedoch zwei Probleme: su hat zumindest auf meinem Computer keine Option -u. Die korrekte Ausführung (Benutzer des Befehls su-c) führt zu einem weiteren Problem, nämlich dass su von einem Terminal aus ausgeführt werden muss. Es würde wahrscheinlich sowieso nicht funktionieren, da su mit diesem Befehl eine neue Subshell öffnet.
@Legate hast du sudo auf deinem system?
Ulidtko
@ulidtko: Ja, das tue ich.
1
Verwenden Sie dann einfach sudo -u postgres psql -c '...' > filesudoers und bearbeiten Sie es, um die Passwortabfragen für diesen Befehl zu deaktivieren
gelraen
1

Sie können das Shell-Skript ausführen, wenn der Benutzer über eine bessere Schreibberechtigung verfügt (z. B. root). Wenn Sie die Daten ausgeben, sollten Sie in einen Ordner schreiben, in den der Datenbankbenutzer postgres schreiben kann (z. B. / tmp).

Verschieben Sie es nach Abschluss des Datenschreibvorgangs in das Verzeichnis, in das Ihr Shell-Skript schreiben darf (so wie Root-Benutzer überall schreiben können).

ajreal
quelle
0

Wenn Sie knifflige Wege finden, um Sicherheitsbeschränkungen zu umgehen, fragen Sie sich besser, ob Ihr Ziel wirklich klug ist. Ich weiß nichts über postgresql - müssen Sie wirklich mit dem Administratorkonto angemeldet sein, um das zu tun, was Sie versuchen, oder gibt es eine Möglichkeit, einem normalen Benutzerkonto schreibgeschützte Berechtigungen für alles zu erteilen, was es ist?

Michael Kopinsky
quelle
Vielen Dank für Ihre Antwort. Es gibt jedoch kein Problem beim Ausführen des Skripts als Root, daher werden Sicherheitsbeschränkungen nicht umgangen.
0

Warum machst du es nicht einfach so : sudo su postgres -c "psql ..." >/path/to/file?

Alex
quelle
Danke für deine Antwort. Ein schneller Test mit sudo su postgres -c "echo test"zeigt jedoch, dass ein solcher Befehl nichts druckt. Das Wechseln zu root mit sudo -sund das anschließende Ausführen su postgres -c "echo test"führt einen Drucktest durch , so dass es den Anschein hat, als würde sudodie Ausgabe irgendwie aufgefressen. Ich habe keine Ahnung warum, meine Vermutung ist das sudound su -cbenutze Subshells, deren Standard nicht in meine eigene Shell gezogen wird.
Christoph Wurm
Sie müssen etwas vermissen. sudo su postgres -c "echo \$USER"druckt postgresauf meiner Box.
Alex
Nun, es funktioniert auf meinem Ubuntu-Notebook, aber nicht auf dem Debian-Server, auf dem das Skript ausgeführt werden muss.
Christoph Wurm