Extensões Confiáveis vs. Não Confiáveis
Extensões marcadas como confiáveis podem ser instaladas por não superusuários com as permissões corretas. Extensões não confiáveis executam código C com privilégios de superusuário durante a instalação e exigem revisão de segurança antes de qualquer CREATE EXTENSION em produção.
Receita
-- Verifica o flag de confiança (PostgreSQL 13+)
SELECT name,
default_version,
CASE WHEN trusted THEN 'trusted' ELSE 'untrusted' END AS trust_level
FROM pg_available_extensions
WHERE name IN ('vector', 'postgis', 'plpython3u', 'pgcrypto')
ORDER BY name;
-- Concede permissão de instalação para uma role (apenas extensões confiáveis)
GRANT CREATE ON DATABASE appdb TO deploy_role;
GRANT USAGE ON SCHEMA extensions TO deploy_role;
-- No PostgreSQL 15+: também concede permissão no objeto da extensão
GRANT vector TO deploy_role; -- nome da extensão como objetoQuando usar isso: Ao integrar uma nova extensão, auditar quem pode instalar o quê, ou ao proteger um cluster multi-tenant gerenciado.
Exemplo de Trabalho
-- Pacote de consulta para revisão de segurança
-- 1) Todas as extensões instaladas
SELECT e.extname,
e.extversion,
a.trusted,
pg_get_userbyid(e.extowner) AS owner,
n.nspname AS schema
FROM pg_extension e
JOIN pg_available_extensions a ON a.name = e.extname
JOIN pg_namespace n ON n.oid = e.extnamespace
ORDER BY e.extname;
-- 2) Roles que podem criar extensões (superuser ou createrole)
SELECT rolname,
rolsuper,
rolcreaterole,
rolcreatedb
FROM pg_roles
WHERE rolsuper OR rolcreatedb
ORDER BY rolname;
-- 3) Tentativa de instalação de extensão não confiável (deve falhar para a role de app)
SET ROLE app_role;
CREATE EXTENSION plpython3u; -- espera-se ERRO: permissão negada
RESET ROLE;O que isso demonstra:
- A coluna
trustedempg_available_extensionscontrola a política de instalação - O inventário une proprietário e schema para auditoria
- Extensões não confiáveis permanecem exclusivas para superusuários em ambientes protegidos
- Teste de roles valida o menor privilégio antes do go-live
Mergulho Profundo
Extensões Confiáveis
Extensões confiáveis são revisadas pela comunidade PostgreSQL (ou fornecedor) como seguras para instalação por não superusuários. Elas ainda adicionam capacidades (novos tipos, funções), mas são mais restritas em comparação com módulos C arbitrários.
Extensões confiáveis comuns no PostgreSQL 18:
| Extensão | Superfície de Risco | Aprovação Típica |
|---|---|---|
vector | Novo tipo + índices | Padrão para apps RAG |
pgcrypto | Funções criptográficas | Aprovado com isolamento de schema |
uuid-ossp | Geradores de UUID | Legado; prefira gen_random_uuid() |
citext | Texto case-insensitive | Baixo risco |
Extensões Não Confiáveis
Extensões não confiáveis podem expor caminhos de execução de sistema de arquivos, rede ou código arbitrário. Trate cada uma como uma decisão de cadeia de suprimentos.
| Extensão | Por que não confiável | Foco da Revisão |
|---|---|---|
plpython3u | Python não isolado | Injeção de código, pacotes pip |
plperlu | Perl irrestrito | Acesso ao shell |
file_fdw | Leitura de arquivo do lado do servidor | Travessia de diretório, segredos em disco |
dblink | Execução remota de SQL | Exposição de credenciais, movimento lateral |
Padrões de Proteção
-- Revoga CREATE público no banco de dados
REVOKE CREATE ON DATABASE appdb FROM PUBLIC;
-- Lista de permissões: apenas extensões específicas recebem GRANT
-- (executar como superusuário após revisão de segurança)
GRANT postgis TO dba_deploy_role;
GRANT vector TO dba_deploy_role;
-- NÃO conceda plpython3uEm Postgres gerenciado na nuvem, a lista de permissões do provedor é o primeiro portão. Seu ADR é o segundo.
Armadilhas
- Assumir que a nuvem = seguro - Hosts gerenciados oferecem
plpython3uem alguns níveis. Correção: Desabilite via grupo de parâmetros ou nunca conceda direitos de instalação. - Flag de confiável muda entre versões - Uma extensão pode se tornar confiável em uma versão mais nova do PG. Correção: Releia
pg_available_extensionsapós atualizações principais. - Extensão no schema público - Mesmo extensões confiáveis aumentam a superfície de ataque se as funções puderem ser chamadas por
PUBLIC. Correção:REVOKE ALL ON FUNCTION ... FROM PUBLIC;e conceda explicitamente para roles de app. - Pipelines de deploy SUPERUSER - CI usa credenciais de superusuário "apenas para extensões". Correção:
deploy_rolededicado com privilégios mínimos; superusuário apenas para emergências. - Instalações de Shadow IT - Desenvolvedor executa
CREATE EXTENSIONem um clone de staging que espelha privilégios de produção. Correção: Job periódico de auditoriapg_extensioncom alertas. - Dependências CASCADE - Extensão não confiável puxada como dependência. Correção: Revise a cadeia
pg_dependantes de aprovar a extensão pai.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Código da aplicação substitui a extensão | Risco de PL/linguagem não confiável muito alto | Você precisa de performance nativa de índice em SQL |
| Schema separado + EXECUTE restrito | Extensão aprovada, mas funções precisam ser controladas | Toda função precisa de wrappers customizados |
| Política de nenhuma extensão | Conformidade máxima de lockdown | Você não pode usar recursos de pgvector ou PostGIS |
| ETL em contêiner fora do Postgres | file_fdw ou Python no DB tentador | Requisitos transacionais fortes com dados |
FAQs
Quem decide confiável vs. não confiável?
Autores de extensão definem o flag no arquivo de controle; revisores principais do PostgreSQL validam extensões incluídas. Extensões de terceiros podem ser não confiáveis por padrão.Posso marcar minha extensão como confiável?
Somente se ela atender aos critérios da comunidade e for enviada com o PostgreSQL ou passar pela revisão. Extensões internas permanecem não confiáveis.Confiável significa sem vulnerabilidades?
Não. Significa que o privilégio de instalação pode ser delegado. Você ainda aplica patches em versões e monitora CVEs.E sobre o PostGIS?
O nível de confiança varia pela embalagem. Trate geospacial como crítico para produção e fixe versões independentemente do flag de confiança.Como detectar novas extensões?
Compare snapshots de `pg_extension` diariamente ou use gatilhos de evento em `ddl_command_end` para `CREATE EXTENSION`.Extensões em slots de replicação são arriscadas?
A replicação lógica pode reproduzir DDL incluindo `CREATE EXTENSION`. Restrinja DDL em roles publicadoras.pg_tle (Trusted Language Extensions)?
Mecanismo liderado pela AWS para extensões controladas dentro do banco de dados. Separado do flag `trusted` principal; conheça sua plataforma.Usuários de app devem ver schemas de extensão?
Conceda `USAGE` apenas nas funções necessárias. Oculte schemas de admin do `search_path`.Quais logs habilitar?
`log_statement = 'ddl'` ou `pgaudit` para DDL de extensão em ambientes regulamentados.Política de dev vs. prod?
Mesma lista de permissões. Extensões exclusivas de dev migram para backups de produção e scripts de migração.Relacionados
- Noções Básicas de Extensões - instalação e versionamento
- Política de Lista de Permissões de Extensões - modelo de ADR de governança
- Noções Básicas de Segurança - modelo de ameaças
- Noções Básicas de Roles - padrões de menor privilégio
- Melhores Práticas de Extensões - checklist operacional
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x, e Patroni 3.x.