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 / 97606
Accepted
Alexandros
Alexandros
Asked: 2015-04-11 23:52:17 +0800 CST2015-04-11 23:52:17 +0800 CST 2015-04-11 23:52:17 +0800 CST

Hacking do histórico de consultas do Postgresql

  • 772

Acredito que o PostgreSQL pode registrar consultas lentas ou malsucedidas. Provavelmente também posso definir o PostgreSQL para registrar todas as consultas executadas. Ao contrário, estou interessado em saber se existe uma maneira de um invasor mal-intencionado obter acesso a todas as consultas executadas com sucesso no servidor PostgreSQL, se eu tiver desativado o registro o máximo possível. Isso é possível? Ou, uma vez que uma consulta foi executada com sucesso (pode ser uma consulta SELECT ou UPDATE), posso ter 100% de certeza de que o servidor de banco de dados não possui memória de consultas executadas com sucesso e, portanto, ninguém mais pode obter acesso a essas informações. Estou usando o PostgreSQL 9.3.

postgresql postgresql-9.3
  • 1 1 respostas
  • 12715 Views

1 respostas

  • Voted
  1. Best Answer
    Craig Ringer
    2015-04-12T00:30:01+08:002015-04-12T00:30:01+08:00

    [posso] ter 100% de certeza de que o servidor de banco de dados não possui memória de consultas executadas com sucesso e, portanto, ninguém mais pode ter acesso a essas informações?

    Não, você nunca pode ter 100% de certeza disso.

    O PostgreSQL mantém um cache de plano interno. Atualmente, esse cache é usado apenas para instruções preparadas; declarações one-shot não vão para o cache. No entanto, se você usar uma instrução preparada, o plano será armazenado em cache e, quando não for mais necessário, o plano em cache será invalidado, mas não necessariamente excluído, até que o back-end do PostgreSQL que o armazenou em cache seja encerrado.

    O PostgreSQL armazena a string de consulta em uma variável de depuração interna. Quando uma nova consulta substitui a antiga, a variável de depuração é substituída. Se a nova consulta for mais curta que a antiga, parte da consulta antiga não será substituída.

    Uma consulta pode estar executando um back-end que possui páginas de memória gravadas em disco no espaço de troca devido à pressão da memória. Essa memória pode conter a string de consulta e/ou parâmetros. Esse espaço de troca não é necessariamente substituído mesmo após a conclusão da consulta e o encerramento do back-end. Se o servidor for desligado abruptamente, o disco rígido poderá ser analisado forense e descobrir o texto da consulta.

    Quando o PostgreSQL libera os objetos do planejador/executor de consultas internas, ele não os zera. Apenas marca a memória como livre para reutilização. Essa memória permanece mapeada até que o back-end do PostgreSQL saia e pode conter texto de consulta, valores de parâmetros, etc.

    Quando um back-end do PostgreSQL sai, o kernel geralmente não zera sua memória, apenas a marca como liberada. Um invasor que pode explorar o kernel para obter acesso de leitura de memória bruta pode ver algumas consultas anteriores (e, é claro, todas as atuais).

    Então se:

    • Você criptografou o espaço de troca com uma senha fornecida interativamente na inicialização;

    • Você aceita que qualquer pessoa com acesso físico à máquina provavelmente poderá explorá-la para recuperar o histórico de consultas recentes;

    • Você entende que qualquer pessoa com acesso root, ou acesso como postgresusuário do sistema, pode rastrear a execução do PostgreSQL e capturar dados de consulta (mas não retroativamente); e

    • Você só se preocupa com a capacidade de recuperação do texto da consulta depois que o back-end individual do PostgreSQL que executou essa consulta foi encerrado

    então desligar o registro provavelmente é bom o suficiente. Você também precisa evitar o uso de extensões como pg_stat_planse pg_stat_statementsque podem capturar o texto da consulta e gravá-lo no banco de dados.

    Observe que, se PL/Python, PL/Perl, etc. estiverem instalados, ou alguns módulos contrib estiverem presentes, pode ser bastante fácil escalar o acesso do postgresusuário do banco de dados (ou outro superusuário) para o postgresusuário do shell. A partir daí, você pode reconfigurar o banco de dados para habilitar o log, instalar extensões, injetar código C, etc.

    Um invasor que obtém acesso mesmo como proprietário da tabela pode instalar um FOR EACH STATEMENTgatilho nas tabelas de interesse que registra as consultas que afetam essas tabelas. Isso não funcionará para SELECT, mas funcionará para todo o resto. Eles nem precisam ser superusuários do banco de dados para isso.

    Geralmente, suas consultas não devem ser sensíveis à segurança tanto quanto seus dados de parâmetro de consulta . Você pode reduzir bastante as chances de ser capturado ou registrado usando parâmetros de ligação apropriados, por exemplo, libpq's PQexecParams, classe de PgJDBC PreparedStatement, etc.

    Mais importante, porém... se você deseja manter a segurança do banco de dados, não perca as credenciais de acesso privilegiado. Não use uma conta de superusuário, exceto do servidor de banco de dados e configurada pg_hba.confpara que o superusuário não possa fazer login remotamente. Não tenha aplicativos conectados ao banco de dados como a mesma conta que possui as tabelas que eles usam, use uma conta diferente e GRANTapenas os direitos que eles exigem. etc.


    O IMO PostgreSQL precisa de uma extensão no protocolo que permita marcar os parâmetros de consulta como "sensíveis". Esses parâmetros de consulta nunca devem ser emitidos em arquivos de log, mostrados pg_stat_activityou registrados de outra forma. No entanto, esse recurso não existe atualmente e não tenho conhecimento de ninguém trabalhando nele

    • 3

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