Postgresql memungkinkan ekstensi tanpa pengguna super

12

Saya memiliki server PostgreSQL 9.5 di mana saya memiliki skrip yang membuat peran dan basis data untuk pengguna secara otomatis. Dalam basis data ini akan sangat membantu untuk mengaktifkan ekstensi spesifik (misalnya pgcrypto), tetapi seperti yang saya pahami, harus ada superuser untuk dijalankan CREATE EXTENSION. Apakah ada cara untuk mengaktifkan ekstensi tersebut tanpa masuk secara manual dengan akun pengguna super?

beldaz
sumber
4
Sudahkah Anda mencoba menambahkannya ke template1dan kemudian membuat setiap basis data pengguna dari template1suka CREATE DATABASE foo OWNER=userfoo TEMPLATE=template1?
Kassandry
1
@Kassandry tidak tidak memikirkan hal itu, tapi itu pemikiran yang bagus. Idealnya saya ingin pemilik dapat menambahkan ekstensi jika mereka mau, tetapi ini masih merupakan kemungkinan yang dapat diterima.
beldaz

Jawaban:

10

Dari dokumen tentang Ekstensi,

superuser (boolean) Jika parameter ini benar (yang merupakan default), hanya pengguna super yang dapat membuat ekstensi atau memperbaruinya ke versi baru. Jika disetel ke false, hanya hak istimewa yang diperlukan untuk menjalankan perintah dalam skrip instalasi atau pembaruan yang diperlukan.

Nilai tidak disetel pgcrypto.control, jadi default ke true yang membutuhkan SuperUser.

Ini berarti Anda tidak dapat CREATE EXTENSIONhanya sebagai pemilik basis data, terlepas dari apa yang dibuat oleh dokumen tentang CREATE EXTENSION yang membuat Anda percaya.

Saya berusaha keras mengaturnya false, dan tidak ada sukacita. C adalah bahasa yang tidak dipercaya dan Anda akan mendapatkannya

GALAT: izin ditolak karena bahasa c

Dari dokumen di pg_language

Hanya pengguna super yang dapat membuat fungsi dalam bahasa yang tidak terpercaya.

... tentu saja Anda dapat menjadikan ctepercaya UPDATE pg_language set lanpltrusted = true where lanname = 'c';sebagai superuser. Kemudian CREATE EXTENSION pgcryptoakan berfungsi dengan baik sebagai non-superuser. Tapi, itu terdengar seperti ide yang buruk jika Anda harus khawatir tentang pengguna Anda mengunggah sumber ke direktori ekstensi Anda dan kemudian menginstalnya di database. Artinya, saya tidak akan sejauh itu. Saya akan menemukan cara lain untuk menguliti kucing ini.

Evan Carroll
sumber
Terima kasih Evan, itu adalah jawaban selengkap yang saya bisa minta. Saya mungkin akan memilih proposal menguliti @ Kassandry untuk mengatasi ini. Saya juga berpikir tentang membungkus CREATE EXTENSION dalam prosedur tersimpan, tetapi tidak dapat menemukan rute untuk membuat ini bekerja dalam database yang sama tanpa kekakuan otentikasi dblink.
beldaz
Lalu apa gunanya tidak memiliki opsi pg_dumpuntuk mencegahnya membuang pernyataan tentang ekstensi? Saat ini saya harus menggunakan alat pemrosesan teks eksternal untuk menghapus pernyataan dari SQL yang dibuang oleh pg_dump.
Claudix
@ Evan Carroll: apakah mungkin untuk mengatur superuser ke false melalui psql cli? Saya memiliki instance di amazon aws rds dan tidak memiliki akses ke pgcrypto.control.
ribamar
2
@ribamar tidak karena itu berarti bahwa siapa pun yang terhubung ke database dapat melakukan eksekusi kode arbitrer secara literal sebagai postmaster db. itu akan menjadi ide yang mengerikan.
Evan Carroll
bukan siapa-siapa, superuser. Saya mengerti bahwa dengan cara ini Anda membedakan sistem operasi super dari pengguna super dbms, meskipun jika saya membuat keputusan seperti itu, saya akan pergi untuk memberdayakan alat, dan jika benar-benar diperlukan untuk membuat pengguna lain yang lebih kuat, saya akan mengimplementasikannya di dalam alat.
ribamar