Utworzony użytkownik może uzyskać dostęp do wszystkich baz danych w PostgreSQL bez żadnych dotacji


44

Coś mi brakuje, jeśli chodzi o konfigurację PostgreSQL. Chciałbym utworzyć wiele baz danych i użytkowników, którzy są od siebie odizolowani, aby określony użytkownik miał dostęp tylko do baz danych, które wskazałem. Jednak z tego, co mogę ustalić, każdy utworzony użytkownik ma dostęp do wszystkich baz danych bez żadnych konkretnych dotacji.

Oto, co robię na Ubuntu Server 12.04:

  1. apt-get install postgresql
  2. sudo -u postgres createuser -DRSP mike1 (Podanie hasła dla nowego użytkownika)
  3. sudo -u postgres utworzoneb danych1
  4. psql -h localhost -U mike1 data1 (Określanie hasła do logowania użytkownika mike1)

Wygląda na to, że nowy użytkownik „mike1” nie ma problemu z połączeniem z bazą danych „data1” i tworzeniem tabel itp. I to bez uruchamiania jakiejkolwiek komendy GRANT (a właścicielem „data1” jest „postgres”, ponieważ nie określiłem właściciel w kroku 3). Czy to naprawdę tak ma działać?

Chciałbym udzielić mike1 pełnego dostępu do danych1, a następnie powtórzyć to dla większej liczby użytkowników i baz danych, upewniając się, że użytkownicy mają dostęp tylko do jednej (lub kilku) wybranych baz danych.


1
Należy pamiętać, że nawet jeśli użytkownik jest ograniczony do jednej bazy danych, może nadal sprawdzać tabele globalne, co pozwoli mu zobaczyć listę nazw baz danych i listę użytkowników.
— kgrittn

Odpowiedzi:


47

Na poziomie SQL każdy użytkownik może rzeczywiście połączyć się z nowo utworzoną bazą danych, dopóki nie zostanie wydane następujące polecenie SQL:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

Po zakończeniu każdemu użytkownikowi lub roli, która powinna być w stanie się połączyć, należy wyraźnie przyznać uprawnienie do połączenia:

GRANT connect ON DATABASE database_name TO rolename;

Edycja: w scenariuszu z wieloma dzierżawcami connectusunięto by nie tylko uprawnienia. Aby uzyskać porady i najlepsze praktyki najmu, możesz przeczytać na publicznej wiki postgresql: Hosting wspólnej bazy danych i zarządzanie prawami w PostgreSQL .


Domyślnie powinno być na odwrót. Chcę utworzyć użytkownika z losowo generowanym hasłem i przyznać mu dostęp do jednego DB, wiedząc, że postgresmoże on uzyskać dostęp do wszystkich baz danych.
— TheRealChx101

24

PUBLIC ma domyślnie dostęp do bazy danych, ale nie ma dostępu do danych. Możesz ODWOŁAĆ PUBLIKĘ:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

Jeśli chcesz mieć to ustawienie dla wszystkich przyszłych baz danych, odwołaj CONNECT w bazie danych template1 (domyślna baza danych szablonów do tworzenia nowej bazy danych):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

Widzę. Teraz ma to większy sens. Chyba nie powinienem przychodzić tutaj jako nowy użytkownik PostgreSQL i zaprzeczać, że być może PUBLIC nie powinien mieć domyślnie uprawnienia CONNECT na szablonie 1 :) Ale teraz widzę też, że dane nigdy nie były zagrożone. Dzięki!
— mikeplate

1
Jesteś bardzo mile widziany jako nowicjusz, również w przypadku sporów dotyczących ustawień. Każdy może się z tego uczyć!
— Frank Heikens

1
W rzeczywistości to uprawnienie CONNECT nie jest przekazywane z szablonu do nowej bazy danych, więc odwołanie go na szablonie 1 nie ma wspomnianego efektu.
— Daniel Vérité

2
@ DanielVérité Rozumiem. Sądzę więc, że rozwiązaniem jest zawsze pamiętać i wykonać REVOKE CONNECT podczas tworzenia nowej bazy danych. Czy to naprawdę tak robią administratorzy PostgreSQL, czy nie powinienem się tym przejmować, ponieważ dane i tak nie są dostępne? Mimo to uważam, że lista tabel może dawać niepotrzebne informacje na potrzeby przyszłych ataków, jeśli tylko między już autoryzowanymi użytkownikami w środowisku z wieloma dzierżawcami. Ponadto: właśnie zdałem sobie sprawę, że public może również tworzyć własne tabele w dowolnej bazie danych, która nie została REVOKE CONNECT. Muszę powiedzieć, że to trochę dziwne.
— mikeplate

1
Tak. Dodam pokrewne linki do mojej odpowiedzi, możesz przeczytać o tym kilka dodatkowych dokumentów.
— Daniel Vérité

4

Oprócz domyślnego odbierania uprawnień do połączenia z PUBLIC i przyznawania ich zgodnie z konkretnymi potrzebami, drugim poziomem, na którym można kontrolować dostęp, jest plik pg_hba.conf.

Możesz znaleźć miejsce przechowywania pliku za pomocą:

SHOW hba_file;

Jeśli zdecydujesz się skorzystać z tego mechanizmu, zostaną osadzone komentarze, które mogą wystarczyć na rozpoczęcie pracy. Dokumenty są tutaj:

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


Dzięki! Patrzyłem na plik pg_hba.conf, ale miałem wrażenie, że reguluje on tylko sposób uwierzytelniania użytkownika podczas łączenia się z bazą danych, a nie to, jakie uprawnienia ma użytkownik w tej samej bazie danych.
— mikeplate

1
Użytkownik może łączyć się z bazami danych tylko w sposób dozwolony przez pg_hba.conf. Obejmuje to nie tylko połączenie użytkownika i bazy danych, ale także hosta, z którym się łączą, oraz dozwoloną metodę uwierzytelniania. Jeśli nie potrzebujesz tej szczegółowości kontroli, technika GRANT/ REVOKEomówiona w innych odpowiedziach jest prawdopodobnie łatwiejsza. Po pierwsze potrzebujesz do tego połączenia z bazą danych superużytkownika, w przeciwieństwie do logowania do systemu operacyjnego, aby móc edytować plik.
— kgrittn

0

Natknąłem się na ten wątek, szukając sposobu, aby uniemożliwić użytkownikom nawet wyświetlanie innych nazw baz danych. REVOKE CONNECTNie zapobiec.

Zgodnie z odpowiedziami na to SO pytanie nie ma (godnego polecenia) sposobu na osiągnięcie tego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.