Dlaczego nowy użytkownik może tworzyć tabele w PostgreSQL?

13

Wykonałem dwa samouczki, aby utworzyć bazę danych za pomocą:

  1. w pełni uprzywilejowany link użytkownika
  2. link użytkownika tylko do odczytu

Następnie otrzymałem wskazówkę z samouczka CJ Estela, w której stwierdziłem, że „być może odziedziczyłeś możliwość tworzenia tabel, chociaż nigdy nie daliśmy tego wyraźnie nowemu użytkownikowi”. Oczywiście użytkownik tylko do odczytu może tworzyć i posiadać tabele!

CJ Estel bardzo dobrze wskazał główną przyczynę, mianowicie bazę danych szablonów. Ale możliwość tworzenia tabel podważa większość samouczków, które otrzymujesz z Google „postgres użytkownika tylko do odczytu”, w tym jednego hostowanego na postgresql.org . Twój użytkownik ma więcej niż uprawnienia tylko do odczytu!

Dlaczego nowy użytkownik ma taką możliwość? Czy po cofnięciu tego uprawnienia baza danych jest naprawdę tylko do odczytu dla tego użytkownika?

Jesvin Jose
źródło

Odpowiedzi:

13

TL; DR: Nowi użytkownicy mogą tworzyć tabele w publicschemacie, ponieważ ludzie narzekali, że było to zbyt trudne, gdy nie mogli.

Jeśli nie podoba Ci się wartość domyślna, prawdopodobnie powinieneś utworzyć nową bazę danych szablonów z pożądaną konfiguracją początkową. Na przykład możesz:

DROP SCHEMA public;

lub

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

w twoim szablonie.

Jeśli chcesz, aby publicużytkownik nie miał żadnych uprawnień do bazy danych, powinieneś dodatkowo:

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

aby publicużytkownik nie mógł tworzyć schematów ani używać tabel tymczasowych.


Osobiście, gdybym to projektował, dałbym użytkownikom TEMPdomyślnie prawo do bazy danych, ale nie CREATE(schematy w bazie danych) lub CREATE(tabele w publicschemacie). Zarezerwowałbym je dla właściciela.

Są to jednak wybory, których dokonano dawno temu i teraz bardzo trudno je zmienić.


W tej chwili pojawiają się regularne skargi, że zbyt trudno jest zacząć korzystać z PostgreSQL, ponieważ musisz utworzyć konto użytkownika i często chcesz również utworzyć bazę danych. Dlaczego po prostu nie utworzymy ich automatycznie i domyślnie „zaufamy” jako trybowi uwierzytelnienia, aby było to łatwe? Dlaczego postgresużytkownik domyślnie nie ma hasła postgres? Dlaczego po prostu nie tworzymy automatycznie użytkowników, jeśli istnieją w systemie operacyjnym? itp.

Istnieją nowe problemy z użytecznością dla nowych użytkowników - w szczególności większość ludzi nie ma pojęcia, czym peerjest uwierzytelnianie lub dlaczego właśnie uruchomienie psqlpo zainstalowaniu PostgreSQL mówi im, że nie ma użytkownika o nazwie, pod którą się zalogowali.

Jest to również bałagan, który pg_hba.confjest plikiem konfiguracyjnym, ale użytkownicy są tworzeni na poziomie SQL. Ten podział dezorientuje użytkowników.

Jednak wiele rzeczy to kompromisy między bezpiecznymi domyślnymi i łatwymi domyślnymi, w których projekt nigdy nie sprawi, że wszyscy będą zadowoleni.

Craig Ringer
źródło
Tak, uruchamiam revoke create on database [databasename] from [username];i DB jest teraz naprawdę tylko do odczytu dla [nazwa użytkownika]. Dobrze? Wrócę do tej odpowiedzi ponownie, gdy przeczytam dobrą książkę Postgres :)
Jesvin Jose
2
W odpowiedzi na poprzedni komentarz to nie.
Jesvin Jose,