Força bruta no início de sessão do GLPI: como bloquear ataques com o Security Guard

O Security Guard, gratuito para clientes NexTool, bloqueia a força bruta no GLPI: início de sessão web, API, CalDAV e recuperação da palavra-passe.

Qualquer ecrã de início de sessão exposto na internet recebe tentativas de adivinhar a palavra-passe, e o do GLPI não é exceção. Por omissão, o GLPI não limita quantas vezes alguém pode errar a palavra-passe. O Security Guard, módulo do NexTool gratuito para clientes NexTool, conta as falhas no início de sessão web, na API, no CalDAV e na recuperação da palavra-passe, bloqueia temporariamente quem passa do limite e mostra tudo num painel, sem guardar o nome de utilizador em claro.

O problema: força bruta no início de sessão do GLPI

A força bruta é o ataque mais simples que existe: um robô testa combinações de utilizador e palavra-passe até acertar. Variantes conhecidas são o credential stuffing (palavras-passe divulgadas noutros serviços testadas no seu GLPI) e o password spraying (uma palavra-passe comum, como Mudar@123, testada em muitas contas ao mesmo tempo). O GLPI guarda os pedidos, o inventário, os contratos e os dados pessoais de quem abre pedidos. Uma conta de técnico comprometida abre tudo isso.

No GLPI de base, o início de sessão web aceita tentativas indefinidamente. É possível mitigar na periferia (WAF, fail2ban a ler o registo do servidor web), mas essas soluções não conhecem o GLPI: não sabem se a tentativa resultou, não distinguem utilizador de IP e costumam bloquear por engano o proxy de toda a empresa. Faltava uma proteção dentro do próprio GLPI, que perceba o resultado real do início de sessão.

Como funciona o Security Guard

Com a proteção ligada, o módulo examina cada tentativa de autenticação nos canais abaixo, regista o resultado, como Sucesso, Falha, Negado (bloqueio), Ignorado ou MFA pendente, e verifica as regras que você definiu. Quando uma regra é ultrapassada, as tentativas seguintes dessa chave recebem HTTP 429 no formato que o cliente entende: página de bloqueio temporário no navegador, JSON nas API e texto no CalDAV, até o prazo terminar ou um administrador levantar o bloqueio. Enquanto o bloqueio está ativo, as tentativas recusadas não se tornam eventos: apenas somam no contador do bloqueio.

  • Início de sessão web: o formulário em /front/login.php.
  • API REST (v1): initSession com utilizador e palavra-passe, Basic Auth ou user_token. Com user_token não há utilizador, por isso só contam as regras por IP. No GLPI 11, o caminho /api.php/v1 também é coberto.
  • API v2 do GLPI 11: o pedido de token em /api.php/token com utilizador e palavra-passe.
  • CalDAV (Basic Auth): como o cliente de calendário se autentica a cada sincronização, só as palavras-passe erradas e os acessos negados se tornam eventos; o acesso correto não grava nada.
  • Recuperação da palavra-passe (lostpassword.php): cada pedido de nova palavra-passe conta como tentativa, por IP ou pelo e-mail indicado. O GLPI responde da mesma forma a um e-mail certo ou errado, por isso a regra limita o volume de pedidos e trava o envio em massa e a varredura de e-mails.
  • Código MFA/TOTP do GLPI 11: as tentativas aparecem nos eventos, com sucesso e falha, mas o módulo não limita o código, porque o próprio GLPI 11 já bloqueia depois de várias tentativas erradas.

