Concessões mínimas para acesso de tabela única somente leitura no PostgreSQL

10

A seguir, é apresentada uma lista de comandos que parecem funcionar para criar um novo usuário (login) e conceder acesso somente leitura a uma tabela especificada no PostgreSQL.

Vamos supor que esses comandos sejam executados no login com privilégios suficientes (ou seja, postgreslogin na instalação padrão).

CREATE ROLE user_name NOSUPERUSER NOCREATEDB 
NOCREATEROLE NOINHERIT LOGIN PASSWORD 'pwd' VALID UNTIL 'infinity';

Agora eu quero conceder selectna tabela tab_abcno banco de dados db_xyz, então aqui vai (o banco de dados db_xyzé selecionado como atual via PgAdmin ou algo parecido):

grant select on tab_abc to user_name;

A questão é: isso é suficiente ou deve haver mais doações (banco de dados connect, usagetalvez)?

Esses comandos parecem funcionar para mim, mas minha instalação padrão possui configurações de segurança padrão. Quais concessões adicionais devo adicionar se o administrador do servidor configurou uma segurança mais forte?

Parece que não preciso conceder connectnem usage- isso está implícito ao conceder select? Sempre é assim?

WildWezyr
fonte

Respostas:

12

A questão é: isso é suficiente ou deve haver mais doações (conexão com o banco de dados, talvez uso)?

A segurança pode ser reforçada a partir do padrão principalmente nesses pontos:

  • O pg_hba.confarquivo Ele filtra as conexões antes que qualquer privilégio do banco de dados seja considerado. O padrão é relativamente aberto para conexões locais, mas pode estar restrito a uma lista explícita de bancos de dados, nomes de usuários e origens da rede.

  • As permissões para público , o pseudo-papel que alguém tem. Um usuário pode conectar-se implicitamente apenas se o privilégio de conexão for concedido PUBLIC. Consulte Usuário criado pode acessar todos os bancos de dados no PostgreSQL sem nenhuma concessão . Um banco de dados pode ter todos os privilégios revogados do público. Consulte REVOKE no documento para obter a versão principal do PostgreSQL que você está usando.

  • A existência do publicesquema. Por padrão, ele é criado com o banco de dados por conveniência, mas não é obrigatório. Em vez de remover permissões públicas do publicesquema, pode fazer sentido que os DBAs simplesmente descartem o publicesquema quando novos usuários não tiverem permissão implícita.

No caso em que esses padrões foram removidos, para ler uma tabela, um novo usuário deve ser concedido:

GRANT CONNECT ON DATABASE dbname TO username;

No nível do banco de dados:

GRANT USAGE ON SCHEMA schemaname TO username;
GRANT SELECT ON schemaname.tablename TO username;
Daniel Vérité
fonte