Como criar usuário somente leitura para backups no PostgreSQL?

15

É verdade que é IMPOSSÍVEL criar um usuário de backup somente leitura no PostgreSQL?

Fui avisado em um canal de IRC que você simplesmente não pode ter um usuário apenas de backup sem privilégios de propriedade. Acho isso muito estranho, então quero ter certeza de que não estou perdendo alguma coisa.

Abaixo está o que eu tentei, mas não me fornece os resultados que estou procurando. Quando faço pg_dumpuma determinada tabela, recebo 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;

Qualquer ajuda seria muito apreciada!

giro
fonte

Respostas:

9

Não, é fácil (agora mesmo).

  1. Conceda a permissão de conexão a um novo usuário

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. Conceda as permissões em todos os objetos de banco de dados atuais . Isso é específico do esquema e você precisará executar uma cópia para cada esquema que desejar que o usuário use,

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    A partir dos documentos , ALL TABLESinclui tudo o que você deseja.

    Há também uma opção para conceder privilégios em todos os objetos do mesmo tipo em um ou mais esquemas. Atualmente, esta funcionalidade é suportada apenas por tabelas, sequências e funções (mas observe que TODAS AS TABELAS são consideradas como exibições e tabelas estrangeiras.

  3. Em seguida, ALTER DEFAULT PRIVLEGESpara conceder privilégios futuros SELECT para objetos ainda não criados.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;
Evan Carroll
fonte
Notei que quando executado ALTER DEFAULT PRIVILEGES ... myReadonlyUser, 2 linhas adicionais são adicionados para o despejo: 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;. Parece que isso significa que o root não poderá fazer nada em novas tabelas. Isso é verdade?
dthor
Além disso, se as suas tabelas de usar biginto usuário somente leitura provavelmente também precisaGRANT SELECT ON ALL SEQUENCES
dthor
6

A maneira simples e agradável é criar um superusuário com permissão somente leitura.

  • Entre psqlcomo postgres ou outro superusuário.
  • Crie a nova função de superusuário e defina-a como somente leitura:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • Substitua <PASS>pela sua senha escolhida.
    • Você pode substituir backadmpelo nome de usuário escolhido. (Eu coloquei backadmpara Backup Administrator).
    • NÃO se esqueça das aspas simples da senha.

Agora você pode usar esta função para fazer backup.

Rémi B.
fonte
6
Ewww. Um superusuário para fazer backup? Ele pediu especificamente apenas para leitura. Esse usuário está a uma distância SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEou ALTER USER backadm set default_transaction_read_only = off;não de acesso irrestrito ao banco de dados.
Evan Carroll
Esse usuário ainda poderá descartar tabelas / esquemas / bancos de dados, independentemente de as transações serem somente leitura.
Igor Mukhin
4

Observe que o blog mencionado na resposta dada pelo @Gyre não funcionará para criar um usuário somente leitura de "aplicativo" (ou seja, para criar uma função somente leitura para que um aplicativo Web se conecte ao banco de dados) e possa abrir um problema sério. vulnerabilidade de segurança, uma vez que é facilmente contornável, conforme explicado nesta resposta da lista do postgresql . Para referência, pelo cliente substituindo as configurações da sessão:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Consulte a apresentação 'Gerenciando direitos no postgresql' vinculada no wiki do postgres para obter um método mais detalhado, semelhante ao postado na pergunta.

pôr do sol
fonte
Esta não é realmente uma resposta, é uma crítica às outras respostas por ser insegura, que copiei como comentário. Eu respondi a essa pergunta corretamente agora.
Evan Carroll
3

Após testar novamente com a solução de Evan Caroll, me deparei com este erro:

ERRO: permissão negada para a relação 'tabela'

falta uma outra permissão:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

A adição dessa permissão me permitiu fazer backup com meu usuário somente leitura.

Jean-François Godbout
fonte
2

Eu fiz uma pesquisa adequada e parece haver uma solução para isso. Encontrei este post do blog que explica perfeitamente o que precisa ser feito. Espero que isso ajude as pessoas que estão procurando a mesma resposta que eu. Obviamente - restaurar os backups feitos dessa maneira é uma questão diferente.

giro
fonte
Em vez de simplesmente ligando para o post, você deve adicionar alguns detalhes para a sua resposta no caso dos sofre postagem no blog de link-rot (veja en.wikipedia.org/wiki/Link_rot )
Max Vernon
A idéia básica do post do blog é ALTER USER set default_transaction_read_only = on;, o que não impede que o usuário o altere.
blueyed 29/03/2015
Ewww. Um superusuário para fazer backup? Ele pediu especificamente apenas para leitura. Esse usuário é um backadm SET SESSION CARACTERISTICS AS TRANSACTION READ WRITE ou ALTER USER set default_transaction_read_only = off; longe de ter acesso irrestrito ao banco de dados.
Evan Carroll