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

A extensão opera em três modos, controlados pelo parâmetro sql_firewall.firewall:
|
Modo |
Comportamento |
|
Learning |
Registra o par |
|
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 |
|
|
Desativa a extensão |
|
|
Ativa o modo de aprendizado |
|
|
Ativa o modo permissivo |
|
|
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 |
|
|
Limpa todas as entradas da lista de permissões |
|
|
Redefine os contadores |
Visualizações
|
Visualização |
Descrição |
|
|
Lista todos os padrões |
|
|
Exibe a contagem acumulada de avisos ( |
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.