PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ikhtisar Ekstensi Tepercaya di PostgreSQL 13

Di blog saya sebelumnya, kami menjelajahi kemampuan baru replikasi Logis dengan tabel Partisi di PostgreSQL 13. Tak perlu dikatakan bahwa ada banyak fitur seperti itu dalam rilis yang disebutkan yang akan segera meningkatkan pengalaman untuk DBA dan aplikasi pengembang sama.

Saat melihat PostgreSQL 13, saya mengamati entri yang menarik perhatian saya:

PostgreSQL 13 memperkenalkan konsep "ekstensi tepercaya", yang memungkinkan pengguna super menentukan ekstensi yang dapat dipasang pengguna di database mereka selama mereka memiliki hak istimewa CREATE.

Ayo Putar Ulang

Kita tahu bahwa PostgreSQL memiliki kekuatan ekstensi untuk menambahkan bulu ke tutupnya tanpa mengganggu banyak intinya. Dengan kata lain, ekstensi meningkatkan kemampuan fungsional ke PostgreSQL Server dengan cara yang tidak mengganggu.

Faktanya, ada banyak organisasi pihak ketiga yang telah menggunakan mekanisme ekstensi untuk menghasilkan kumpulan fitur yang luar biasa. TimescaleDB adalah salah satu ekstensi yang mengubah kepribadian PostgreSQL Server agar lebih cocok untuk beban kerja IOT.

Mari kita lihat apa yang ada sebelum PostgreSQL 13 dan mengapa hal itu sangat merepotkan. Pertimbangkan Instance PostgreSQL yang dihosting yang berisi dua peran:

  • postgres (pengguna super)
  • johnsmith (pengguna biasa)

Dan database wooliesdb.

John Smith ingin menambahkan ekstensi postgres hstore ke wooliedb, karena kode aplikasinya mengandalkan itu. Mari kita coba melakukannya.

 psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must be superuser to create this extension.

Kesalahan dengan jelas menunjukkan bahwa ekstensi hanya dapat dibuat oleh pengguna super yaitu postgres. Meskipun ekstensi seperti hstore tidak memiliki masalah keamanan dalam konteks penggunaannya, hanya pengguna super yang dapat membuat ekstensi ini di database.

Bagaimana jika database dimiliki atau dibuat oleh johnsmith - kita dapat mencobanya juga. Dalam cuplikan berikut, superuser postgres mengizinkan johnsmith untuk membuat database baru miliknya sendiri untuk dimainkan:

$ psql -U postgres 

postgres=# ALTER ROLE johnsmith CREATEDB;

postgres=# \q

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE DATABASE jsDB;

wooliesdb=>\c jsDB;

You are now connected to database "jsDB" as user "johnsmith".

jsDB=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must be superuser to create this extension.

Ah! Tidak ada bedanya. Meskipun johnsmith adalah pemilik jsDB,  dia tetap tidak dapat menginstal ekstensi sederhana yang relevan ke databasenya.

Tapi itu saja di server PostgreSQL 12 (dan di bawah); itu akan berubah dengan PostgreSQL versi 13. Pada saat penulisan blog ini - PostgreSQL versi 13 sedang dalam tahap Beta2 dan tim sudah menulis pengumuman rilis. Saya akan mencoba "ekstensi tepercaya" dengan biner Beta2.

Ini Dia PostgreSQL 13

Harapkan perilaku yang berbeda dengan konsep ekstensi tepercaya (setidaknya untuk modul kontribusi atau ekstensi yang sudah dikemas sebelumnya). Mari kita periksa perilaku dengan PostgreSQL13 untuk perintah yang sama yang kita lakukan untuk PostgreSQL12.

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must have CREATE privilege on current database to create this extension.

Yang hampir sama yaitu johnsmith masih tidak dapat membuat ekstensi. Tapi masih ada perbedaan halus - PETUNJUK yang menunjukkan bahwa hak istimewa CREATE tidak ada. Kumpulan perintah kedua kami harus menangani hal itu:

$ psql -U postgres 

postgres=# ALTER ROLE johnsmith CREATEDB;

postgres=# \q

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE DATABASE jsDB;

wooliesdb=>\c jsDB;

You are now connected to database "jsDB" as user "johnsmith".

jsDB=>CREATE EXTENSION hstore;

jsDB=>SELECT extname from pg_extension;

 extname

---------

 plpgsql

 hstore

(2 rows)

Segalanya benar-benar berhasil kali ini. Pengguna super dapat mengizinkan hak istimewa yang sama pada postgres db dengan menjalankan perintah berikut:

postgres=# GRANT CREATE ON DATABASE postgres FOR johnsmith;

Tapi ada lebih banyak ekstensi tepercaya dari ini, mari kita coba membuat ekstensi lain:

jsDB=> create extension file_fdw;

ERROR:  permission denied to create extension "file_fdw"

HINT:  Must be superuser to create this extension.

Perbedaannya berasal dari fakta bahwa sementara hstore ditandai sebagai tepercaya, file_fdw TIDAK ditandai sebagai tepercaya. Di mana itu ditandai? Itu ada di file kontrol ekstensi.

$ cd /usr/pgsql-13/share/extension 

$ grep -l trusted hstore.control file_fdw.control;

hstore.control

Faktanya, ada 24 ekstensi tepercaya dan 24 tidak tepercaya datang dengan postgreSQL13.

Singkatnya, pengguna super dapat melepaskan kendali atas ekstensi tepercaya tersebut; dan setiap pengguna dengan izin CREATE pada database dapat mengaktifkan ekstensi tepercaya tanpa menghubungi administrator database-nya.

Kesimpulan

Di belakang layar, perilaku dikendalikan oleh dua parameter dalam file kontrol ekstensi:

  • pengguna super, yang defaultnya adalah true
  • tepercaya, yang defaultnya salah

Ekstensi dapat dibuat oleh non-pengguna super hanya jika keduanya benar. Faktanya, ekstensi tepercaya adalah skrip instalasi atau pembaruan dijalankan sebagai pengguna super bootstrap, bukan sebagai pengguna yang memanggil. Ingatlah bahwa ekstensi mungkin ditulis dalam bahasa yang tidak dapat dipercaya - oleh karena itu diperlukan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bisakah saya menulis fungsi PostgreSQL di Ruby on Rails?

  2. Ekstrak tanggal (yyyy/mm/dd) dari stempel waktu di PostgreSQL

  3. GROUP BY dan agregat nilai numerik berurutan

  4. Parameter konfigurasi work_mem di PostgreSQL di Linux

  5. Mengembangkan PostgreSQL untuk Windows, Bagian 2