Todos os produtos
Search
Central de documentação

ApsaraDB RDS:The sql_firewall extension

Última atualização: Jun 26, 2026
Importante

O ApsaraDB RDS for PostgreSQL não oferece mais suporte à extensão sql_firewall. As instalações existentes continuam funcionando, mas a extensão pode causar falhas no sistema. Interrompa o uso dessa extensão o mais rápido possível para evitar riscos potenciais. Para remover a extensão, execute DROP EXTENSION sql_firewall; e remova sql_firewall do parâmetro shared_preload_libraries. Para obter instruções sobre como modificar parâmetros, consulte Modificar os parâmetros de uma instância do ApsaraDB RDS for PostgreSQL.

A extensão sql_firewall atua como um firewall no nível do banco de dados para proteger contra ataques de injeção de SQL. Ela cria uma lista de permissões com padrões de SQL permitidos durante uma fase de aprendizado e, em seguida, emite um alerta ou bloqueia qualquer consulta fora dessa lista.

Pré-requisitos

Antes de começar, verifique se:

  • Sua instância RDS executa uma das seguintes versões do PostgreSQL:

    • PostgreSQL 12

    • PostgreSQL 11

    • PostgreSQL 10

Como funciona

Flowchart

A extensão opera em três modos, controlados pelo parâmetro sql_firewall.firewall:

Modo

Comportamento

Learning

Registra o par (userid, queryid) de cada consulta executada e o adiciona à lista de permissões

Permissive

Verifica cada consulta na lista de permissões. Consultas ausentes são executadas, mas geram um WARNING

Enforcing

Valida cada consulta na lista de permissões. Consultas fora da lista são bloqueadas com um ERROR

Configurar o sql_firewall

Etapa 1: Instalar a extensão

CREATE EXTENSION sql_firewall;

Etapa 2: Ativar o modo de aprendizado

No Console do ApsaraDB for RDS, defina sql_firewall.firewall como learning e reinicie a instância.

Execute sua carga de trabalho típica durante esta fase. A extensão registra todas as consultas executadas na lista de permissões. Quanto mais tempo você permanecer no modo de aprendizado, mais completa será a lista.

Valores válidos para sql_firewall.firewall:

Valor

Efeito

disable

Desativa a extensão

learning

Ativa o modo de aprendizado

permissive

Ativa o modo permissivo

enforcing

Ativa o modo de imposição

Etapa 3: Alternar para o modo permissivo

Defina sql_firewall.firewall como permissive e reinicie a instância.

No modo permissivo, consultas fora da lista de permissões ainda são executadas, mas geram um alerta WARNING: Prohibited SQL statement. Analise esses alertas para identificar consultas legítimas perdidas durante a fase de aprendizado. Se encontrar alguma, retorne ao modo de aprendizado, execute essas consultas e volte ao modo permissivo.

Verifique o conteúdo atual da lista de permissões e as estatísticas de alertas:

-- View all whitelisted query patterns and their execution counts
SELECT * FROM sql_firewall.sql_firewall_statements;

Exemplo de saída:

 userid |  queryid   |              query              | calls
--------+------------+---------------------------------+-------
     10 | 3294787656 | select * from k1 where uid = ? ; |     4
(1 row)
-- View alert and error counts
SELECT * FROM sql_firewall.sql_firewall_stat;

Exemplo de saída:

 sql_warning | sql_error
-------------+-----------
           2 |         1
(1 row)

A coluna sql_warning exibe o número de alertas gerados no modo permissivo. Já a coluna sql_error mostra a quantidade de consultas bloqueadas no modo de imposição.

Etapa 4: Alternar para o modo de imposição

Quando a lista de permissões cobrir sua carga de trabalho esperada, defina sql_firewall.firewall como enforcing e reinicie a instância.

No modo de imposição, o sistema bloqueia imediatamente qualquer consulta fora da lista de permissões:

-- A whitelisted query executes normally
SELECT * FROM k1 WHERE uid = 3;
 uid |   uname
-----+-----------
   3 | Goo Ha-ra
(1 row)
-- A SQL injection attempt is blocked
SELECT * FROM k1 WHERE uid = 3 OR 1=1;
ERROR:  Prohibited SQL statement

Comportamento do modo permissivo (para comparação):

-- The same injection in permissive mode: executes but raises a warning
SELECT * FROM k1 WHERE uid = 3 OR 1=1;
WARNING:  Prohibited SQL statement
 uid |     uname
-----+----------------
   1 | Park Gyu-ri
   2 | Nicole Jung
   3 | Goo Ha-ra
   4 | Han Seung-yeon
   5 | Kang Ji-young
(5 rows)

Referência

Funções de gerenciamento

Ambas as funções exigem a função rds_superuser e estão disponíveis apenas quando a extensão está no modo disable, learning ou permissive. Defina sql_firewall.firewall com um desses valores antes de chamá-las.

Função

Descrição

sql_firewall_reset()

Limpa todas as entradas da lista de permissões

sql_firewall_stat_reset()

Redefine os contadores sql_warning e sql_error

Visualizações

Visualização

Descrição

sql_firewall.sql_firewall_statements

Lista todos os padrões (userid, queryid, query) permitidos e o número de execuções de cada um

sql_firewall.sql_firewall_stat

Exibe a contagem acumulada de avisos (sql_warning) do modo permissivo e erros (sql_error) do modo de imposição

Remover a extensão

DROP EXTENSION sql_firewall;

Após remover a extensão, exclua sql_firewall do parâmetro shared_preload_libraries no console do ApsaraDB for RDS e reinicie a instância. Para obter instruções, consulte Modificar os parâmetros de uma instância do ApsaraDB RDS for PostgreSQL.