Bagaimana menjalankan bagian skrip dengan hak istimewa yang dikurangi?

7

Saya memiliki masalah berikut: Pada setiap mesin yang menjalankan Postgresql ada postgres pengguna khusus . Pengguna ini memiliki akses administratif ke server database.

Sekarang saya ingin menulis skrip Bash yang mengeksekusi perintah database dengan psql sebagai postgres pengguna (psql akan dieksekusi sebagai postgres pengguna , bukan skrip). Sejauh ini, itu tidak akan menjadi masalah: Saya hanya bisa menjalankan script sebagai postgres pengguna .

Namun, saya ingin menulis output psql ke file di direktori di mana postgres tidak memiliki akses tulis.

Bagaimana saya bisa melakukan itu?

Saya berpikir tentang mengubah EUID dalam skrip itu sendiri, namun:

  1. Saya tidak dapat menemukan cara untuk mengubah EUID dalam skrip Bash
  2. Bagaimana saya bisa mengubah EUID saat menggunakan sesuatu seperti
    psql -U postgres -c "<command>" > file?
Christoph Wurm
sumber
bagaimana saya bisa mengubah kata sandi pengguna postgres di subshell (su -c 'psql -U postgres -c "ALTER USER forip PASSWORD \' password \ ';"' postgres)
Fndiaz

Jawaban:

5

Gunakan subkulit: (su -c 'psql -U postgres -c "<command>"' postgres) > file

Di dalam subkulit Anda dapat menjatuhkan izin untuk melakukan pekerjaan Anda, tetapi output diarahkan ke shell asli Anda yang masih memiliki izin asli Anda.

Kowh
sumber
5

Anda mungkin ingin menggunakan trik ini:

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

tee(1) adalah utilitas POSIX, jadi Anda dapat mengandalkan ketersediaannya.


Atau, dengan sudo:

{ anycommand } | sudo -u user 'tee file'
ulidtko
sumber
Terima kasih atas idenya. Namun, saya mengalami dua masalah: su tidak memiliki opsi -u, setidaknya di komputer saya. Menjalankannya dengan benar (pengguna perintah su -c) menyebabkan masalah lain, yaitu su harus dijalankan dari terminal. Itu mungkin tidak akan berhasil karena su membuka subkulit baru dengan perintah itu.
@ Legate, apakah Anda memiliki sudo di sistem Anda?
ulidtko
@ Dulidko: Ya, saya lakukan.
1
lalu gunakan sudo -u postgres psql -c '...' > filedan edit sudoers untuk menonaktifkan prompt kata sandi untuk perintah ini
gelraen
1

Anda dapat menjalankan skrip shell dengan pengguna memiliki izin menulis yang lebih baik (seperti root), dan ketika Anda mengeluarkan data harus menulis ke folder yang dapat ditulisi oleh pengguna postgres database (seperti / tmp)

setelah penulisan data selesai, pindahkan ke direktori tempat skrip shell Anda memiliki izin untuk menulis (seperti pengguna root dapat menulis di mana saja)

nyata
sumber
0

Jika Anda menemukan cara-cara rumit untuk menghindari batasan keamanan, Anda sebaiknya bertanya pada diri sendiri apakah tujuan Anda benar-benar bijaksana. Saya tidak tahu apa-apa tentang postgresql - apakah Anda benar-benar harus login dengan akun admin untuk melakukan apa yang Anda coba lakukan, atau adakah cara Anda dapat memberikan izin hanya-baca untuk apa pun itu ke akun pengguna normal?

Michael Kopinsky
sumber
Terima kasih atas jawaban Anda. Namun, tidak ada masalah dalam menjalankan skrip sebagai root, oleh karena itu tidak ada batasan pembatasan keamanan yang terjadi.
0

Mengapa Anda tidak melakukannya saja seperti ini sudo su postgres -c "psql ..." >/path/to/file:?

alex
sumber
Terima kasih atas jawabannya. Namun, tes cepat dengan sudo su postgres -c "echo test"mengungkapkan bahwa perintah seperti itu tidak mencetak apa pun. Beralih ke root dengan sudo -sdan kemudian mengeksekusi su postgres -c "echo test"melakukan tes cetak , sehingga tampaknya sudobahwa entah bagaimana memakan output. Saya tidak tahu mengapa, dugaan saya adalah itu sudodan su -cmenggunakan subshell yang stdout tidak diseret ke shell saya sendiri.
Christoph Wurm
Anda pasti melewatkan sesuatu. sudo su postgres -c "echo \$USER"cetakan postgresdi kotak saya.
alex
Ya, ini berfungsi pada notebook Ubuntu saya, tetapi tidak pada server Debian tempat skrip harus dijalankan.
Christoph Wurm