AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 73010
Accepted
Andomar
Andomar
Asked: 2014-08-03 08:59:47 +0800 CST2014-08-03 08:59:47 +0800 CST 2014-08-03 08:59:47 +0800 CST

Por que um novo usuário pode selecionar em qualquer tabela?

  • 772

Quando crio um usuário no Postgres,

create user test with password 'test';

O usuário acaba conseguindo se conectar a todos os bancos de dados da instância. O usuário também pode selecionar em qualquer tabela:

# psql -h localhost testdb test
Password for user test: *****
psql (8.4.20, server 9.1.13)
WARNING: psql version 8.4, server version 9.1.
         Some psql features might not work.
Type "help" for help.

testdb=> select * from testtable;
 id
------------
      1
(1 row)

A \llistagem do banco de dados mostra que testdbtem arquivos Access privileges. Então, por que um usuário recém-criado pode se conectar a esse banco de dados?

O usuário "teste" recém-criado também pode selecionar dados de tabelas. Por que ele pode fazer isso sem uma série grantde selectprivilégios?

Eu gostaria de criar um usuário que só pode se conectar a um banco de dados e apenas ler a partir de determinadas visualizações. Como posso impedir que um usuário leia diretamente das tabelas?

postgresql postgresql-9.1
  • 2 2 respostas
  • 5325 Views

2 respostas

  • Voted
  1. Erwin Brandstetter
    2014-08-05T07:48:25+08:002014-08-05T07:48:25+08:00

    Também abordando a questão nos comentários.

    Funçãopublic

    Por documentação:

    A palavra-chave PUBLICindica que os privilégios devem ser concedidos a todas as funções, incluindo aquelas que podem ser criadas posteriormente. PUBLIC pode ser pensado como um grupo definido implicitamente que sempre inclui todas as funções .

    Ênfase em negrito minha. A associação publicnão pode ser revogada (ou concedida). Você só pode revogar privilégios de public. No seu caso, para bloquear todas as funções sem privilégios explícitos, como @Robert já forneceu :

    REVOKE ALL ON DATABASE testdb FROM PUBLIC;
    

    Funçãopostgres

    A função de banco de dados postgresé a superuserpor padrão. Você pode tirar isso postgres- mas isso seria imprudente: todos (incluindo alguns programas clientes) esperam postgresser um superusuário. Você também pode criar mais superusuários (cuidado com isso!). Os superusuários não precisam de privilégios. O manual mais uma vez :

    Deve-se observar que os superusuários do banco de dados podem acessar todos os objetos independentemente das configurações de privilégio do objeto. Isso é comparável aos direitos de root em um sistema Unix. Assim como o root, não é aconselhável operar como superusuário, exceto quando for absolutamente necessário.

    Quanto a sua pergunta:

    É verdade que se \lou \dn+exibe privilégios de acesso vazios, é o mesmo quepostgres=UC/postgres, =UC/postgres

    Não exatamente.

    • Os privilégios são concedidos pelo proprietário ou um superusuário (ou uma função que recebeu o privilégio de fazê-lo). postgres=UC/postgressignificaria postgresconcedido, o que não é preciso para privilégios vazios, mas o efeito é o mesmo em uma instalação padrão.

    • No entanto, não publicobtém privilégios para novos esquemasCONNECT e apenas TEMP(pode criar tabelas temporárias) privilégios para bancos de dados por padrão, não o CREATEprivilégio (não pode criar esquemas). Isso seria algo como =UT/??de acordo com a lista de possíveis privilégios - o manual mais uma vez :

            r -- SELECT ("read")
            w -- UPDATE ("write")
            a -- INSERT ("append")
            d -- DELETE
            D -- TRUNCATE
            x -- REFERENCES
            t -- TRIGGER
            X -- EXECUTE
            U -- USAGE
            C -- CREATE
            c -- CONNECT
            T -- TEMPORARY
      arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects)
            * -- grant option for preceding privilege
    

    Você pode alterar os privilégios padrão. Escrevi mais sobre isso na resposta relacionada mencionada nos comentários:

    • Conceder privilégios para um banco de dados específico no PostgreSQL

    Mas esses privilégios padrão só se aplicam a objetos criados depois que os padrões foram alterados. Então, o que significa uma entrada ACL vazia? O manual no catálogo do sistemapg_default_acl :

    Observe que quando uma entrada ACL em outro catálogo é nula, ela representa os privilégios padrão pré-configurados para seu objeto, não o que quer que esteja em pg_default_acl no momento.

    Ênfase em negrito minha.

    • 3
  2. Best Answer
    Robert Gannon
    2014-08-03T09:57:21+08:002014-08-03T09:57:21+08:00

    Para resolver a questão de por que o teste pode SELECTpartir de tabelas sem um GRANT, é porque você não executou explicitamente REVOKEa capacidade de se conectar ao(s) seu(s) banco(s) de dados a partir PUBLICde e, em seguida, executou explicitamente GRANTpara o seu testusuário:

    REVOKE connect ON DATABASE testdb FROM PUBLIC;
    GRANT connect ON DATABASE testdb TO test;
    

    Uma vez feito isso, você faria REVOKE SELECTpara o usuário dentro desse banco de dados suas tabelas e outros itens que deseja impedir que o usuário acesse e, em seguida, explicitamente GRANT SELECTpara as visualizações.

    Observe que o usuário aqui também pode ser uma função, à qual vários usuários podem ser adicionados.

    • 2

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve