Uprawnienia właściciela bazy danych; użytkownik aplikacji

15

Szybka wersja:

Jakie polecenie powinienem wydać, aby umożliwić właścicielowi bazy danych dostęp do tabel w tej bazie danych i czy można to zrobić z konta tego właściciela?


Dłuższa wersja:

Tworzę bazę danych na RDS. Mam użytkownika „root”, który skonfigurowałem z Amazon.

Amazon automatycznie tworzy rolę grupy „rds_superuser”, która jest bardzo uprzywilejowana, ale w rzeczywistości nie jest superużytkownikiem.

Tworzę bazę danych i użytkownika dla aplikacji w następujący sposób:

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;

Zaktualizowałem ten skrypt, aby uwzględnić sugestie Craiga Ringera dotyczące tego, jak powinienem sobie z tym poradzić.

Kiedy aplikacja łączy się (z poświadczeniami master_application), tworzy (a zatem jest właścicielem) tabele.

Mój problem polega na tym, że nie mogę używać mojego administracyjnego (rootowanego) logowania do uruchamiania zapytań, ponieważ ten użytkownik nie ma uprawnień do tabeli.

Wcześniej udało mi się to rozwiązać, uruchamiając następujące konto aplikacji:

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;

Wydaje się jednak dziwne, aby podporządkowany użytkownik udzielał przywilejów użytkownikowi administracyjnemu.

Więc ... Czy istnieje polecenie, które mogę uruchomić przed lub po utworzeniu tabel z aplikacji, które zapewnią właścicielowi bazy danych dostęp do tabel w bazie danych?


zaktualizuj po ponownej próbie zmiany domyślnych uprawnień ...

To nadal nie zapewnia dostępu do tabel; Widzę, że jest to sugerowane gdzie indziej i ma to sens, ale nie działa dla mnie. Z powłoki psql:

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)

katalog_główny_integracji to mój użytkownik superużytkownika, a użytkownicy to tabela w mojej bazie danych.


Aktualizacja

Otrzymałem dość bezużyteczną odpowiedź od kogoś z Amazon.

Poprosili mnie, abym zadzwonił do ALTER DEFAULT PRIVILEGES z loginu master_application. Chociaż to prawdopodobnie działałoby, nie odpowiadałoby na moje pytanie (jak mam to zrobić wyłącznie z konta rds_superuser).

Poprosiłem ich o wyjaśnienie i odeszli.

Andy Davis
źródło

Odpowiedzi:

9

Chcesz ALTER DEFAULT PRIVILEGES.

Przyznaj rds_superuserdomyślne prawa dostępu do wszystkich nowych tabel.

Wpływa to tylko na tabele utworzone po ALTER. W przypadku istniejących tabel musisz mieć GRANTprawa.

Craig Ringer
źródło
Próbowałem to zrobić. Źle sformułowałem to w pierwotnym pytaniu, edytowałem je, aby pokazać dokładnie polecenie, które wykonałem. Czy coś źle zrozumiałem?
Andy Davis,
Wpływa tylko tabele utworzone poALTER . Kiedy to zrobiłeś? W przypadku istniejących tabel musisz mieć GRANTprawa.
Craig Ringer
Zmieniłem domyślne uprawnienia, a następnie utworzyłem tabele. Spróbuję jeszcze raz, być może popełniłem błąd.
Andy Davis,
Nadal nie ma z tym szczęścia, chociaż absolutnie wydaje się, że polecenie to powinno rozwiązać problem. Zaktualizowałem polecenie, aby zawierało dane wyjściowe z \ ddp i \ dp z jednej z tabel.
Andy Davis,
Okropnie dziwne. Czy możesz odtworzyć problem w zwykłym (innym niż RDS) PostgreSQL?
Craig Ringer
0

Schemat publiczny powinien być widoczny dla wszystkich użytkowników. Nie należy ograniczać praw publicznego schematu tylko do jednej grupy.

Więc jeśli nie używasz:

GRANT ALL ON SCHEMA public TO GROUP rds_superuser WITH GRANT OPTION;

Możesz bezpiecznie pracować ze schematem publicznym ze wszystkimi kontami.

Jeśli nie chcesz, aby określone konta zepsuły publiczne tabele schematów, utwórz nową rolę (dla użytkowników aplikacji) i odwołaj prawa z tej konkretnej roli w schemacie publicznym. Coś jak:

CREATE USER mywebuser WITH PASSWORD '*****';
REVOKE ALL PRIVILEGES ON SCHEMA public FROM mywebuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mywebuser; (or whatever rights you need to provide)

Nie na odwrót, gdy próbujesz to zrobić.

Alexandros
źródło
Co? GRANTNigdy nie powinien być w stanie ograniczyć prawa dostępu. Nie jestem przekonana. Zauważ, że prawa do schematu również nie są dziedziczone przez nowe tabele w tym schemacie, więc dostęp do publicschematu nie oznacza, że ​​możesz używać tabel w nim zawartych.
Craig Ringer
W końcu udało mi się to wypróbować i to nie pomaga w sytuacji.
Andy Davis,
Zredagowałem pytanie, aby wyeliminować Granta, o którym mówił @Aleandros. Wydawało się, że to nie jest problem, ale myślę, że to było odwrócenie uwagi.
Andy Davis,