Jak mogę utworzyć użytkownika tylko do odczytu dla kopii zapasowych w PostgreSQL?

15

Czy to prawda, że ​​NIE można utworzyć użytkownika kopii zapasowej tylko do odczytu w PostgreSQL?

Powiedziano mi na kanale IRC, że po prostu nie możesz mieć użytkownika kopii zapasowej bez uprawnień własności. Uważam to za bardzo dziwne, więc chcę się upewnić, że czegoś nie umknie.

Poniżej próbowałem, ale nie daje to wyników, których szukam. Kiedy robię pg_dumpna danym stole, otrzymuję Permission denied for relation...:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

Każda pomoc byłaby bardzo mile widziana!

milosgajdos
źródło

Odpowiedzi:

9

Nie, to proste (teraz i tak).

  1. Udziel uprawnienia do połączenia nowemu użytkownikowi

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. Przyznaj uprawnienia do wszystkich bieżących obiektów bazy danych. Jest to specyficzne dla schematu i będziesz musiał uruchomić jedną kopię dla każdego schematu, którego chcesz użyć dla użytkownika,

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    Od docs , ALL TABLESzawiera wszystko, czego chcesz.

    Istnieje również opcja przyznania uprawnień do wszystkich obiektów tego samego typu w ramach jednego lub więcej schematów. Ta funkcja jest obecnie obsługiwana tylko dla tabel, sekwencji i funkcji (należy jednak pamiętać, że WSZYSTKIE TABELE uważa się za zawierające widoki i tabele obce.

  3. Następnie, ALTER DEFAULT PRIVLEGESaby przyznać przyszłe SELECT uprawnienia dla obiektów, które nie zostały jeszcze utworzone.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;
Evan Carroll
źródło
Zauważyłem, że podczas pracy ALTER DEFAULT PRIVILEGES ... myReadonlyUser, 2 dodatkowe linie są dodawane do zrzutu: ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;. Wygląda na to, że root nie będzie mógł nic zrobić na nowych stołach. Czy to prawda?
dthor
Ponadto, jeśli tabele używają biginttylko do odczytu użytkownika, prawdopodobnie również będą potrzebneGRANT SELECT ON ALL SEQUENCES
dthor
6

Prostym i przyjemnym sposobem jest utworzenie superużytkownika z uprawnieniem tylko do odczytu.

  • Zaloguj się psqljako postgres lub inny administrator.
  • Utwórz nową rolę superużytkownika i ustaw ją tylko do odczytu:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • Zastąp <PASS>wybranym hasłem.
    • Możesz zastąpić backadmwybraną nazwą użytkownika. (Postawiłem backadmna Backup Administrator).
    • NIE zapomnij o pojedynczych cudzysłowach dotyczących hasła.

Możesz teraz użyć tej roli do tworzenia kopii zapasowych.

Rémi B.
źródło
6
Ewww. Superuser do tworzenia kopii zapasowych? W szczególności poprosił o tylko do odczytu. Ten użytkownik ma SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITElub ALTER USER backadm set default_transaction_read_only = off;nie ma nieograniczonego dostępu do bazy danych.
Evan Carroll
Ten użytkownik nadal będzie mógł usuwać tabele / schematy / bazy danych niezależnie od tego, czy transakcje są tylko do odczytu.
Igor Mukhin
4

Uwaga: blog wymieniony w odpowiedzi udzielonej przez @Gyre nie będzie działał przy tworzeniu użytkownika „tylko do odczytu” aplikacji (tj. Do tworzenia roli tylko do odczytu dla aplikacji sieci Web łączącej się z bazą danych) i może spowodować poważne luka w zabezpieczeniach, ponieważ jest łatwa do obejścia, jak wyjaśniono w odpowiedzi na listę postgresql . Dla odniesienia, przez klienta przesłaniającego ustawienia sesji:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Zapoznaj się z prezentacją „Zarządzanie prawami w postgresql” połączonej z wiki postgres, aby uzyskać bardziej szczegółową metodę, podobną do tej zamieszczonej w pytaniu.

zegar słoneczny
źródło
To nie jest tak naprawdę odpowiedź, to krytyka pozostałych odpowiedzi za to, że jestem niepewna, co skopiowałem jako komentarz. Odpowiedziałem teraz poprawnie na to pytanie.
Evan Carroll
3

Po ponownym przetestowaniu rozwiązania Evana Carolla natrafiłem na ten błąd:

BŁĄD: odmowa dostępu do relacji „tabela”

brakuje jeszcze jednego uprawnienia:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

Dodanie tego uprawnienia pozwoliło mi wykonać kopię zapasową z moim użytkownikiem tylko do odczytu.

Jean-François Godbout
źródło
2

Przeprowadziłem odpowiednie badania i wydaje się, że istnieje na to rozwiązanie. Natrafiłem na ten post na blogu, który doskonale wyjaśnia, co należy zrobić. Mam nadzieję, że to pomaga ludziom, którzy szukają tej samej odpowiedzi co ja. Oczywiście - przywracanie kopii zapasowych wykonanych w ten sposób to inna kwestia.

milosgajdos
źródło
Zamiast po prostu linkować do posta na blogu, powinieneś dodać kilka szczegółów do swojej odpowiedzi na wypadek, gdyby post blogu cierpiał na zgniliznę linków (patrz en.wikipedia.org/wiki/Link_rot )
Max Vernon
Podstawową ideą posta na blogu jest to ALTER USER set default_transaction_read_only = on;, że nie uniemożliwia to użytkownikowi jego zmiany.
niebieskawy
Ewww. Superuser do tworzenia kopii zapasowych? W szczególności poprosił o tylko do odczytu. Tym użytkownikiem jest jeden ZESTAW CHARAKTERYSTYKI SESJI JAKO TRANSAKCJĘ CZYTAJ NAPISZ lub ZMIEŃ UŻYTKOWNIKA backadm set default_transaction_read_only = off; z dala od nieograniczonego dostępu do bazy danych.
Evan Carroll