Orang-orang,
Saya dapat menggunakan bantuan Anda untuk membuat desain kontrol akses pengguna Postgres saya lebih baik dan lebih selaras dengan praktik terbaik. Saya membantu meluncurkan server Postgres produksi kecil tapi saya bukan admin DB, jadi saya tahu cukup berbahaya.
Ada satu server dengan satu instalasi Postgres v9.2. Instalasi ini meng-host beberapa database, masing-masing sepenuhnya melayani "pelanggan" yang berbeda. Dengan kata lain, customer1 tidak akan, tidak boleh menggunakan database2, dan sebagainya. Selama operasi normal, basis data masing-masing diakses oleh instance yang cocok dari CakePHP, semuanya terletak pada server yang sama dengan Postgres. Meskipun ada kemungkinan optimasi pada penyebaran ini, saya lebih tertarik pada peran Psql.
Berdasarkan apa yang saya baca, tampaknya tiga jenis peran masuk akal:
- Postuser superuser dengan kata sandi non default
- Peran administrator yang tidak memiliki hak superuser untuk pemeliharaan rutin, pembuatan DB, cadangan, memulihkan. Harus bisa melakukan apa saja dengan semua basis data pelanggan.
- Peran pengguna hanya dengan kemampuan untuk CRUD di database masing-masing. Lebih banyak hak atas DB mereka sendiri dapat ditoleransi jika membersihkan implementasi.
Menerapkan desain itu adalah hal yang membuat saya kurang percaya diri. Kepemilikan DB versus tabel dan juga siapa yang harus mewarisi dari yang agak berlumpur. Di bawah ini adalah basis data dan pengguna saya. Apakah itu info yang cukup untuk mengevaluasi implementasi?
Role name | Attributes | Member of
-----------+------------------------------------------------+-------------------
admin | Create role, Create DB | {user1, user2}
postgres | Superuser, Create role, Create DB | {}
user1 | | {}
user2 | | {}
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
admin | postgres | UTF8 | en_US | en_US | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | admin=CTc/postgres
postgres | postgres | UTF8 | en_US | en_US |
template0 | postgres | UTF8 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
user1 | admin | UTF8 | en_US | en_US | =Tc/admin +
| | | | | admin=CTc/admin +
| | | | | user1=CTc/admin
user2 | admin | UTF8 | en_US | en_US | =Tc/admin +
| | | | | admin=CTc/admin +
| | | | | user2=CTc/admin
Untuk mencegah koneksi eksternal dan kata sandi di clear, pg_hba.conf adalah sebagai berikut:
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
sumber
Jawaban:
Saya tahu ini adalah pertanyaan lama tetapi saya akan mencoba menjawabnya bahkan sekarang, karena saya harus melakukan penelitian terkait hal ini.
Apa yang Anda coba lakukan disebut multi-tenancy di tingkat basis data. Ini dapat dicapai dengan dua cara:
Namun, dalam satu kluster basis data tunggal, bagaimana OP menjelaskan, pilihan pribadi saya adalah sebagai berikut:
Setiap pelanggan mendapatkan kelompok basis data mereka sendiri. Ini adalah solusi pilihan saya terutama karena saya biasanya bekerja dengan aplikasi yang memiliki basis data besar per setiap pelanggan.
Anda juga dapat menggunakan kombinasi di atas dan menggunakan pgBouncer sebagai router.
sumber