🗂️ Arquivos de Configuração
📄 config.json
Armazena as configurações do sistema, contribuindo para a personalização das análises realizadas.
Já falamos um pouco dele anteriormente
Restart
Sempre que o arquivo config.json
for modificado, é necessário reiniciar o serviço para que as alterações tenham efeito.
Pelo painel de admin ou terminal com comando systemctl restart rr-flow-api.service
Por padrão o arquivo vem com as seguintes configurações config.json
.
{
"api_allow_subnet": [
"127.0.0.1/32",
"::1",
"0.0.0.0/0",
"::/0"
],
"api_bind": "::",
"api_port": 5000,
"cache_lifetime": 1,
"collection_interval": 1,
"core_workers": 4,
"data_path": "/var/rr-flows/",
"debug": false,
"maximum_disk_gb": 70,
"password_admin_panel": "remontti",
"grafana": [
{
"datasources": "xxxxxxxxxxx",
"service_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"url": "http://localhost:3000"
}
],
"source_path": [
{
"buffer": 67108864,
"compress": "lz4",
"name": "Borda",
"port": 3055,
"sampling": 1024,
"snmp": [
{
"community": "public",
"ip": "10.10.10.2",
"port": 161,
"version": 2
}
],
"type": "netflow",
"vendor": "huawei"
}
]
}
Aqui está uma descrição dos itens de configuração:
Opções da API
api_allow_subnet
Uma lista de prefixos de IP que têm permissão para consumir a API. (Mantenha os IPs de localhost)
"api_allow_subnet": [
"127.0.0.1/32",
"::1",
"0.0.0.0/0"
],
api_allow_subnet
Altamente recomendado que você restrinja apenas para seus ips de gerencia, pois as saidas JSONs não passam por autenticação. Não me responsabilizo por vazamento de dados.
api_bind
Endereço IP ao qual a API será vinculada. Padrão 0.0.0.0 para todos.
"api_bind": "0.0.0.0",
api_port
Porta na qual a API estará disponível.
"api_port": "5000",
cache_lifetime
Tempo de vida do cache em dias. /var/cache/rr-flow/
"cache_lifetime": 3,
collection_interval
Intervalo de coleta do flow em minutos. Não recomendo valores como 2,3 e 4, de preferencia para intervalos de 1,5,10… pois a complexidade de calculos pode acabar entregando ou não entregando alguns dados. Padrão 5min até a versão 1.3.0, e Padrão 1min depois da versão 1.4.0
"collection_interval": 1,
core_workers
A quantidade de processos alocado(s) para cada CPU (Thread). Padrão em 4.
"core_workers": 4,
Aviso
É possível considerar um aumento desse número, principalmente se houver capacidade de hardware adicional disponível. Contudo, é importante exercer cautela ao aumentar excessivamente, pois isso pode resultar em efeitos indesejados, como a sobrecarga do servidor ou a ocorrência de travamentos.
data_path
Caminho onde os dados de flows coletados serão armazenados.
"data_path": "/var/rr-flows/",
data_path/EXPORTADOR/ANO/MES/DIA/nfcapd.AnoMesDiaHoraMinuto
tree -sh /var/rr-flows/
├── Borda
│ ├── 2023
│ │ └── 07
│ │ └── 11
│ │ ├── nfcapd.202307111600
│ │ ├── nfcapd.202307111605
│ │ ├── nfcapd.202307111610
│ │ ├── nfcapd.202307111615
│ │ └── nfcapd.202307111620
│ └── nfcapd.current.29124
└── Cgnat
├── 2023
│ └── 07
│ └── 11
│ ├── nfcapd.202307111600
│ ├── nfcapd.202307111605
│ ├── nfcapd.202307111610
│ ├── nfcapd.202307111615
│ └── nfcapd.202307111620
└── nfcapd.current.29128
debug
Habilita ou desabilita o modo de depuração. >- false - Desativado >- true - Ativado
"debug": false,
Aviso
Ao ativar o arquivo de log /var/log/rr-flow/rr-flow.log
irá se tornar gigante, não recomendo ativar, apensas se estiver enfrentando alguma dificuldade e precisar tentar identificar um possível problema.
grafana
Configurações para integração com o Grafana.
- datasources UID da fonte de dados do Grafana.
- service_token Token de serviço para autenticação no Grafana.
- url URL do Grafana. (Padrão http://localhost:3000)
"grafana": [
{
"datasources": "xxxxxxxxxxxxxx",
"service_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"url": "http://localhost:3000"
}
],
maximum_disk_gb
Espaço máximo em que será armazenado no diretório data_path em gigabytes.
"maximum_disk_gb": "85",
Aviso
Não defina mais que 90% do seu disco.
password_admin_panel
Senha para acessar o painel de administração.
"password_admin_panel": "remontti",
Adicionar nova fonte de fluxo
Para adicionar uma ou mais fontes iremos adionar ao source_path
source_path
Lista de fontes de dados de fluxos (routers que enviarão os fluxos). É possível adicionar várias fontes de dados para diferentes routers, dependendo do nível de sua licença. Isso permite monitorar e coletar fluxos de múltiplas origens.
- buffer: Define o buffer de entrada do soquete de rede para bufflen bytes.
-
compress: Algoritmo de compressão. (Padrão lz4)
Método Descrição Compressão Leitura Escrita lz4 Rápido, leve Muito Alta Muito Alta Muito Alta bz2 Máxima compactação Lenta Lenta Lenta lzo Equilíbrio rápido Muito Alta Alta Muito Alta zstd ¹ Flexível, configurável Alta a Muito Alta Alta Alta ¹ nfdump 1.7.5
-
name: Nome da fonte de dados (Sem espaço).
- port: Porta que receberá os dados.
- sampling: Aplica a taxa de amostragem, a menos que a taxa de amostragem seja anunciada pelo dispositivo exportador, neste caso defina o valor como auto.
- snmp: Configurações SNMP.
- community: Comunidade SNMP. (Padrão public)
- ip: Endereço IP SNMP.
- port: Porta SNMP. (Padrão 161)
- version: Versão SNMP. (Padrão v2)
- type: Tipo de fonte de dados (neste caso, “”).
- netflow
- sflow
- vendor: Fornecedor da fonte de dados.
- huawei
- cisco
- juniper
- routeros / routeros6
- vyos
- linux
name
em “name”: “Nome-Aqui” não utilize espaço.
OBS: Licença
A quantidade de fonte de fluxo diponivel é relativo a sua licença.
Porta
Ao configurar novos fluxos, lembre-se de que a porta de coleta não deve ser a mesma para cada fluxo. Certifique-se de usar portas diferentes para evitar conflitos e garantir a coleta de dados.
Segue alguns exemplos exemplo:
{
//...
"source_path": [
{
"buffer": 67108864,
"compress": "lz4",
"name": "Borda",
"port": 3055,
"sampling": 1024,
"snmp": [
{
"community": "public",
"ip": "10.10.10.2",
"port": 161,
"version": 2
}
],
"type": "netflow",
"vendor": "huawei"
},
{
"buffer": 67108864,
"compress": "lz4",
"name": "Cgnat",
"port": 3066,
"sampling": 5,
"snmp": [
{
"community": "public",
"ip": "10.10.10.3",
"port": 161,
"version": 2
}
],
"type": "netflow",
"vendor": "routeros"
},
{
"buffer": 67108864,
"compress": "lz4",
"name": "Switch",
"port": 3077,
"sampling": 1024,
"snmp": [
{
"community": "public",
"ip": "10.10.10.4",
"port": 161,
"version": 2
}
],
"type": "sflow",
"vendor": "huawei"
}
]
//...
}
SNMP v3
SNMP v3 ainda não tem suporte, mas se desejar deixar configurado segue exemplo.
//...
"snmp": [
{
"auth_password": "senha",
"auth_protocol": "sha", // md5 | sha
"ip": "10.10.10.7",
"port": 161,
"priv_password": "senha",
"priv_protocol": "aes", // des | aes
"username": "usuario",
"version": 3
}
],
//...
📄 license.json
Contém informações sobre a licença do software.
Estrutura
{
"key": "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"
}
license.json
É necessário reiniciar o serviço para que a licença tenham efeito.
Se estiver alterando a linceça pelo terminal pode reiniciar o serviço rr-flow-api com o comando:
systemctl restart rr-flow-api.service
📄 custom-filters.json
Arquivo contendo um conjunto de filtros personalizados para otimizar a visualização dos dados nas dashboards, você pode criar seus filtros.
Composto por filter onde deve ser informado os filtros e name você define um nome para seu filtro.
Estrutura
// Exemplo onde tudo que destino ou origem for a porta 22
// e conter as flags FIN ou Reset
//...
{
"filter": "port 22 and (flags F or flags R)",
"name": "Força bruta SSH"
},
//...
custom-filters.json
Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.
Segue uma lista básica para você criar seus próprios filtros e utilizar em Dashboars que possuem campo para inserir filtros manuais.
Filtros
Filtros
src » Origem.
dst » Destino.proto » Protocolo de comunicação.
port » Número da porta.
src port » Porta de origem.
dst port » Porta de destino.net » Prefixo de rede.
src net » Prefixo de rede de origem.
dst net » Prefixo rede de destino.ip » Endereço IP.
src ip » Endereço IP de origem.
dst ip » Endereço IP de destino.as » Sistema Autônomo.
src as » AS de origem.
dst as » AS de destino.
prev as » AS anterior.
next as » Próximo AS.bgpnext ip » Próximo IP BGP.
next ip » Próximo IP.
if número » Interface. (número SNMP)
in if número » Interface de entrada.
out if número » Interface de saída.xip » Endereço IP expandindo.
src xip » Endereço IP de origem expandindo.
dst xip » Endereço IP de destino expandindo.
Operadores
Operadores
AND » Operador lógico AND = E.
NOT » Operador lógico NOT = NÃO.
OR » Operador lógico OR = OU.
-
Operadora OR você deve ter cuidado ao utilizar mais de um filtro, exemplo quero combinar dois endereços IPs com dois tipos de protocolos, ficaria:
(ip 1.1.1.1 OR ip 8.8.8.8) AND (proto TCP OR proto UDP) AND (port 53 OR port 443)
-
Range de portas:
dst port >= 0 and dst port <= 100
Flags
Flags TCP
A » ACK (Acknowledgment) - Confirma o recebimento de dados.
S » SYN (Synchronize) - Inicia uma conexão.
F » FIN (Finish) - Indica o término do envio de dados.
R » RST (Reset) - Redefine a conexão.
P » PSH (Push) - Força a entrega imediata dos dados.
U » URG (Urgent) - Indica dados urgentes.
X » Todas as flags ativadas - Indica um pacote incomum.A ordem das flags dentro de tcpflags não é relevante. Flags não mencionadas são tratadas como não especificadas. Para obter os fluxos com apenas a flag SYN ativada, use a sintaxe flags S and not flags AFRPU
Exemplo
[
{
"filter": "(src ip 8.8.8.8 or src ip 1.1.1.1) AND src port 53 AND dst net 200.200.200.0/22",
"name": "Vido dos DNS famosos para com destino ao meu prefixo"
}
//...
]
📄 fav-asn-prefix-graphs.json
Utilize este arquivo para declarar os ASN que você deseja explorar através de gráficos e análises estatísticas. Além disso, é possível especificar prefixos associados para maior granularidade.
Filtro de ASNs e Prefixos de Rede
Neste arquivo é possível criar um conjunto de elementos informando o Sistemas Autônomos (ASNs) e o prefixos de rede.
Estrutura
[
{
"description": "Descrição",
"filter": {
"as": [
"ASN A",
"ASN B",
"ASN C",
//..
],
"prefix": [
"Prefixos A",
"Prefixos B",
"Prefixos C"
//...
]
}
}
]
Exemplo ASN + Prefixo
Neste caso você pode combinar os ASN com os prefixos.
//...
{
"description": "A + B",
"filter": {
"as": [
"123",
"321"
],
"prefix": [
"123.123.123./22",
"321.321.321.0/22",
"2804:123::/32",
"2804:321::/32"
]
}
},
//...
Exemplo apenas ASN
Você pode adicionar quantos ASN quiser.
{
"description": "Youtube",
"filter": {
"as": [
"36040"
]
}
},
{
"description": "Google All",
"filter": {
"as": [
"15169"
"36040",
"396982"
]
}
},
//...
Exemplo apenas Prefixo
Se em description conter a palavra CDN na dashboard “Análise Geral - ASN + Prefixos (Favoritos)” ele irá aparecer separadamente como o “top CDNs”.
//...
{
"description": "CDN da minha Operadora",
"filter": {
"prefix": [
"192.192.0.0/26",
"2001:db8:face::/64"
]
}
},
//...
fav-asn-prefix-graphs.json
Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.
📄 fav-services-graphs.json
Lista com serviços conhecidos para simplificar no uso das Dashboards. É possível criar combinações com mais de uma porta e mais de um tipo de protocolo.
Estrutura
[
{
"NOME": {
"port": [
"número da porta"
],
"proto": [
"protocolo"
]
},
}
]
Exemplo
[
{
"DNS": {
"port": [
"53"
],
"proto": [
"udp",
"tcp"
]
},
"FTP": {
"port": [
"21",
"20"
],
"proto": [
"tcp"
]
},
"MySQL": {
"port": [
"3306"
],
"proto": [
"tcp"
]
},
"NTP": {
"port": [
"123"
],
"proto": [
"tcp",
"udp"
]
},
"POP E-Mail": {
"port": [
"110",
"143",
"995"
],
"proto": [
"tcp"
]
},
"Ping": {
"port": [],
"proto": [
"icmp"
]
},
"Port 0": {
"port": [
"0"
],
"proto": [
"udp"
]
},
"RDP": {
"port": [
"3389"
],
"proto": [
"tcp",
"udp"
]
},
"SMTP E-Mail": {
"port": [
"25",
"465",
"587"
],
"proto": [
"tcp"
]
},
"SSH": {
"port": [
"22"
],
"proto": [
"tcp",
"udp"
]
},
"SpeedTest": {
"port": [
"8080"
],
"proto": [
"tcp"
]
},
"Telnet": {
"port": [
"23"
],
"proto": [
"tcp",
"udp"
]
},
"Tunel GRE": {
"port": [],
"proto": [
"gre"
]
},
"Web HTTP/HTTPS": {
"port": [
"80",
"443"
],
"proto": [
"tcp",
"udp"
]
}
}
]
fav-services-graphs.json
Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.
📄 ignore-asn.json
Este arquivo permite a exclusão estratégica de determinados ASN (Sistemas Autônomos) da análise, útil para focar em informações relevantes.
Estrutura
[
{
"asn": "Número do AS",
"description": "Descrição"
}
]
Exemplo
[
{
"asn": 65530,
"description": "Ignore iBGPs"
},
{
"asn": 123,
"description": "Ignore meu AS"
},
{
"asn": 321,
"description": "Ignore meu Cliente AS"
},
{
"asn": 0,
"description": "Ignore o BUG"
}
]
ignore-asn.json
Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.
📄 my-prefix.json
Registre aqui seus próprios prefixos de rede. Ao incluir prefixos menores pode agilizar a visualização de gráficos mais detalhado.
Estrutura
{
"asn_prefix": {
"IPv4": [
"Prefixos IPv4"
],
"IPv6": [
"Prefixos IPv6"
]
}
}
Exemplo
{
"asn_prefix": {
"IPv4": [
"192.168.0.0/22",
"192.168.0.0/23",
"192.168.2.0/23",
"192.168.0.0/24",
"192.168.1.0/24",
"192.168.2.0/24",
"192.168.3.0/24"
],
"IPv6": [
"2001:db8::/32",
"2001:db8::/33",
"2001:0db8:8000::/33",
"2001:db8::/34",
"2001:db8:4000::/34",
"2001:db8:8000::/34",
"2001:db8:c000::/34"
]
}
}
my-prefix.json
Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.
📄 my-prefix-int.json
Registre aqui seus próprios prefixos ou de clientes bem como ASN se necessário. Exemplo servidores, clientes dedicados, clientes ASN entre outros.
Estrutura
[
{
"description": "Meus ASN e Prefixos",
"filter": {
"as": [
"ASN"
],
"prefix": [
"Prefixo"
]
}
}
]
Exemplo
[
{
"description": "Meus ASNs e Prefixos",
"filter": {
"as": [
"64512",
"64514"
],
"prefix": [
"192.168.0.0/21",
"192.168.128.0/22",
"2001:db8::/32",
"2001:db9::/32"
]
}
},
{
"description": "Todos meus cliente AS",
"filter": {
"as": [
"65530",
"65531",
"65532"
]
}
},
{
"description": "Cliente ASN X",
"filter": {
"as": [
"65530"
],
"prefix": [
"192.168.144.0/21"
]
}
},
{
"description": "Todos os IPs",
"filter": {
"prefix": [
"0.0.0.0/0",
"::/0"
]
}
},
{
"description": "Servidores",
"filter": {
"prefix": [
"192.168.168.0/26",
"2001:db8:bebe:cafe::/64"
]
}
},
{
"description": "Cliente Dedicado",
"filter": {
"prefix": [
"192.168.168.225/32",
"2001:db8:bebe:100::/56"
]
}
}
{
"description": "Cliente Dedicado",
"filter": {
"prefix": [
"192.168.169.128/28",
"2001:db8:f0da::/48"
]
}
}
]
my-prefix.json
Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.
📄 notify.json
O arquivo notify.json
contém as configurações necessárias para o envio de notificações por e-mail e Telegram dentro da aplicação. Este arquivo é crucial para que a aplicação possa enviar alertas e relatórios automaticamente com base nos eventos monitorados.
A estrutura do notify.json
é composta por duas seções principais: email
e telegram
. Cada uma dessas seções tem suas próprias configurações específicas, que são descritas abaixo.
Seção email
Esta seção define as configurações para envio de e-mails usando um servidor SMTP. O sistema pode enviar notificações para destinatários configurados quando certos eventos ou condições forem atendidos.
- default_destination: O endereço de e-mail padrão para onde as notificações serão enviadas.
- sender_name: O nome que aparecerá como o remetente do e-mail. Pode ser personalizado.
- smtp_host: O endereço do servidor SMTP utilizado para enviar os e-mails.
- smtp_password: A senha da conta de e-mail usada para autenticar no servidor SMTP.
- smtp_port: A porta usada para a conexão SMTP. Comumente 587 (STARTTLS) ou 465 (SSL/TLS).
- smtp_username: O nome de usuário (geralmente o endereço de e-mail) utilizado para autenticação no servidor SMTP.
Teste E-mail
Você pode testar sua conexão o com o servidor e-mail utilizando, e fazer um envio de teste utilizando a API:
{URL}:{PORT}/api/test/email/connection
{URL}:{PORT}/api/test/email/Sua-Mensagem/example@example.com
Seção telegram
Esta seção define as configurações para envio de mensagens via Telegram usando a API do bot do Telegram. A aplicação pode enviar mensagens para um chat ou grupo configurado.
- allow_responses: Listar de grupos ou usuario permitidos a executar comandos com o bot.
- bot_token: O token do bot do Telegram, necessário para autenticação e envio de mensagens. Esse token pode ser obtido diretamente da API do Telegram ao criar um bot.
- default_chat: O ID do chat ou grupo onde as mensagens serão enviadas por padrão.
Telegram Tópicos
Para enviar mensagens para um tópico específico dentro de um grupo, é necessário saber o ID do tópico. O formato para especificar um tópico é o ID do grupo seguido de uma vírgula e o ID do tópico.
Exemplo: -1001234567890,50
, onde -1001234567890
é o ID do grupo, e 50
é o ID do tópico dentro desse grupo.
Para mais ajuda acesse o menu Bot Telegram.
Comandos bot
Acesse o menu Bot Telegram para mais informações.
Exemplo
{
"email": [
{
"default_destination": "example@example.com",
"sender_name": "RR-Flow Notifications",
"smtp_host": "smtp.example.com",
"smtp_password": "example_password",
"smtp_port": "587",
"smtp_username": "notify@example.com"
}
],
"telegram": [
{
"allow_responses": [
"-1000000000000",
"200000000"
],
"bot_token": "123456789:ABCdefGHIjklMNO456PQRstUVWxyz",
"default_chat": "-1001234567890"
}
]
}
📄 data_traffic_analysis.json
O arquivo data_traffic_analysis.json
contém as configurações para monitoramento de tráfego de rede, cujos dados são armazenados no banco de dados localizado em $data_path/traffic_data.db
. Esse arquivo pode ser utilizado tanto para registrar e armazenar dados de tráfego coletados, quanto para configurar alertas e ações a serem executadas com base em condições predefinidas. Nele, é possível definir descrições de tráfego, filtros, fontes de coleta, além de especificar como os alertas serão enviados (por e-mail, Telegram ou scripts).
Exemplo de Estrutura
[
{
"alerts": {
"email": {
"activate": true,
"graph_color": "#9C27B0",
"graph_send": true,
"graph_time": 90,
"message": "<b>[$status]:</b> Trafego de ICMP elevado <br>👉 aggr_flows: $aggr_flows<br>👉 bpp: $bpp<br>👉 bps:$bps<br>👉 bytes: $bytes<br>👉 packets: $packets <br><br>👉 description: $description<br>👉 filter: $filter<br>👉 sources: $sources",
"subject": "[$status] Trafego de ICMP elevado",
"recipients": [
"empresa1@empresa1.com",
"empresa2@empresa2.com"
]
},
"script": {
"activate": true,
"file": "/opt/rr-flow-api/scripts/example.1.sh \"$status\" \"$aggr_flows\" \"$bpp\" \"$bps\" \"$bytes\" \"$packets\" \"$description\" \"$filter\" \"$sources\" \"VALOR EXTRA1\" \"VALOR EXTRA2\""
},
"telegram": {
"activate": true,
"graph_color": "#D81B60",
"graph_send": true,
"graph_time": 90,
"message": "[$status] <b>Trafego de ICMP elevado</b> \n👉 aggr_flows: $aggr_flows\n👉 bpp: $bpp\n👉 bps:$bps\n👉 bytes: $bytes\n👉 packets: $packets \n\n👉 description: $description\n👉 filter: $filter\n👉 sources: $sources \n É teste só",
"recipients": [
"200000000",
"200000001",
"200000002"
]
}
},
"conditions": {
"logic": "AND",
"rules": [
{
"operator": ">",
"value": 10485760,
"variable": "bps"
},
{
"operator": ">",
"value": 300000,
"variable": "packets"
}
]
},
"description": "Tráfego de ICMP",
"filter": "proto icmp",
"retention": 30,
"sources": [
"BORDA-RS",
"BORDA-SC",
"BORDA-PR"
]
},
{
"alerts": {
"email": {
"activate": true,
"graph_color": "#9C27B0",
"graph_send": true,
"graph_time": 90,
"message": "<b>[$status]:</b> Possível ataque (BORDA-RS) <br>👉 aggr_flows: $aggr_flows<br>👉 bpp: $bpp<br>👉 bps:$bps<br>👉 bytes: $bytes<br>👉 packets: $packets <br><br>👉 description: $description<br>👉 filter: $filter<br>👉 sources: $sources",
"subject": "[$status] Possível ataque (BORDA-RS)"
},
"script": {
"activate": true,
"file": "/opt/rr-flow-api/scripts/example.1.sh \"$status\" \"$aggr_flows\" \"$bpp\" \"$bps\" \"$bytes\" \"$packets\" \"$description\" \"$filter\" \"$sources\" \"VALOR EXTRA1\" \"VALOR EXTRA2\""
},
"telegram": {
"activate": true,
"graph_color": "#D81B60",
"graph_send": true,
"graph_time": 90,
"message": "[$status] <b>Possível ataque (BORDA-RS)</b> \n👉 aggr_flows: $aggr_flows\n👉 bpp: $bpp\n👉 bps:$bps\n👉 bytes: $bytes\n👉 packets: $packets \n\n👉 description: $description\n👉 filter: $filter\n👉 sources: $sources \n É teste só"
}
},
"conditions": {
"logic": "AND",
"rules": [
{
"operator": ">",
"value": 1073741824,
"variable": "bps"
}
]
},
"description": "Possível ataque (BORDA-RS)",
"filter": "port 53 and (bpp > 512 and bpp <9000)",
"retention": 90,
"sources": [
"BORDA-RS"
]
},
{
"alerts": {
"email": {
"activate": true,
"message": "<b>[$status]:</b> Possível ataque (BORDA-SC) <br>👉 aggr_flows: $aggr_flows<br>👉 bpp: $bpp<br>👉 bps:$bps<br>👉 bytes: $bytes<br>👉 packets: $packets <br><br>👉 description: $description<br>👉 filter: $filter<br>👉 sources: $sources",
"subject": "[$status] Possível ataque (BORDA-SC)"
},
"script": {
"activate": true,
"file": "/opt/rr-flow-api/scripts/example.1.sh \"$status\" \"$aggr_flows\" \"$bpp\" \"$bps\" \"$bytes\" \"$packets\" \"$description\" \"$filter\" \"$sources\" \"VALOR EXTRA1\" \"VALOR EXTRA2\""
},
"telegram": {
"activate": true,
"message": "[$status] <b>Possível ataque (BORDA-SC)</b> \n👉 aggr_flows: $aggr_flows\n👉 bpp: $bpp\n👉 bps:$bps\n👉 bytes: $bytes\n👉 packets: $packets \n\n👉 description: $description\n👉 filter: $filter\n👉 sources: $sources \n É teste só"
}
},
"conditions": {
"logic": "AND",
"rules": [
{
"operator": ">",
"value": 1073741824,
"variable": "bps"
}
]
},
"description": "Possível ataque (BORDA-SC)",
"filter": "port 53 and (bpp > 512 and bpp <9000)",
"retention": 90,
"sources": [
"BORDA-SC"
]
},
{
"description": "Tráfego Todas Bordas ",
"filter": "any",
"retention": 365,
"sources": [
"BORDA-RS",
"BORDA-SC",
"BORDA-PR"
]
}
]
Configuração
-
📋 Requisitos
- description: Define o nome ou identificação do tráfego monitorado.
- filter: Define o filtro de captura do tráfego, que segue o padrão de filtros utilizados por ferramentas como o tcpdump.
- retention: Define o número de dias em que os dados de tráfego serão mantidos no banco de dados.
- sources: Lista de fontes (ou locais de borda) de onde os dados de tráfego estão sendo coletados.
-
🚨 alerts
Esta seção define como os alertas serão enviados e quais ações serão executadas quando as condições forem atendidas.
-
📧 email
- activate: Ativa ou desativa o envio de e-mail. Valor padrão é
false
. - graph_color: Cor do gráfico incluído no e-mail, no formato hexadecimal. Se não informado, uma cor padrão será usada.
- graph_send: Define se o gráfico será incluído no e-mail. Valor padrão é
false
se não informado. - graph_time: Define o período em minutos para os dados exibidos no gráfico. O valor padrão é
60
minutos se não informado. (É necessário ter esse período de dados para poder gerar o gráfico) - message: Texto da mensagem do e-mail, onde variáveis podem ser utilizadas (ver seção “Variáveis de Notificações e Script”).
- recipients: Lista de e-mails dos destinatários. Se não informado, utiliza o destinatário padrão configurado em do
notify.json
. - subject: Assunto do e-mail, com suporte a variáveis.
- activate: Ativa ou desativa o envio de e-mail. Valor padrão é
-
💬 telegram
- activate: Ativa ou desativa o envio de alertas via Telegram. Valor padrão é
false
. - graph_color: Cor do gráfico no Telegram, no formato hexadecimal. Se não informado, uma cor padrão será usada.
- graph_send: Define se o gráfico será incluído na mensagem do Telegram. Valor padrão é
false
se não informado. - graph_time: Define o período em minutos para os dados exibidos no gráfico. Valor padrão é
60
minutos se não informado. - message: Texto da mensagem no Telegram, com suporte a variáveis.
- recipients: Lista de IDs de chat do Telegram. Se não informado, utiliza o ID de destinatário padrão configurado em do
notify.json
..
- activate: Ativa ou desativa o envio de alertas via Telegram. Valor padrão é
-
🖥️ script
- activate: Ativa ou desativa a execução de um script. Valor padrão é
false
. - file: Caminho para o script a ser executado, com suporte a variáveis.
- activate: Ativa ou desativa a execução de um script. Valor padrão é
-
⚙️ conditions
Define as condições que precisam ser atendidas para que os alertas sejam acionados.
- logic: Define a lógica entre as condições. Pode ser
AND
ouOR
. - rules: Lista de regras, pode ser multipas. (ver seção “Variáveis de Regras”). Cada regra contém:
- operator: O operador a ser usado na comparação (
>
,<
,>=
,<=
). - value: O valor de referência para a comparação.
- variable: A variável que será comparada. (ver seção “Variáveis de Regras”)
- operator: O operador a ser usado na comparação (
- logic: Define a lógica entre as condições. Pode ser
-
Variáveis de Regras
As seguintes variáveis podem ser usadas para criação das condições (rules » variable
):
- aggr_flows: Número agregado de fluxos.
- bpp: Bits por pacote.
- bps: Bits por segundo.
- bytes: Quantidade total de bytes.
- packets: Número total de pacotes.
Variáveis de Notificações e Script
As seguintes variáveis podem ser usadas nas mensagens de e-mail, Telegram e nos scripts:
- $aggr_flows: Número agregado de fluxos.
- $bpp: Bits por pacote.
- $bps: Bits por segundo.
- $bytes: Quantidade total de bytes.
- $packets: Número total de pacotes.
- $status: Status do incidente (
incident
ouresolved
). - $description: Descrição do item.
- $filter: Filtro aplicado.
- $sources: Fontes de onde os dados foram coletados.
Comportamento Padrão
- Se recipients (destinatários) não for informado nas seções de e-mail ou Telegram, os valores definidos em
notify.json
serão usados. - Se graph_color não for informado, uma cor padrão será utilizada.
- O valor padrão de graph_send é
false
. - O valor padrão de graph_time é
60
minutos, caso não seja especificado.
Exemplo Script
Segue um exemplo simples que pode ser utilizado para recerber os dados. Seja criativo!
#!/bin/bash
# Receber as variáveis passadas como argumentos do exemplo:
# "file": "/opt/rr-flow-api/scripts/example.1.sh \"$status\" \"$aggr_flows\" \"$bpp\" \"$bps\" \"$bytes\" \"$packets\" \"$description\" \"$filter\" \"$sources\" \"VALOR EXTRA1\" \"VALOR EXTRA2\""
incident=${1}
aggr_flows=${2}
bpp=${3}
bps=${4}
bytes=${5}
packets=${6}
description=${7}
filter=${8}
sources=${9}
extra1=${10}
extra2=${11}
# Criar ou adicionar ao log em /tmp/example.1.log
echo "==========================" >> /tmp/example.1.log
echo "Status: [${incident}]" >> /tmp/example.1.log
echo "Data: $(date)" >> /tmp/example.1.log
echo "--">> /tmp/example.1.log
echo "Description: ${description}" >> /tmp/example.1.log
echo "Filtro: ${filter}" >> /tmp/example.1.log
echo "Router(s): ${sources}" >> /tmp/example.1.log
echo "--">> /tmp/example.1.log
echo "aggr_flows: ${aggr_flows}" >> /tmp/example.1.log
echo "bpp: ${bpp}" >> /tmp/example.1.log
echo "bps: ${bps}" >> /tmp/example.1.log
echo "bytes: ${bytes}" >> /tmp/example.1.log
echo "packets: ${packets}" >> /tmp/example.1.log
echo "--">> /tmp/example.1.log
echo "Valor Extra 1: ${extra1}" >> /tmp/example.1.log
echo "Valor Extra 2: ${extra2}" >> /tmp/example.1.log
echo "==========================" >> /tmp/example.1.log
echo "Ok!"
📄 botnet.json
Este arquivo não está listado na inteface admin, mas se encontra no diretório /opt/rr-flow-api/config/
ele é automaticamente atualizado com a lista de botnets fornecida pela Feodotracker, auxiliando na identificação de atividades maliciosas.
botnet.json
O arquivo botnet.json
é atualizado automaticamente a cada 30min.
📄 interfaces.json
Lista as interfaces das fontes de fluxos. Este arquivo é criado automaticamente durante o início do serviço caso ele não exista. A conexão SNMP é estabelecida a partir dos dados presentes em source_path. O mesmo pode ser editado para customização, bem como remover interfaces desnecessárias. Recomendo deixar apenas as interfaces que estão sendo coletadas, desta forma evita erros quando for coletar, eu partcularmente deixo apenas as de upstream, mas vai depender de cada caso.
Extrutura
{
"NOME DO FLUXO": [
{
"desc_value": "Descrição da interface",
"indice": "Número do indice obtido por SNMP",
"name_value": "Nome da interface"
}
]
}
Obtendo interfaces via SNMP
Para obter os dados de interface automaticamente acesse o painel de administração exemplo http://ip:5000/login clique no botão [Obter dados SNMP]
Aguarde até que o arquivo interfaces.json
seja atualizado. Ele será sobrescrito caso tenham sido feitas alterações antes da atualização. Recomenda-se fazer uma cópia de segurança antes de proceder com a atualização.
Erro ao obter dados SNMP
Se não for possível estabelecer conexão, será criado um exemplo para a origem do fluxo.
Os OIDs consultados para opter os dados são:
Número de indice
1.3.6.1.2.1.2.2.1.2
nome da interface1.3.6.1.2.1.31.1.1.1.18
Você pode utilizar ferramentas como snmpwalk para verificar se consegue estabelecer conexão, nmap para verificar se a porta SNMP/UDP esta aberta.
Criando manualmente
É possível você criar seu próprio arquivo de interfaces, porém você ira necessitar do snmpwalk para obter os indices, exemplo do comando snmpwalk -v2c -c public 10.250.250.1 IF-MIB::ifIndex
Exemplo
{
"Border": [
{
"desc_value": "OPERADORA A",
"indice": "42",
"name_value": "40GE0/1/49.1234"
},
{
"desc_value": "OPERADORA B",
"indice": "43",
"name_value": "40GE0/1/49.2345"
}
],
"Cgnat": [
{
"desc_value": "BORDA",
"indice": "1",
"name_value": "sfp-sfpplus1"
},
],
}
interfaces.json
Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.
📄 peers.json
Obtem a lista de Peers BGP. Também é gerado automaticamente ao iniciar caso não exista. Necessário estabelecer conexão SNMP a partir dos dados presentes em source_path. Pode ser editado para adequação às suas necessidades.
Extrutura
{
"NOME DO FLUXO": [
{
"asn": "NUM AS",
"ip_peer": "ENDERECO IP DO PEER REMOTO",
"name": "DESCRIÇÃO PARA SESSÃO"
},
]
}
Obtendo Peer via SNMP
Através do painel de administração, clique no botão [Obter dados SNMP] e, em seguida, [Obter dados de peers]. É fundamental ressaltar que essa ação sempre substituirá o arquivo existente.
Suporte
Até o momento é possivel obter os peer apensar de Huawei e Cisco. No entanto, você pode criar manualmente este arquivo com facilidade.
Criando manualmente
É possível você criar seu próprio arquivo de interfaces, porém você ira necessitar do snmpwalk para obter os indices, exemplo do comando snmpwalk -v2c -c public 10.250.250.1 IF-MIB::ifIndex
Exemplo
{
"Border": [
{
"asn": "15169",
"ip_peer": "187.16.216.55",
"name": "GOOGLE"
},
{
"asn": "65530",
"ip_peer": "10.50.50.1",
"name": "Cgnat"
}
],
"Cgnat": [
{
"asn": "65530",
"ip_peer": "10.50.50.2",
"name": "iBGP Borda"
},
{
"asn": "65530",
"ip_peer": "10.50.50.6",
"name": "iBGP BNG"
}
]
}
Erro ao obter dados SNMP
Se não for possível estabelecer conexão, será criado um exemplo para a origem do fluxo.
Os OIDs consultados para obter os dados são:
OID PEER HUAWEI
IP : 1.3.6.1.4.1.2011.5.25.177.1.1.2.1.4.0
AS : 1.3.6.1.4.1.2011.5.25.177.1.1.2.1.2.0
OID PEER CISCO
IP : 1.3.6.1.2.1.15.3.1.7
AS : 1.3.6.1.2.1.15.3.1.9
Você pode utilizar ferramentas como snmpwalk para verificar se consegue estabelecer conexão, nmap para verificar se a porta SNMP/UDP esta aberta.
peers.json
Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.