Pengguna yang dibuat dapat mengakses semua database dalam PostgreSQL tanpa hibah

44

Saya harus kehilangan sesuatu sehubungan dengan pengaturan PostgreSQL. Yang ingin saya lakukan adalah membuat banyak basis data dan pengguna yang diisolasi satu sama lain sehingga pengguna tertentu hanya memiliki akses ke database yang saya tentukan. Namun, dari apa yang saya dapat tentukan, setiap pengguna yang dibuat memiliki akses ke semua database tanpa ada hibah khusus yang diberikan.

Inilah yang saya lakukan pada Ubuntu Server 12.04:

  1. apt-get install postgresql
  2. sudo -u postgres createuser -DRSP mike1 (Menentukan kata sandi untuk pengguna baru)
  3. sudo -u postgres dibuatb data1
  4. psql -h localhost -U mike1 data1 (Menentukan kata sandi untuk pengguna mike1 untuk login)

Tampaknya pengguna baru "mike1" tidak memiliki masalah menghubungkan ke database "data1" dan membuat tabel dll. Dan ini tanpa menjalankan perintah GRANT sama sekali (dan pemilik "data1" adalah "postgres" karena saya tidak menentukan pemilik pada langkah 3). Apakah ini benar-benar cara kerjanya?

Yang ingin saya lakukan adalah memberikan mike1 akses penuh ke data1 dan kemudian ulangi ini untuk lebih banyak pengguna dan basis data, memastikan bahwa pengguna hanya memiliki akses ke satu (atau mungkin beberapa) basis data pilihan saya.

mikeplate
sumber
1
Perlu diingat bahwa meskipun pengguna terbatas pada satu basis data, mereka masih dapat menanyakan tabel global, yang akan memungkinkan mereka untuk melihat daftar nama basis data dan daftar pengguna.
kgrittn

Jawaban:

47

Pada tingkat SQL, setiap pengguna memang dapat terhubung ke database yang baru dibuat, sampai perintah SQL berikut dikeluarkan:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

Setelah selesai, setiap pengguna atau peran yang harus dapat terhubung harus diberikan secara eksplisit hak istimewa koneksi:

GRANT connect ON DATABASE database_name TO rolename;

Sunting: Dalam skenario multi-penyewa, lebih dari sekadar connecthak istimewa akan dihapus. Untuk tips multi-tenancy dan praktik terbaik, Anda mungkin ingin membaca di wiki publik postgresql: Hosting Basis Data Bersama dan Mengelola hak dalam PostgreSQL .

Daniel Vérité
sumber
Standarnya seharusnya sebaliknya. Saya ingin membuat pengguna dengan kata sandi yang dibuat secara acak dan memberikannya akses ke satu DB, mengetahui bahwa itu postgresdapat mengakses semua database.
TheRealChx101
24

PUBLIC memiliki akses ke database secara default, tetapi tidak dapat mengakses data. Anda dapat REVOKE PUBLIC:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

Jika Anda ingin pengaturan ini untuk semua basis data masa depan, cabut CONNECT pada basis data templat1 (templat basis data default untuk membuat basis data baru):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;
Frank Heikens
sumber
Saya melihat. Sekarang lebih masuk akal. Saya kira saya seharusnya tidak datang ke sini sebagai pendatang baru di PostgreSQL dan membantah bahwa mungkin PUBLIC seharusnya tidak memiliki hak istimewa CONNECT pada template1 sebagai default :) Tapi saya sekarang juga melihat bahwa data tidak pernah dalam bahaya. Terima kasih!
mikeplate
1
Anda tidak hanya disambut sebagai pendatang baru, juga untuk menyengketakan pengaturan. Semua orang bisa belajar dari itu!
Frank Heikens
1
Sebenarnya, hak istimewa CONNECT tidak diteruskan dari template ke database baru sehingga membatalkannya di template1 tidak memiliki efek yang disebutkan.
Daniel Verite
2
@ DanielVérité, begitu. Jadi saya kira solusinya adalah selalu mengingat dan melakukan REVOKE CONNECT ketika membuat database baru. Apakah ini benar-benar cara yang biasanya dilakukan oleh admin PostgreSQL, atau tidakkah seharusnya saya terlalu peduli karena data tidak dapat diakses? Namun, saya pikir daftar tabel dapat memberikan informasi yang tidak perlu untuk serangan di masa depan, jika hanya antara pengguna yang sudah resmi di lingkungan multi-penyewa. Juga: baru sadar bahwa publik juga dapat membuat tabel sendiri di basis data apa pun yang belum REVOKE CONNECT. Rasanya agak aneh untuk memiliki sebagai default, saya harus mengatakan.
mikeplate
1
Iya. Saya menambahkan tautan terkait ke jawaban saya, Anda mungkin ingin membaca beberapa dokumen lagi tentang itu.
Daniel Vérité
4

Selain mencabut hak koneksi dari PUBLIC secara default, dan memberikannya sesuai keinginan, level lain di mana Anda dapat mengontrol akses adalah melalui file pg_hba.conf.

Anda dapat menemukan di mana file disimpan dengan:

SHOW hba_file;

Jika Anda memilih untuk menggunakan mekanisme ini, ada komentar yang tertanam yang mungkin cukup untuk Anda mulai. Dokumen ada di sini:

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html

kgrittn
sumber
Terima kasih! Saya memang melihat file pg_hba.conf tapi saya mendapat kesan bahwa itu hanya mengatur bagaimana pengguna mengotentikasi saat menyambungkan ke database dan bukan hak istimewa apa yang dimiliki pengguna dalam database yang sama.
mikeplate
1
Seorang pengguna hanya dapat terhubung ke basis data sebagaimana diizinkan oleh pg_hba.conf. Itu tidak hanya mencakup kombinasi pengguna dan basis data, tetapi juga host dari mana mereka terhubung dan metode otentikasi diizinkan. Jika Anda tidak membutuhkan granularity of control, teknik GRANT/ REVOKEyang dibahas dalam jawaban lain mungkin lebih mudah. Untuk satu hal, Anda hanya perlu koneksi database superuser untuk itu, dibandingkan membutuhkan login OS yang dapat mengedit file.
kgrittn
0

Saya menemukan utas ini mencari cara untuk mencegah pengguna bahkan mendaftarkan nama basis data lainnya. Itu REVOKE CONNECTtidak mencegah ini.

Sesuai jawaban untuk pertanyaan SO ini, tidak ada cara (yang disarankan) untuk mencapainya.

AdamAL
sumber