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 agentesMonitorAgent
eMitigatorAgent
, 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
(HashMap
que 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 osMitigatorAgent
no 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 aorecentRequests
oRequestRecord
feito pelo IP, no instante que foi feita a requisição. - Método
getRequestCountsByIp()
, que também é implementação doMonitorGateway
para obter um snapshot das requisições noNode
. - Método
getRecentRequests()
, que também é implementação doMonitorGateway
para obter a listarecentRequests
do 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 oConversationId
da mensagem émitigation-request
: se for, ele bloqueia o IP solicitado na mensagem por meio doRequestRouter.blockIp(ip)
. Se oConversatonId
forping-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-IP
para 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-IP
para 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 dogenerateUserIp
para que, na situação de simulação, não ocorram casos onde sejam instanciados 2 agentes (UserAgent
eAttackAgent
) 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_NAME
que guarda oLocalName
do agente monitor.private static final String MITIGATOR_NAME
que guarda oLocalName
do 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 umaACLMessage
com 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 umaACLMessage
com 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 oMonitorAgent
da plataforma JADE. - Comportamento Ticker
(TickerBehaviour)
a cada 10 segundos(10000ms)
em que, casomitigatorAlive = false
, ele reinicia oMitigatorAgent
da 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 é umHashMap
que 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.