Pular para o conteúdo

CrowdSec

O motor de segurança: decisões ativas e de onde vêm, alertas, bouncers que deixaram de obter atualizações, linhas de log lidas e as que nenhum parser reconheceu, e se a Local API responde.

O DumbMonit lê as métricas Prometheus do CrowdSec (porta 6060) e verifica /health da Local API (porta 8080). Com uma chave de bouncer opcional, também pergunta à Local API as decisões sobre 192.0.2.1, um endereço de documentação: a resposta é sempre vazia, e prova que a autenticação e a base de dados respondem. Nunca cria ou elimina uma decisão e nunca descarrega a lista de banimento.

A falha a vigiar é um bouncer que deixou de obter atualizações. A firewall ou o proxy inverso continua a correr com a lista que tinha, novos atacantes passam, e nada se queixa. O CrowdSec não publica quando um bouncer obteve pela última vez; o DumbMonit lê-o a partir do contador de pedidos do bouncer, que para de se mover. A segunda é uma aquisição que quebrou (um ficheiro de log renomeado, um contentor recriado): o CrowdSec não lê nada, não vê nenhum ataque, e permanece verde.

Todas as métricas têm o prefixo dumbmonit_crowdsec_. Os totais são contadores: os gráficos e as regras convertem-nos em taxas.

MétricaO quêEtiquetas
version_infovalor 1version
lapi_up1 quando a Local API responde a /health
lapi_decisions_okcom uma chave de bouncer: 1 quando a Local API respondeu à consulta de decisão
decisionsdecisões ativas, listas de bloqueio da comunidade incluídas
decisions_by_originorigin: crowdsec, cscli, CAPI, lists…
alertsalertas mantidos pela Local API, excluindo os da comunidade
bouncers_seenbouncers que chamaram a Local API desde que o CrowdSec arrancou
bouncer_requests_totalpedidos de cada bouncer; quando para de se mover, o bouncer deixou de obter atualizaçõesbouncer
machine_requests_totalpedidos de cada agente (máquina)machine
lapi_requests_totaltodos os pedidos à Local API
scenario_overflows_totalcenários disparados pelo agente local: cada um é um alerta
lines_read_total, lines_parsed_total, lines_unparsed_totallinhas de log lidas pelo agente, e as analisadas ou não
source_lines_total, source_lines_unparsed_totalo mesmo por fonte de logsource
bucketsbuckets de cenário atualmente abertos
alerts_recentcom um acesso de máquina: alertas locais das últimas 24 horas lidos da Local API
alerts_by_countrycom um acesso de máquina: esses alertas por país de origem (source.cn)country

As famílias da Local API aparecem onde a Local API corre, as famílias de log onde um agente lê logs; a imagem oficial e uma instalação padrão executam ambos.

As regras incorporadas que se aplicam: CrowdSec Local API down, CrowdSec bouncer stopped pulling, CrowdSec reads no logs, mais Monitor unreachable.

O painel acima dos gráficos lê o que a verificação guardou; abrir a página nunca consulta o CrowdSec. Diz o que está mal numa frase (Local API, bouncers, leitura de logs e a fração de linhas que nenhum parser reconheceu), depois as decisões ativas, alertas mantidos, cenários disparados nas últimas 24 horas e linhas lidas por segundo, depois o tempo desde que cada bouncer obteve pela última vez, as decisões por origem e a fração não analisada de cada fonte de log.

Com um acesso de máquina, segue-se um mapa de ameaças: os alertas das últimas 24 horas, coloridos por país. As mesmas contagens alimentam o mapa de ameaças da página Segurança, ao lado dos bloqueios das firewalls e das ameaças do Cloudflare.

  1. O CrowdSec publica as suas métricas em 127.0.0.1:6060 por predefinição. Defina listen_addr na secção prometheus de /etc/crowdsec/config.yaml para um endereço que o DumbMonit possa alcançar, depois reinicie o CrowdSec. A imagem Docker oficial já escuta em todas as interfaces.

    sudo sed -i 's/listen_addr: 127.0.0.1/listen_addr: 0.0.0.0/' /etc/crowdsec/config.yaml
    sudo systemctl restart crowdsec
  2. As métricas não precisam de nenhuma credencial: contêm contagens, nomes de bouncers e máquinas e caminhos de ficheiros de log, nunca um endereço IP. Filtre a porta 6060 para que só o anfitrião do DumbMonit a alcance, e verifique que responde.

    curl -s http://crowdsec.lan:6060/metrics | grep cs_info
  3. O DumbMonit também verifica /health da Local API, na porta 8080 do mesmo anfitrião: listen_uri na secção api.server tem então de estar também alcançável. Desmarque Check the Local API para um anfitrião que só executa um agente.

  4. Opcional: crie uma chave de bouncer para o DumbMonit e cole-a como Bouncer API key abaixo. Uma chave de bouncer só pode ler decisões. O DumbMonit pergunta pelas decisões sobre 192.0.2.1, um endereço de documentação, por isso a resposta é sempre vazia e a lista de banimento nunca é descarregada.

    sudo cscli bouncers add dumbmonit
  5. Ou, para o mapa de ameaças da página Segurança: crie um acesso de máquina e escolha Acesso de máquina abaixo. Só o país de cada alerta é guardado.

    sudo cscli machines add dumbmonit --password 'a-long-password'
  6. No DumbMonit, introduza o anfitrião do CrowdSec, por exemplo «crowdsec.lan». Onde a Local API e os agentes correm em anfitriões diferentes, adicione cada anfitrião: decisões, alertas e bouncers são contados onde a Local API corre, linhas de log onde cada agente as lê.

Um bouncer eliminado com cscli bouncers delete mantém o seu contador até o CrowdSec reiniciar, e é reportado como parado até então. Um bouncer que só chama a Local API quando serve um pedido (um bouncer de proxy inverso em modo live) pode ficar quieto durante meia hora numa noite calma; mude-o para o modo stream, ou aumente a janela da regra.

CredencialCampos
Só métricasNada: lê /metrics, e /health da Local API.
Chave de API de bouncerA chave impressa por cscli bouncers add dumbmonit, enviada como X-Api-Key à Local API.
Acesso de máquinaO nome e a palavra-passe dados a cscli machines add. O DumbMonit inicia sessão (/v1/watchers/login) e lê os alertas locais das últimas 24 horas (/v1/alerts, sem os da comunidade), guardando só o país de cada um: nenhum endereço é guardado.

Endereço: um nome de anfitrião ou IP (crowdsec.lan), anfitrião:porta para as métricas, ou um URL completo. Opções: protocolo (HTTP por predefinição), porta das métricas (6060), Check the Local API (ativado), porta da Local API (8080), verificação de certificado e tempo limite do pedido (10 s). Itens do hub (parsers, cenários, coleções) corrompidos ou desatualizados não são visíveis através das métricas, só com cscli hub list no anfitrião.