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 / 195727
Accepted
as.beaulieu
as.beaulieu
Asked: 2018-01-19 13:23:28 +0800 CST2018-01-19 13:23:28 +0800 CST 2018-01-19 13:23:28 +0800 CST

postgres cria um usuário limitado que pode selecionar tabelas e colunas dessas tabelas

  • 772

Tenho um aplicativo que automatiza a criação de um banco de dados PostgreSQL, e também automatiza a criação de um usuário de banco de dados. Este usuário do banco de dados tem acesso limitado para fins de segurança, pois será entregue a um cliente para uso. A versão que estou usando é o Postgres 9.6

CREATE USER %USERSETUP% WITH
    LOGIN PASSWORD '%USERSETUPPASS%'
    NOSUPERUSER
    NOCREATEDB
    NOCREATEROLE
    INHERIT
    NOREPLICATION
    CONNECTION LIMIT -1;

ALTER DEFAULT PRIVILEGES IN SCHEMA %SCHEMA% GRANT INSERT, SELECT, UPDATE, DELETE, REFERENCES ON TABLES TO %USERSETUP%;

Agora, meu teste também entra no banco de dados criado e verifica se ele foi criado corretamente, usando Scripts de consulta para pegar os nomes das tabelas e, em seguida, pegar os nomes das colunas dentro de cada tabela ( como bônus, pegue também o tipo de dados da coluna )

Devido a essas permissões, o usuário não pode usar information_schema. Além disso, estou solicitando apenas scripts de consulta com SYSTEM CATALOG, por favor

O script que tenho para os nomes das tabelas funciona:

SELECT tablename FROM pg_catalog.pg_tables where schemaname = '{schema}'

E isso retorna os nomes das tabelas como uma lista:

negócio, localização, pessoa, cliente, etc...

No entanto, quando executo os dois scripts a seguir para obter o nome da coluna, recebo um retorno de 0, como se esse usuário estivesse tentando consultar information_schema. Acho que é por causa dos privilégios:

SELECT c.oid,
  n.nspname,
  c.relname
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ 'schemaaryzdhyqoi'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 2, 3;

também

SELECT c.oid,
  n.nspname,
  c.relname, t.*
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
CROSS JOIN LATERAL (
  SELECT a.attname,
    pg_catalog.format_type(a.atttypid, a.atttypmod),
    (
      SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
      FROM pg_catalog.pg_attrdef d
      WHERE d.adrelid = a.attrelid
        AND d.adnum = a.attnum
        AND a.atthasdef
    ),
    a.attnotnull, a.attnum,
    (
      SELECT c.collname
      FROM
        pg_catalog.pg_collation c,
        pg_catalog.pg_type t
      WHERE c.oid = a.attcollation
        AND t.oid = a.atttypid
        AND a.attcollation <> t.typcollation
    ) AS attcollation
  FROM pg_catalog.pg_attribute a
  WHERE a.attrelid = c.oid
    AND a.attnum > 0
    AND NOT a.attisdropped
) AS t
WHERE n.nspname ~ '^(schemaaryzdhyqoi)$'  -- YOUR SCHEMA HERE
AND pg_catalog.pg_table_is_visible(c.oid);

A pergunta é: Como adiciono a permissão para que o usuário limitado também possa acessar apenas o nome (e talvez o tipo de dados) das colunas dentro de cada tabela no esquema?

postgresql permissions
  • 1 1 respostas
  • 4656 Views

1 respostas

  • Voted
  1. Best Answer
    dezso
    2018-01-26T14:33:14+08:002018-01-26T14:33:14+08:00

    Você pode definir privilégios de nível de coluna para permitir de forma muito específica (e restrita) que usuários sem privilégios acessem dados. No seu caso, são dois catálogos: pg_attributee pg_type.

    Eu tenho um usuário chamado aliceque é restrito da mesma forma que seu usuário:

    alice@test=> > SELECT * FROM pg_class LIMIT 1;
    ERROR:  permission denied for relation pg_class
    

    Emita as seguintes GRANTdeclarações:

    GRANT SELECT (oid, typname) ON pg_type TO alice;
    GRANT SELECT (attrelid, attname, atttypid, attnum) ON TABLE pg_attribute TO alice;
    

    Após estes, alicepode fazer o seguinte, por exemplo:

    SELECT attname, typname 
      FROM pg_attribute JOIN pg_type t ON t.oid = atttypid
     WHERE attrelid = 't2'::regclass AND attnum > 0;
    
     attname │ typname 
    ─────────┼─────────
     key     │ jsonb
     value   │ jsonb
    

    Você pode estender trivialmente os privilégios para atender às suas necessidades.

    • 7

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