Saya ingin memigrasi aplikasi berbasis database yang cukup sederhana, internal, dari SQLite3 ke PostgreSQL 9.3 dan memperketat izin dalam DB saat saya pergi.
Aplikasi saat ini terdiri dari perintah untuk memperbarui data; dan satu untuk menanyakannya. Secara alami, saya juga perlu memelihara database dengan cara lain (membuat tabel baru, tampilan, pemicu, dll).
Meskipun aplikasi ini akan menjadi satu-satunya yang di-host di server pada awalnya, saya lebih suka untuk memanggang dengan asumsi bahwa itu mungkin di-host di server dengan database lain di masa depan, daripada harus berebut nanti jika itu diperlukan di masa depan.
Saya akan berpikir bahwa ini akan menjadi seperangkat persyaratan yang cukup umum, tetapi saya mengalami kesulitan menemukan tutorial sederhana yang menjelaskan cara mengatur database baru di PostgreSQL, dengan pemisahan pengguna / hak istimewa semacam ini. Referensi panjang lebar tentang grup, pengguna, peran, database, skema, dan domain; tetapi saya menemukan mereka membingungkan.
Inilah yang saya coba sejauh ini (dari dalam psql
sebagai 'postgres'):
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';
GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;
Tapi saya tidak mendapatkan semantik yang dimaksud. 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).
Ketika saya mencoba ini, saya menemukan bahwa saya dapat membuat tabel hostdb
sebagai salah satu dari pengguna ini; tetapi, untuk setiap pengguna, saya hanya bisa membaca atau memodifikasi tabel yang dibuat oleh pengguna itu - kecuali saya menggunakan eksplisit GRANT
.
Saya menduga ada sesuatu yang hilang di antara CREATE DATABASE
dan CREATE SCHEMA
, sesuatu untuk diterapkan SCHEMA
pada DATABASE
?
(Ketika segalanya menjadi lebih maju, saya juga akan memiliki pertanyaan untuk menerapkan pembatasan serupa pada TRIGGERS
, prosedur yang tersimpan, VIEWS
dan mungkin objek lainnya).
Di mana saya dapat menemukan panduan, tutorial, atau seri video yang layak tentang ini?
sumber
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.public
terjadi bersama yang memiliki hak istimewaPUBLIC
. Selain itu, tidak ada hak default untuk skema baru. Jadi ini tidak mempengaruhi use case yang ditunjukkan. Lihat bab dalam jawaban saya.Jawaban:
Anda akan menemukan semuanya di manual. Tautan di bawah ini.
Memang, masalahnya tidak sepele dan kadang membingungkan. Ini resep untuk use case:
resep
Sebagai superuser
postgres
: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):
Saya menyebutkan skema
schma
(bukanhostdb
yang akan membingungkan). Pilih nama apa saja. Secara opsional, buatschma_admin
pemilik skema:Untuk
and drop and alter
melihat catatan di bawah.Tampilan spesial. Untuk satu:
Dan untuk Tampilan yang Dapat Diupdate :
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:Atau buat semua objek dengan peran
schma_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 superuserpostgres
. Kepemilikan Tentukan kembali untukschma_admin
dan hak set manual - atau setDEFAULT PRIVILEGES
untukpostgres
juga (sambil terhubung ke DB benar!):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:
Anda mungkin juga ingin menetapkan hak default untuk
FUNCTIONS
danTYPES
(bukan adilTABLES
danSEQUENCES
), tetapi itu mungkin tidak diperlukan.Hak istimewa default untuk
PUBLIC
Hak istimewa yang diberikan
PUBLIC
tidak sempurna dan ditaksir berlebihan oleh sebagian orang. Dokumentasi:Penekanan berani saya. biasanya satu perintah di atas sudah cukup untuk mencakup semuanya:
Secara khusus, tidak ada hak default yang diberikan
PUBLIC
untuk skema baru. Mungkin membingungkan bahwa skema default bernama "publik" dimulai denganALL
hak istimewa untukPUBLIC
. 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 templattemplate1
, lalu semua database yang baru dibuat di kluster ini dimulai tanpa mereka:Hak istimewa
TEMP
Karena kami mencabut semua hak istimewa
hostdb
dariPUBLIC
, pengguna biasa tidak dapat membuat tabel sementara kecuali kami mengizinkannya secara eksplisit. Anda mungkin atau mungkin tidak ingin menambahkan ini:search_path
Jangan lupa untuk mengatur
search_path
. Jika Anda hanya mendapatkan satu basis data di kluster, Anda cukup menetapkan global defaultpostgresql.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 istimewaPUBLIC
dalam kasus ini.Terkait
sumber
this
memang terlihat seperti instruksi untuk pesawat ruang angkasa ...