Mengapa pengguna baru dapat membuat tabel di PostgreSQL?

13

Saya mengikuti dua tutorial untuk membuat DB dengan:

  1. tautan pengguna yang sepenuhnya istimewa
  2. tautan pengguna hanya baca

Saya kemudian mendapat tip dari tutorial CJ ​​Estel yang menyatakan bahwa "Anda mungkin telah mewarisi kemampuan untuk membuat tabel meskipun kami tidak pernah secara eksplisit memberikannya kepada pengguna baru kami". Benar saja, pengguna read-only dapat membuat dan memiliki tabel!

CJ Estel telah menunjukkan akar penyebab dengan sangat baik, yaitu database templat. Tetapi kemampuan untuk membuat tabel merusak sebagian besar tutorial yang Anda dapatkan dari googling "read only user postgres" termasuk yang di- host di postgresql.org . Pengguna Anda memiliki lebih dari hak baca-saja!

Mengapa pengguna baru memiliki kemampuan ini? Setelah mencabut hak istimewa ini, apakah database benar-benar hanya-baca untuk pengguna itu?

Jesvin Jose
sumber

Jawaban:

13

TL; DR: Pengguna baru dapat membuat tabel dalam publicskema karena orang mengeluh bahwa itu terlalu sulit ketika mereka tidak bisa.

Jika Anda tidak menyukai default, Anda mungkin harus membuat database template baru dengan konfigurasi awal yang Anda inginkan. Misalnya, Anda dapat:

DROP SCHEMA public;

atau

REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;

di templat Anda.

Jika Anda ingin publicpengguna tidak memiliki hak pada database, Anda juga harus:

REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;

sehingga publicpengguna tidak dapat membuat skema atau menggunakan tabel temp.


Secara pribadi, jika saya mendesain ini, saya akan memberikan pengguna TEMPhak pada database secara default, tetapi tidak CREATE(skema dalam database) atau CREATE(tabel dalam publicskema). Saya akan memesannya untuk pemilik.

Itu adalah pilihan yang dibuat sejak lama, dan cukup sulit untuk mengubahnya sekarang.


Seperti adanya, ada keluhan reguler bahwa terlalu sulit untuk memulai dengan PostgreSQL karena Anda harus membuat akun pengguna dan sering ingin membuat database juga. Mengapa tidak kita buat otomatis saja dan default ke 'trust' sebagai mode auth agar mudah? Mengapa postgrespengguna tidak memiliki kata sandi default postgres? Mengapa kita tidak membuat pengguna secara otomatis jika mereka ada di OS? dll.

Ada beberapa masalah kegunaan asli untuk pengguna baru - khususnya, kebanyakan orang tidak tahu apa itu peerauth, atau mengapa hanya berjalan psqlsetelah menginstal PostgreSQL memberi tahu mereka bahwa tidak ada pengguna dengan nama yang mereka masuki.

Ini juga berantakan yang pg_hba.confmerupakan file konfigurasi, tetapi pengguna dibuat di tingkat SQL. Perpecahan ini membingungkan pengguna.

Namun, banyak hal yang merupakan kompromi antara default aman dan default mudah di mana proyek tidak akan pernah membuat semua orang bahagia.

Craig Ringer
sumber
Jadi, saya menjalankan revoke create on database [databasename] from [username];dan DB sekarang benar-benar hanya dibaca untuk [nama pengguna]. Baik? Saya akan kembali ke jawaban ini lagi ketika saya telah membaca buku Postgres yang bagus :)
Jesvin Jose
2
Sebagai balasan untuk komentar sebelumnya, a no.
Jesvin Jose