Na consola, o módulo oferece:

  • Regras por âmbito: cada regra define a janela (em minutos), o limite de falhas e a duração do bloqueio. O âmbito pode ser Usuário, IP ou Usuário + IP, com prioridade entre regras e filtro opcional por intervalo de IP (CIDR) ou por país. No campo Canais, cada regra escolhe onde conta: início de sessão web, API REST, API v2, CalDAV ou recuperação da palavra-passe. Uma regra nova nasce com todos marcados. A instalação traz duas regras prontas, inativas: Usuário + IP (5 falhas em 15 minutos, bloqueio de 15 minutos) e IP (30 falhas em 15 minutos, bloqueio de 30 minutos).
  • Exceções: utilizador, grupo, perfil, rede (CIDR) ou país que nunca são bloqueados, mesmo com uma regra acionada. Cada exceção pode ter um período de vigência com data de início e de fim.
  • GeoIP: com uma base MaxMind GeoLite2 Country enviada a partir do próprio ecrã, o módulo resolve o país de cada IP. Isto alimenta o painel e permite regras e exceções por país.
  • Painel: totais das últimas 24 horas por resultado, uma linha com as últimas 24 horas por canal, bloqueios, regras e exceções ativos, e o top 10 de IP, utilizadores (mascarados) e países com mais falhas e tentativas recusadas nos últimos 7 dias.
  • Bloqueios: lista dos bloqueios ativos com botão para os levantar, criação de bloqueio manual e o histórico completo.
  • Eventos: as tentativas avaliadas e classificadas, na pesquisa nativa do GLPI, com a coluna Canal e o utilizador sempre mascarado. As tentativas recusadas durante um bloqueio ativo aparecem apenas no contador do bloqueio.
  • Teste: simuladores de resolução de IP e de tentativa de início de sessão que não gravam nada; o simulador de tentativa permite escolher o canal. Você fica a saber o que aconteceria antes de ativar uma regra.
Painel do Security Guard no GLPI com os totais de tentativas de início de sessão das últimas 24 horas por resultado e o top 10 de IP e utilizadores mascarados por falhas
Painel: sucesso, falha e bloqueios das últimas 24h, e os maiores infratores dos últimos 7 dias (IP de documentação e utilizadores mascarados)

Um pormenor que faz diferença: o módulo classifica o resultado real da tentativa, olhando para a resposta que o GLPI devolveu, e conta a tentativa assim que ela começa. Um robô que dispara dezenas de pedidos em paralelo não consegue ultrapassar o limite através de uma corrida entre eles.

Janela de registo de regra do Security Guard com âmbito Utilizador mais IP, janela de 15 minutos, limite de 5 falhas e bloqueio de 15 minutos
Registo de regra: âmbito, janela, limite de falhas, duração do bloqueio, filtros de IP e país e prioridade

Ativação segura, passo a passo

O Security Guard vem desligado: a proteção vem com o interruptor desligado e as duas regras criadas na instalação vêm inativas. Instalar o módulo não bloqueia ninguém. Mas, com a proteção desligada, o módulo não regista nada: não é possível “observar antes de bloquear” com o interruptor desligado. O caminho seguro é ligar a proteção com as regras ainda inativas e usar o separador Teste. A ordem abaixo importa, porque uma configuração errada do proxy pode bloquear a empresa inteira.

  1. Instale e ative o módulo em NexTool > Módulos > Security Guard. A consola fica em NexTool > Security Guard.
  2. Configure os proxies de confiança ANTES de ligar a proteção. No separador Configurações, indique no campo Proxies confiáveis (CIDR) a rede do proxy inverso que está à frente do GLPI (Nginx, NPM, HAProxy, balanceador de carga). Sem isso, o módulo ignora de propósito o header X-Forwarded-For (pode ser falsificado) e vê o IP do proxy, não o do utilizador.
  3. Se o GLPI estiver atrás da Cloudflare, clique em Adicionar faixas da Cloudflare. O botão acrescenta ao campo as faixas oficiais da CDN, sem apagar o que já lá está e sem gravar sozinho. Mantenha também a rede do seu proxy local e grave. Sem as faixas da Cloudflare, o IP resolvido seria a periferia da CDN, partilhada por milhares de pessoas.
  4. Confirme o header de IP. O valor por omissão é X-Forwarded-For; altere-o apenas se o seu proxy usar X-Real-IP ou Forwarded.
  5. Verifique o cartão “IP desta requisição”. Mostra o REMOTE_ADDR, o header recebido e o IP que o módulo resolveria neste momento. O IP resolvido tem de ser o do seu computador, não o do proxy. Se aparecer o alerta “Proxy provável não configurado”, pare e volte ao passo 2.
  6. Ligue a Proteção contra força bruta com as regras ainda inativas. Sem regras ativas nem bloqueios manuais, ninguém é bloqueado, e o Painel e o separador Eventos passam a mostrar as tentativas classificadas. Use o separador Teste para confirmar que uma tentativa normal sua não seria bloqueada.
  7. Só então ative uma regra com âmbito Usuário + IP no separador Regras e confirme, no campo Canais, onde ela vai contar. A regra pronta vem com 5 falhas em 15 minutos e bloqueio de 15 minutos.
