Di mana saya dapat menemukan panduan, tutorial, atau seri video yang layak tentang ini?
Anda akan menemukan semuanya di manual. Tautan di bawah ini.
Memang, masalahnya tidak sepele dan kadang membingungkan. Ini resep untuk use case:
resep
Saya ingin mengkonfigurasinya sehingga hanya hostdb_admin
bisa membuat (dan menjatuhkan dan mengubah) tabel;
yang hostdb_mgr
dapat membaca, memasukkan, update dan menghapus pada semua tabel secara default;
dan hostdb_usr
hanya bisa membaca semua tabel (dan tampilan).
Sebagai superuser postgres
:
CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr WITH PASSWORD 'youwish2';
CREATE USER schma_usr WITH PASSWORD 'youwish3';
Jika Anda menginginkan admin yang lebih kuat yang juga dapat mengelola database dan peran, tambahkan atribut peran CREATEDB
dan diCREATEROLE
atas.
Berikan masing-masing peran ke level yang lebih tinggi berikutnya, sehingga semua level "mewarisi" setidaknya set hak istimewa dari level yang lebih rendah berikutnya (cascading):
GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public; -- see notes below!
GRANT CONNECT ON DATABASE hostdb TO schma_usr; -- others inherit
\connect hostdb -- psql syntax
Saya menyebutkan skema schma
(bukan hostdb
yang akan membingungkan). Pilih nama apa saja. Secara opsional, buat schma_admin
pemilik skema:
CREATE SCHEMA schma AUTHORIZATION schma_admin;
SET search_path = schma; -- see notes
ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr IN DATABASE hostdb SET search_path = schma;
GRANT USAGE ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT ON TABLES TO schma_usr; -- only read
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr; -- + write, TRUNCATE optional
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr; -- SELECT, UPDATE are optional
Untuk and drop and alter
melihat catatan di bawah.
Ketika segalanya menjadi lebih maju, saya juga akan memiliki pertanyaan untuk menerapkan pembatasan serupa pada TRIGGERS
, prosedur yang tersimpan, VIEWS
dan mungkin objek lainnya.
... (tetapi perhatikan bahwa ALL TABLES
ini termasuk pandangan dan tabel asing).
Dan untuk Tampilan yang Dapat Diupdate :
Perhatikan bahwa pengguna yang melakukan penyisipan, memperbarui atau menghapus pada tampilan harus memiliki hak menyisipkan, memperbarui atau menghapus hak istimewa pada tampilan tersebut. Selain itu pemilik tampilan harus memiliki hak istimewa yang relevan pada hubungan dasar yang mendasarinya, tetapi pengguna yang melakukan pembaruan tidak memerlukan izin apa pun pada hubungan dasar yang mendasarinya (lihat
Bagian 38.5 ).
Pemicu juga istimewa. Anda membutuhkan TRIGGER
hak istimewa di atas meja, dan:
Tapi kami sudah terlalu memperluas cakupan pertanyaan ini ...
Catatan penting
Kepemilikan
Jika Anda ingin mengizinkan schma_admin
(sendiri) untuk menjatuhkan dan mengubah tabel, buat peran milik semua objek. Dokumentasi:
Hak untuk menjatuhkan suatu objek, atau untuk mengubah definisinya dengan cara apa pun, tidak diperlakukan sebagai hak istimewa yang dapat diberikan; itu melekat pada pemilik, dan tidak dapat diberikan atau dicabut. (Namun, efek serupa dapat diperoleh dengan memberikan atau mencabut keanggotaan dalam peran yang memiliki objek; lihat di bawah.) Pemilik secara implisit juga memiliki semua opsi hibah untuk objek tersebut.
ALTER TABLE some_tbl OWNER TO schma_admin;
Atau buat semua objek dengan peranschma_admin
untuk memulai, maka Anda tidak perlu mengatur pemilik secara eksplisit. Ini juga menyederhanakan hak default, yang kemudian Anda hanya perlu mengatur untuk satu peran:
Objek yang sudah ada sebelumnya
Hak istimewa default hanya berlaku untuk objek yang baru dibuat dan hanya untuk peran tertentu yang dibuat dengannya. Anda juga ingin menyesuaikan izin untuk objek yang ada :
Hal yang sama berlaku jika Anda membuat objek dengan peran yang tidak DEFAULT PRIVILEGES
disetel, seperti superuser postgres
. Kepemilikan Tentukan kembali untuk schma_admin
dan hak set manual - atau set DEFAULT PRIVILEGES
untuk postgres
juga (sambil terhubung ke DB benar!):
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ... -- etc.
Hak istimewa default
Anda kehilangan aspek penting dari ALTER DEFAULT PRIVILEGES
perintah. Ini berlaku untuk peran saat ini kecuali dinyatakan sebaliknya:
Hak istimewa default hanya berlaku untuk database saat ini. Jadi Anda tidak mengacaukan dengan database lain di DB cluster. Dokumentasi:
untuk semua objek yang dibuat dalam database saat ini
Anda mungkin juga ingin menetapkan hak default untuk FUNCTIONS
dan TYPES
(bukan adil TABLES
dan SEQUENCES
), tetapi itu mungkin tidak diperlukan.
Hak istimewa default untuk PUBLIC
Hak istimewa yang diberikan PUBLIC
tidak sempurna dan ditaksir berlebihan oleh sebagian orang. Dokumentasi:
PostgreSQL memberikan hak default pada beberapa jenis objek
PUBLIC
. Tidak ada hak istimewa diberikan PUBLIC
secara default pada tabel, kolom, skema, atau tablespace. Untuk tipe lain, hak default yang diberikan PUBLIC
adalah sebagai berikut: CONNECT
dan CREATE TEMP TABLE
untuk database; EXECUTE
hak istimewa untuk fungsi; dan USAGE
hak istimewa untuk bahasa.
Penekanan berani saya. biasanya satu perintah di atas sudah cukup untuk mencakup semuanya:
REVOKE ALL ON DATABASE hostdb FROM public;
Secara khusus, tidak ada hak default yang diberikan PUBLIC
untuk skema baru. Mungkin membingungkan bahwa skema default bernama "publik" dimulai dengan ALL
hak istimewa untuk PUBLIC
. Itu hanya fitur kenyamanan untuk memudahkan memulai dengan database yang baru dibuat. Itu tidak mempengaruhi skema lain dengan cara apa pun. Anda bisa mencabut hak istimewa ini di database templat template1
, lalu semua database yang baru dibuat di kluster ini dimulai tanpa mereka:
\connect template1
REVOKE ALL ON SCHEMA public FROM public;
Hak istimewa TEMP
Karena kami mencabut semua hak istimewa hostdb
dari PUBLIC
, pengguna biasa tidak dapat membuat tabel sementara kecuali kami mengizinkannya secara eksplisit. Anda mungkin atau mungkin tidak ingin menambahkan ini:
GRANT TEMP ON DATABASE hostdb TO schma_mgr;
search_path
Jangan lupa untuk mengatur search_path
. Jika Anda hanya mendapatkan satu basis data di kluster, Anda cukup menetapkan global default postgresql.conf
. Lain (lebih mungkin) mengaturnya sebagai properti dari database, atau hanya untuk peran yang terlibat atau bahkan kombinasi keduanya. Detail:
Anda mungkin ingin mengaturnya schma, public
jika Anda menggunakan skema publik juga, atau bahkan (kurang mungkin) $user, schma, public
...
Alternatifnya adalah dengan menggunakan skema "publik" default yang akan berfungsi dengan pengaturan default search_path
kecuali Anda mengubahnya. Ingatlah untuk mencabut hak istimewa PUBLIC
dalam kasus ini.
Terkait
public
pseudorole. Dapat dianggap sebagai peran yang setiap peran lainnya (pengguna, grup - semuanya sama) adalah anggota. Cobalah untuk menghapus hak istimewa darinya dengan, misalnyaREVOKE CREATE ON SCHEMA hostdb FROM public
,. Mencabut hak di tingkat basis data, seperti yang Anda lakukan, hanya menonaktifkan beberapa izin tingkat basis data, tidak berpengaruh pada skema atau tabel.