Arquitetura e funcionamento dos Agentes
No sistema, os agentes são divididos da seguinte forma:
MonitorAgent: Monitora requisições e detecta possíveis ataques;MitigatorAgent: Bloqueia IPs maliciosos;UserAgent: Simula as requisições de um usuário normal;AttackAgent: Simula um ataque DoS na rede;SupervisorAgent: Supervisiona os agentesMonitorAgenteMitigatorAgent, de forma que garanta que sempre estarão funcionais.CreateAttackAgent: Gerencia a criação de novos agentes de ataque sempre que um AttackAgent é derrubado.
MonitorAgent
O agente monitor é responsável pelo monitoramento de todas as requisições enviadas em dada rota por meio de uma interface MonitorGateway que permite que ele possa recebê-las.
Atributos
O agente monitor possui dois atributo: um node, que é a classe Node, que permite que o agente monitor grave e recupere as requisições passadas nos últimos 10 segundos, e uma lista recentRequests, que guarda as últimas 1000 requisições feitas.
Métodos
No método setup(), que precisa ser sobrescrito por todas as classes que possuem extends Agent, ou seja, que são agentes JADE, é instanciado um Node, e o agente monitor é registrado no RequestRouter.
Os comportamentos implementados no setup são:
- Comportamento Cíclico
(CyclicBehaviour)para recebimento do ping doSupervisorAgent. - Comportamento Ticker
(TickerBehaviour)a cada 5 segundos(5000ms), que recupera um snapshot das requisições doNode(HashMapque possui a chave como sendo o IP do usuário e o valor como sendo o total de requisições dos últimos 10 segundos), e verifica se para cada entrada no snapshot existe alguma que, no intervalo de 10 segundos, possui mais de 10 requisições enviadas. Caso possua, envia uma notificação (ACLMessage) para todos osMitigatorAgentno DF (Directory Facilitator) e faz um log no console. - Comportamento Ticker
(TickerBehaviour)a cada 10 segundos (10000ms) para zerar as requisições doNode. - Método
private void notifyMitigator(String ip)que instancia um Comportamento Único (OneShotBehaviour) busca no DF porMitigatorAgent, enviando um pedido para bloqueio do IP especificado. - Método
receiveRequest(String ip), que é a implementação doMonitorGateway, para recebimento das requisições, e adiciona aorecentRequestsoRequestRecordfeito pelo IP, no instante que foi feita a requisição. - Método
getRequestCountsByIp(), que também é implementação doMonitorGatewaypara obter um snapshot das requisições noNode. - Método
getRecentRequests(), que também é implementação doMonitorGatewaypara obter a listarecentRequestsdo agente monitor.
MitigatorAgent
O agente mitigador é responsável pelo bloqueio dos IPs considerados suspeitos pelo MonitorAgent.
Métodos
No método setup(), o mitigador se registra no DF para que possa receber mensagens do agente monitor.
Os comportamentos implementados no setup são:
- Comportamento Cíclico
(CyclicBehaviour)para recebimento de mensagensACLMessage. Nesse comportamento, o agente verifica se oConversationIdda mensagem émitigation-request: se for, ele bloqueia o IP solicitado na mensagem por meio doRequestRouter.blockIp(ip). Se oConversatonIdforping-mitigator, ele irá receber e responder o ping doSupervisorAgent.
UserAgent
O agente usuário serve para simular requisições de usuários comuns na rota.
Métodos
No método setup(), o agente usuário gera um IP falso para si mesmo, por meio da função private String generateUserIp().
Os comportamentos implementados no setup são:
- Comportamento Ticker
(TickerBehaviour)a cada 3 segundos(3000ms), que envia requisições à rota, tendo como readerX-Real-IPpara que possa ser corretamente simulado os IPs randomicamente gerados. - Método
private String generateUserIp()que gera um IP aleatório de 4 partes:"192.168." + part3 (número gerado aleatoriamente) + "." + part4 (Idem part3).
AttackAgent
O agente de ataque serve para simular requisições maliciosas na rota (ataque DoS).
Métodos
No método setup(), o agente de ataque, assim como o UserAgent, gera um IP falso para si mesmo, por meio da função private String generateAttackIp().
Os comportamentos implementados no setup são:
- Comportamento Ticker
(TickerBehaviour)a cada 0.2 segundos(200ms), que envia requisições à rota, tendo como headerX-Real-IPpara que possa ser corretamente simulado os IPs randomicamente gerados. - Método
private String generateAttackIp()que gera um IP aleatório de 4 partes:"10.0." + part3 (número gerado aleatoriamente) + "." + part4 (Idem part3). Esse método é diferente dogenerateUserIppara que, na situação de simulação, não ocorram casos onde sejam instanciados 2 agentes (UserAgenteAttackAgent) com o mesmo IP, mesmo que sejam mínimos.
Há também o método takedown(), que permite que o AttackAgent, ao ser derrubado, envie uma mensagem ao CreateAttackAgent, para que sejam instanciados novos agentes no lugar dele.
SupervisorAgent
O agente supervisor serve para supervisionar os agentes MonitorAgent e MitigatorAgent por meio de pings periódicos.
Atributos
private static final String MONITOR_NAMEque guarda oLocalNamedo agente monitor.private static final String MITIGATOR_NAMEque guarda oLocalNamedo agente mitigador.private boolean monitorAlive, variável booleana do estado de vida do monitor.private boolean mitigatorAlive, variável booleana do estado de vida do mitigador.
Métodos
No método setup(), o agente supervisor implementa os seguintes comportamentos:
- Comportamento Ticker
(TickerBehaviour)a cada 7 segundos(7000ms), que envia umaACLMessagecom o ConversationIdping-monitor, para verificar se o monitor está vivo. - Comportamento Ticker
(TickerBehaviour)a cada 0.5 segundos(500ms)para verificar se houve alguma resposta à mensagem com conteúdopong-monitor. Se houver, setamonitorAlive = true. - Comportamento Ticker
(TickerBehaviour)a cada 10 segundos(10000ms), que envia umaACLMessagecom o ConversationIdping-mitigador, para verificar se o mitigador está vivo. - Comportamento Ticker
(TickerBehaviour)a cada 1 segundo(1000ms), para verificar se houve alguma resposta à mensagem com conteúdopong-mitigador. Se houver, setamitigatorAlive = true. - Comportamento Ticker
(TickerBehaviour)a cada 10 segundos(10000ms)em que, casomonitorAlive = false, ele reinicia oMonitorAgentda plataforma JADE. - Comportamento Ticker
(TickerBehaviour)a cada 10 segundos(10000ms)em que, casomitigatorAlive = false, ele reinicia oMitigatorAgentda plataforma JADE.
CreateAttackAgent
Para fazer a simulação de ataques constantes na rede de forma a testar o sistema multiagente, foi criado um Agente que envia ataques ao servidor.
Atributos
O CreateAttackAgent possui apenas um atributo: um int userName, para contabilizar o número dos agentes ao recriá-los e nomeá-los.
Métodos
No método setup(), o agente implementa os seguintes comportamentos:
- Comportamento Cíclico (CyclicBehaviour), que recebe uma mensagem que o AttackAgent envia ao ser derrubado. Dentro desse comportamento, há o Comportamento Acordador (WakerBehaviour), que inicia após 3 segundos (3000ms), que cria um novo AttackAgent por meio do método public boolean CreateAgent().
- ** Método public boolean CreateAgent(), que tenta criar um novo agente de ataque, com nome ATTACK_{userName}, incrementando o userName a cada iteração.
Classe Node
A classe Node foi feita para facilitar os acessos às requisições pelo MonitorAgent. Ela inclui métodos e atributos que auxiliam na busca das requisições pelo agente monitor.
Atributos
private final Map<String, Integer> requests, que é umHashMapque guarda o IP e o total de requisições feitas pelo usuário.
Métodos
public synchronized void registerRequest(String ip), método para registrar as requisições noHashMap.public synchronized Map<String, Integer> getRequestSnapshot(), método para obter uma snapshot doHashMap.public synchronized void resetRequests(), para limpar as requisições feitas.