PostgreSQL: odmowa dostępu dla relacji

14

Jestem trochę zdezorientowany, jeśli chodzi o ustawianie uprawnień w PostgreSQL.

Mam następujące role:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {rails}
 rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {rails}

i bazy danych:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

użytkownik myappnie ma problemu z zapytaniem do myapp_productionbazy danych o dodawanie i usuwanie rekordów. Chciałbym meltemirównież móc wysłać zapytanie do tej samej bazy danych. Stworzyłem rolę, railsktóra jest właścicielem bazy danych, i stworzyłem zarówno członków, jak meltemii myappczłonków rails. Ale wciąż dostaję permission denied for relationbłędy. Meltemimoże wyświetlić schemat, ale nie może wykonać zapytania do bazy danych.

Właśnie zauważyłem (z \dtpoleceniem), że myappjest właścicielem tabel:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

Tabele zostały utworzone za pomocą ORM (migracje ActiveRecord w Railsach).

Wiem, że autoryzacja jest bardzo różna w PostgreSQL (w przeciwieństwie do MySQL i innych, z których korzystałem). Jak powinienem skonfigurować bazę danych, aby różni użytkownicy mieli do niej dostęp? Niektóre powinny być w stanie CRUD, ale inne mogą tylko czytać itp.

Dziękuję za wszelką pomoc. Przepraszam, wiem, że to bardzo podstawowe pytanie, ale sam nie znalazłem odpowiedzi.

Meltemi
źródło

Odpowiedzi:

4

Właśnie o tym napisałem w mojej odpowiedzi na Przyznawanie praw do bazy danych postgresql innemu użytkownikowi na ServerFault.

Zasadniczo najlepszym rozwiązaniem, gdy masz jednego użytkownika i chcesz przyznać innym użytkownikom takie same prawa, jest przekształcenie tego użytkownika w grupę, utworzenie nowego użytkownika o takiej samej nazwie jak oryginalny, który jest członkiem grupy, i przyznaj tę grupę również innym użytkownikom.

Więc w twoim przypadku railszmienia się jego nazwa myapp_users, a następnie tworzysz nową rolę logowania (użytkownika) o nazwie railsi GRANT myapp_users TO rails. Teraz ty GRANT myapp_users TO meltemi. Zarówno nowe railskonto, jak i meltemiużytkownik mają teraz prawa do starego railskonta.

Aby uzyskać bardziej szczegółową kontrolę, zwykle zalecam unikanie przekazywania użytkownikom tabel lub ich grup codziennego logowania. Daj im dostęp za pośrednictwem NOINHERITgrupy, do której muszą jawnie SET GROUP, lub lepiej, użyć zupełnie innego użytkownika do operacji uprzywilejowanych, takich jak DDL i GRANTs. Niestety nie działa to z Railsami, ponieważ Rails lubi stosować migracje, kiedy tylko ma na to ochotę, a AFAIK nie daje możliwości określenia innego, bardziej uprzywilejowanego użytkownika do uruchamiania migracji jako.

Craig Ringer
źródło
OK, przeczytaj post, do którego linkujesz; bardzo pomocny! Teraz, jeśli dobrze rozumiem, myślę, że mógłbyś chcieć użyć myappzamiast railspowyższego? Ponieważ myappjest właścicielem tabel (nigdy tego nie określiłem, migracja musi mieć). W każdym razie miałoby to sens, gdybym zmienił nazwę myappna, myapp_groupa następnie stworzyłem nowego użytkownika, myappktórego aplikacja railsowa użyłaby do połączenia z DB. Marka myappi istniejący meltemi, obaj członkowie myapp_grouproli. Ale co się stanie, gdy uruchomię następną migrację. czy nie będzie należał do niego myappponownie, tworząc problem od nowa?!?
Meltemi
1
Musisz zrozumieć, że PostgreSQL ma tylko roles(od wersji 8.1). Warunki useri groupsą przechowywane ze względów historycznych i zgodności. Zasadniczo „grupa” to rola bez uprawnień do logowania. Można przyznać myappsię melteminawet jeśli myappjest to tylko kolejny „user”. Zacznij od przeczytania instrukcji tutaj .
Erwin Brandstetter,
Ja rozumiem rolesvs groupsvs usersseparacji w PostgreSQL, przynajmniej ja myślę ja. Przepraszam, że użyłem złej (i mylącej) terminologii powyżej. Ale nadal nie rozumiem, jak skonfigurować moją bazę danych, więc rola bez logowania OWNS bazy danych i dwie role logowania myappi meltemioba mogą mieć pełny dostęp. Jedną z tych ról myappbędzie uruchamianie migracji Railsów , które nieuchronnie będą tworzyć nowe tabele, które są ponownie własnością myappużytkownika logowania. Czy powinienem po prostu zostać meltemiczłonkiem myappi skończyć z tym? Ale to po prostu wydaje się niechlujne ... nie?!?
Meltemi
1
@Meltemi: Jeśli chcesz przyznać wszystkie myappposiadane przywileje meltemi, byłoby to właściwe. Jeśli chcesz meltemiuzyskać tylko podzbiór uprawnień, nie będzie. Następnie utwórz rolę grupy, aby zachować zestaw uprawnień i nadać ją meltemi. Prawdopodobnie będziesz zainteresowany tym powiązanym pytaniem na temat SO . Odpowiedziałem wyjaśniającDEFAULT PRIVILEGES
Erwin Brandstetter,
@Meltemi Tak, jak zwykle migracje szyn komplikują obraz. Railsy naprawdę powinny umożliwiać określenie innego konta użytkownika do uruchamiania migracji jako. Możesz ewentualnie dodać SET ROLEpolecenie na początku migracji i RESET ROLEna końcu, ale nie ufam Railsom, aby wszystko działało poprawnie. Erwin ma rację; w takim przypadku najlepszym obejściem będzie, GRANTże szyny użytkownika dają prawo własności drugiemu użytkownikowi, używając pierwszego użytkownika jako grupy drugiego.
Craig Ringer,