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

Berikan hak istimewa untuk database tertentu di PostgreSQL

Konsep dasar di Postgres

Peran adalah objek global yang dapat mengakses semua database dalam kluster db - diberikan hak istimewa yang diperlukan.

Sebuah kluster menyimpan banyak database , yang menyimpan banyak skema . Skema (bahkan dengan nama yang sama) di DB yang berbeda tidak terkait. Pemberian hak istimewa untuk skema hanya berlaku untuk skema khusus ini di DB saat ini (DB saat ini pada saat pemberian).

Setiap database dimulai dengan skema public secara default. Itu konvensi, dan banyak pengaturan dimulai dengan itu. Selain itu, skema public hanyalah skema seperti yang lain.

Berasal dari MySQL, Anda mungkin ingin memulai dengan skema tunggal public , secara efektif mengabaikan lapisan skema sepenuhnya. Saya menggunakan lusinan skema per database secara teratur.
Skema sedikit (tetapi tidak sepenuhnya) seperti direktori dalam sistem file.

Setelah Anda menggunakan beberapa skema, pastikan untuk memahami search_path pengaturan:

  • Bagaimana search_path mempengaruhi resolusi pengenal dan "skema saat ini"

Hak istimewa default

Per dokumentasi pada GRANT :

PostgreSQL memberikan hak istimewa default pada beberapa jenis objek kePUBLIC . Tidak ada hak istimewa yang diberikan kepada PUBLIC secara default pada tabel, kolom, skema atau tablespace. Untuk tipe lain, hak istimewa default diberikan kepada PUBLIC adalah sebagai berikut:CONNECT dan CREATE TEMP TABLE untuk database; EXECUTE hak istimewa untuk fungsi; dan USAGE hak istimewa untuk bahasa.

Semua default ini dapat diubah dengan ALTER DEFAULT PRIVILEGES :

  • Berikan semua pada skema tertentu di db ke peran grup di PostgreSQL

Peran grup

Seperti komentar @Craig, sebaiknya GRANT hak istimewa untuk peran grup dan kemudian membuat anggota pengguna tertentu dari peran itu (GRANT peran grup ke peran pengguna). Dengan cara ini, lebih mudah untuk menangani dan mencabut kumpulan hak istimewa yang diperlukan untuk tugas-tugas tertentu.

Peran grup hanyalah peran lain tanpa login. Tambahkan login untuk mengubahnya menjadi peran pengguna. Selengkapnya:

  • Mengapa PostgreSQL menggabungkan pengguna dan grup menjadi peran?

Peran standar

Pembaruan: Postgres 14 atau yang lebih baru menambahkan peran baru yang telah ditentukan sebelumnya (secara resmi disebut "peran default") pg_read_all_data dan pg_write_all_data untuk menyederhanakan beberapa hal di bawah ini. Lihat:

  • Berikan akses ke semua tabel database

Resep

Katakanlah, kami memiliki database baru mydb , grup mygrp , dan pengguna myusr ...

Saat terhubung ke database yang dimaksud sebagai pengguna super (postgres misalnya):

REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public

GRANT USAGE ON SCHEMA public TO mygrp;

Untuk menetapkan "seorang pengguna semua hak istimewa ke semua tabel" seperti yang Anda tulis (saya mungkin lebih membatasi):

GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those

Untuk menyetel hak istimewa default untuk objek mendatang, jalankan untuk setiap peran yang membuat objek dalam skema ini:

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;

-- more roles?

Sekarang, berikan grup kepada pengguna:

GRANT mygrp TO myusr;

Jawaban terkait:

  • PostgreSQL - Pengguna DB hanya diizinkan untuk memanggil fungsi

Setelan alternatif (non-standar)

Berasal dari MySQL, dan karena Anda ingin memisahkan hak istimewa pada basis data, Anda mungkin menyukai pengaturan non-standar ini db_user_namespace . Per dokumentasi:

Parameter ini mengaktifkan nama pengguna per database. Ini tidak aktif secara default.

Baca manual dengan cermat. Saya tidak menggunakan pengaturan ini. Itu tidak membatalkan hal di atas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat terhubung ke database heroku postgresql dari aplikasi node lokal dengan sekuel

  2. Menstandardisasi Keamanan PostgreSQL di Lingkungan Multi-Cloud

  3. Bagaimana cara melakukan kueri pemilihan di blok DO?

  4. Bisakah saya menulis fungsi PostgreSQL di Ruby on Rails?

  5. Perbarui beberapa baris dalam kueri yang sama menggunakan PostgreSQL