Separador Configurações do Security Guard com o campo Proxies confiáveis (CIDR) preenchido com a rede do proxy local e as faixas oficiais da Cloudflare
Proxies confiáveis (CIDR): rede do proxy local mais as faixas da Cloudflare acrescentadas pelo botão (é preciso gravar)
Cartão IP desta requisição do Security Guard a mostrar um REMOTE_ADDR privado e o alerta de proxy provável não configurado
O cartão “IP desta requisição” avisa quando existe um proxy à frente que ainda não é de confiança
Separador Teste do Security Guard com o simulador de tentativa de início de sessão a mostrar que regras se aplicariam a um utilizador e IP de teste
Simulador de tentativa: mostra exceção, bloqueio ativo e cada regra que se aplicaria, sem gravar nada

Boas práticas

  • Prefira o âmbito Usuário + IP. Apanha o robô que insiste numa conta a partir de um endereço, sem efeitos colaterais para os outros utilizadores.
  • Cuidado com o âmbito Usuário isolado. Permite que qualquer pessoa bloqueie a conta de um colega só por errar a palavra-passe dele de propósito. Se o usar, use-o com limite alto e duração curta.
  • Cuidado com o âmbito IP isolado atrás de NAT. Um escritório inteiro costuma sair pelo mesmo IP público. Uma regra só por IP, com limite baixo, castiga toda a gente pelo erro de um. Se a usar, deixe o limite bem acima do da regra Usuário + IP (a regra pronta vem com 30 falhas em 15 minutos).
  • Registe exceções com critério. A rede da sede, um perfil de integração ou uma conta de monitorização podem entrar como exceção, de preferência com vigência.
  • Cuidado com integrações pela API. Um sistema integrado pela API que erra a palavra-passe em ciclo (uma palavra-passe antiga, por exemplo) bloqueia o próprio IP. Registe a rede dele como exceção ou desmarque esse canal na regra.
  • Na recuperação da palavra-passe, use um limite mais alto do que o do início de sessão e prefira o âmbito IP ou Usuário + IP.
  • Mantenha a base GeoIP atualizada. A atualização é manual; o cartão avisa quando a base ultrapassa os 60 dias.
Separador Exceções do Security Guard com exceções do tipo rede com intervalos de documentação, vigência e motivo
Exceções por rede, utilizador, grupo, perfil ou país, com vigência opcional
Separador Bloqueios do Security Guard com a lista de bloqueios ativos, botão de bloqueio manual e histórico com âmbito, utilizador mascarado e IP
Bloqueios: desbloqueio manual, bloqueio manual e histórico completo

Privacidade

Registar tentativas de início de sessão envolve dados pessoais, por isso convém saber exatamente o que o módulo guarda:

  • O nome de utilizador nunca é gravado em claro. A correlação usa um HMAC-SHA256 com chave própria da instalação, e o ecrã mostra apenas uma máscara (primeira e última letra). Nos inícios de sessão com sucesso, o evento guarda também o ID do utilizador no GLPI.
  • O e-mail indicado nos pedidos de nova palavra-passe segue a mesma regra: só é guardado como HMAC, e o ecrã mostra apenas uma máscara.
  • O IP e o país ficam gravados em claro, porque são o próprio objeto da proteção.
  • Nos eventos, o prazo de conservação é definido por você: 90 dias por omissão, e 30 dias para o registo administrativo. A limpeza é feita pela tarefa automática secguardmaintenance, a cada 5 minutos, em modo externo: depende do cron do GLPI configurado no servidor.
  • O histórico de bloqueios não expira nesta versão e só é removido com a ação “Apagar dados”.
  • Desinstalar o módulo preserva os dados; apagá-los exige a ação explícita “Apagar dados”, com permissão própria.

Permissões por ecrã

O Security Guard é uma consola apenas de administração. Os direitos ficam em Administração > Perfis > separador NexTool e variam conforme o ecrã:

  • Painel: Ver Painel;
  • Eventos: Ver Eventos;
  • Bloqueios: Ver Bloqueios, Liberar bloqueios e Criar bloqueio manual;
  • Regras: Ver Regras e Gerenciar Regras;
  • Exceções: Ver Exceções e Gerenciar Exceções;
  • Configurações e separador Teste: Configurar;
  • Logs: Ver Logs.

Uma ação exige sempre também o direito de ver o ecrã: quem só tem “Liberar bloqueios” sem “Ver Bloqueios” não desbloqueia nada. Assim, a equipa de primeira linha pode, por exemplo, desbloquear um utilizador sem poder mexer nas regras.

Limitações desta versão

Sem rodeios: a versão 0.2.0 cobre o início de sessão web, a API REST, a API v2 do GLPI 11, o CalDAV e a recuperação da palavra-passe. Continuam de fora, ou com cobertura parcial:

  • os inícios de sessão por SSO, SAML ou REMOTE_USER, que não passam pela palavra-passe do GLPI;
  • o código MFA/TOTP do GLPI 11: as tentativas aparecem nos eventos, mas o módulo não limita o código, porque o próprio GLPI 11 já bloqueia depois de várias tentativas erradas.

Também não existe notificação de bloqueio: nem e-mail, nem alerta, nem webhook. O acompanhamento é feito na consola, no Painel e nos separadores Bloqueios e Eventos.

Para quem é indicado

Para quem publica o GLPI na internet para técnicos externos, clientes ou filiais; para prestadores de serviços que gerem vários GLPI e precisam de demonstrar controlo de acesso em auditoria; e para quem já viu, no registo do servidor web, centenas de POST no início de sessão vindos do mesmo sítio.

Compatibilidade

  • Versão: 0.2.0
  • GLPI: 10 e 11 (o mesmo artefacto funciona nos dois)
  • Plugin: NexTool 6.22.0 ou superior
  • Plano: Gratuito
  • Idiomas: ecrãs em português (Brasil e Portugal), inglês (EUA e Reino Unido), espanhol (Espanha e México), francês, italiano e alemão

Próximo passo

O Security Guard faz parte do NexTool, ecossistema de módulos para expandir o GLPI sem personalizações de código. Veja a página do módulo ou fale com a equipa para uma demonstração.


Revisto pela equipa NexTool Solutions. As capturas de ecrã são do ambiente real do GLPI com o plugin NexTool; os IP e os utilizadores foram substituídos por intervalos de documentação e máscaras.

Perguntas Frequentes

Não. A proteção vem desligada e as regras criadas na instalação vêm inativas. Só há bloqueio depois de o administrador ligar a proteção e ativar uma regra ou criar um bloqueio manual. O recomendado é configurar antes os proxies de confiança.

Usuário + IP é o recomendado. O âmbito Usuário isolado permite bloquear a conta de um colega errando a palavra-passe dele de propósito, e o âmbito IP isolado pode castigar um escritório inteiro que sai pelo mesmo IP público.

Registe como proxies de confiança a rede do seu proxy local e as faixas da Cloudflare, com o botão Adicionar faixas da Cloudflare no separador Configurações, e grave. Depois confirme no cartão IP desta requisição que o IP resolvido é o do utilizador.

No separador Bloqueios, clique em Liberar no bloqueio ativo. É preciso ter no perfil os direitos Ver Bloqueios e Liberar bloqueios. O desbloqueio vale para todos os bloqueios ativos da mesma chave.

Não em claro. A correlação é feita por HMAC com chave própria da instalação e o ecrã mostra apenas uma máscara; nos inícios de sessão com sucesso, o evento guarda o ID do utilizador no GLPI. Eventos e registo administrativo têm retenção configurável, 90 e 30 dias por omissão; o histórico de bloqueios não expira nesta versão e só sai com Apagar dados.

Não. A versão 0.2.0 não envia notificação de bloqueio, nem por e-mail, nem por alerta, nem por webhook. O acompanhamento é feito na consola, no Painel e nos separadores Bloqueios e Eventos.

A API REST, sim, e também a API v2 do GLPI 11, o CalDAV e a recuperação da palavra-passe, cada um escolhido no campo Canais da regra. O código MFA/TOTP do GLPI 11 só é registado nos eventos, porque o próprio GLPI 11 já limita as tentativas erradas. O início de sessão por SSO, SAML ou REMOTE_USER não é coberto, porque não passa pela palavra-passe do GLPI.

Não. Depois da atualização, as regras existentes continuam a valer apenas para o início de sessão web. Para estender uma regra à API REST, à API v2, ao CalDAV ou à recuperação da palavra-passe, marque esses canais no campo Canais. Uma regra nova já nasce com todos os canais marcados.

Sim. O mesmo módulo funciona no GLPI 10 e no GLPI 11, com o plugin NexTool 6.22.0 ou superior.

Precisa de ajuda?