SDN-IPS: Uma Ferramenta para Contenção de Ataques Cibernéticos Baseada em SDN
SDN-IPS é uma ferramenta que agrega a visibilidade dos Sistemas de Detecção de Intrusos com a programabilidade do paradigma SDN, a fim de criar uma solução que permita realizar a contenção de ataques cibernéticos através de estratégias de bloqueio, restrição de banda ou isolamento em quarentena, de forma automatizada e colaborativa.
API REST
Nesta página serão documentadas as chamadas à API REST do SDN-IPS, agrupadas por módulo da ferramenta. Para mais informações sobre o SDN-IPS, veja a página da ferramenta.
Gestão da topologia (Topology Manager)
- Listar switches ativos na topologia:
-> Chamada:
GET /sdnips/switches
-> Corpo da Requisição:
<vazio>
-> Exemplo:
curl -s http://localhost:8080/sdnips/switches | python -m json.tool
- Listar os links entre os switches (portas de backbone):
-> Chamada:
GET /sdnips/links
-> Corpo da Requisição:
<vazio>
-> Exemplo:
curl -s http://localhost:8080/sdnips/links | python -m json.tool
- Listar as portas de acesso de um switch (possíveis UNI’s – User Network Interfaces):
-> Chamada:
GET /sdnips/switches/{switch-id}/ports
-> Corpo da Requisição:
<vazio>
-> Exemplo:
curl -s http://localhost:8080/sdnips/switches/00000cc47ae3d3d7/ports | python -m json.tool
Gestão de Fluxos (Flow Manager)
- Listar os fluxos instalados em um determinado switch (switch-id):
-> Chamada:
GET /sdnips/flows/{switch-id}
-> Corpo da Requisição:
<vazio>
-> Exemplo:
curl -s http://localhost:8080/sdnips/flows/00000cc47ae3d3d7 | python -m json.tool
Criação de enlaces metro-ethernet (e-Line)
- Criar um enlace metro-ethernet no padrão MEF e-Line:
-> Chamada:
POST /sdnips/e-line/create
-> Corpo da Requisição:
{
"uniA": "<switch1-id>:<port1>",
"uniB": "<switch2-id>:<port2>",
"vlanid": <vlan-id>
}
-> Exemplo:
curl -s -X POST -d '{"uniA" : "00000cc47ae3d3d7:3", "uniB" : "00000cc47ae3d4f8:3", "vlanid": 1601}' http://localhost:8080/sdnips/e-line/create | python -m json.tool
- Remover um enlace metro-ethernet anteriormente criado no padrão MEF e-Line:
-> Chamada:
POST /sdnips/e-line/delete
-> Corpo da Requisição:
{
"uniA": "<switch1-id>:<port1>",
"uniB": "<switch2-id>:<port2>",
"vlanid": <vlan-id>
}
-> Exemplo:
curl -s -X POST -d '{"uniA" : "00000cc47ae3d3d7:3", "uniB" : "00000cc47ae3d4f8:3", "vlanid": 1601}' http://localhost:8080/sdnips/e-line/delete | python -m json.tool
- Listar os enlaces metro-ethernet criados no padrão MEF e-Line:
-> Chamada:
GET /sdnips/e-line/list
-> Corpo da Requisição:
<vazio>
-> Exemplo:
curl -s http://localhost:8080/sdnips/e-line/list | python -m json.tool
Roteamento interdomínio (BGP)
- Configuração da sessão BGP, especificando o ASN e Router-ID da sessão:
-> Chamada:
POST /sdnips/bgp/create
-> Corpo da Requisição:
{
"as_number" : <ASN>,
"router_id" : "<IPv4-Router-ID>"
}
-> Exemplo:
curl -s -X POST -d '{"as_number" : 100, "router_id" : "192.168.1.1"}' http://localhost:8080/sdnips/bgp/create | python -m json.tool
- Anunciar prefixos na sessão BGP:
-> Chamada:
POST /sdnips/bgp/add_prefix
-> Corpo da Requisição:
{
"prefix" : "<IPv4-Address>/<Netmask>",
}
-> Exemplo:
curl -s -X POST -d '{"prefix" : "192.168.100.0/24"}' http://localhost:8080/sdnips/bgp/add_prefix | python -m json.tool
- Adicionar vizinhos BGP:
-> Chamada:
POST /sdnips/bgp/add_neighbor
-> Corpo da Requisição:
{
"remote_as" : <Neighbor-ASN>,
"address" : "<IPv4-Neighbor-Address>"
}
-> Exemplo:
curl -s -X POST -d '{"remote_as" : 666, "address" : "192.168.1.2"}' http://localhost:8080/sdnips/bgp/add_neighbor | python -m json.tool
Espelhamento de tráfego (Traffic Mirror)
- Criar um espelhamento de tráfego pode ser feito para determinados fluxos (veja a função de listagem de fluxos acima) ou para todos os fluxos (all):
-> Chamada:
POST /sdnips/flows/{switch-id}/mirror
-> Corpo da Requisição:
{
"flows" : <flow-desc>,
"to_target" : "<switch-id>:<port>"
}
Nota:
<flow-desc> A especificacao dos flows pode ser "all", para espelhar todos os fluxos de
um switch ou um vetor de fluxos (matches e prioridade) conforme retorno
da funcao de listagem de fluxos.
-> Exemplo 1:
curl -s -X POST -d '{"flows": "all", "to_target": "00000cc47ae36595:3"}' http://localhost:8080/sdnips/flows/00000cc47ae3d4f8/mirror | python -m json.tool
-> Exemplo 2 (todo tráfego da VLAN 1601):
curl -s -X POST -d '{
"flows": [
{
"match" : {
"dl_vlan" : 1601,
"in_port" : 3
},
priority: 65533
},
{
"match" : {
"dl_vlan" : 1601,
"in_port" : 2
},
priority: 65533
}
],
"to_target": "00000cc47ae36595:3"
}' http://localhost:8080/sdnips/flows/00000cc47ae3d4f8/mirror | python -m json.tool
Contenção de ataques (IPS)
- Criação de contenção baseada em bloqueio:
-> Chamada:
POST /sdnips/contention/block
-> Corpo da Requisição:
{
"ipaddr" : "<IPv4-Address>"
}
-> Exemplo:
curl -s -X POST -d '{"ipaddr": "192.168.66.1"}' http://localhost:8080/sdnips/contention/block
- Criação de contenção baseada em quarentena:
-> Chamada:
POST /sdnips/contention/quarantine
-> Corpo da Requisição:
{
"ipaddr" : "<IPv4-Address>",
"redirect_to" : "<IPv4-Address>",
}
-> Exemplo:
curl -s -X POST -d '{"ipaddr": "192.168.100.10", "redirect_to": "192.168.100.200",}' http://localhost:8080/sdnips/contention/quarantine
Contenção Colaborativa (FlowSpec)
- Criação de um vizinho com suporte à address-family de BGP FlowSpec IPv4:
-> Chamada:
POST /sdnips/bgp/add_neighbor
-> Corpo da Requisição:
{
"remote_as" : <Neighbor-ASN>,
"address" : "<IPv4-Neighbor-Address>",
"enable_ipv4fs": "True"
}
-> Exemplo:
curl -s -X POST -d '{"remote_as" : 100, "address" : "10.144.12.56", "enable_ipv4fs": "True"}' http://localhost:8080/sdnips/bgp/add_neighbor | python -m json.tool
- No caso da ação de quarentena via BGP FlowSpec, a especificação do FlowSpec define que o redirecionamento é realizado para uma VRF específica conforme definido pela community BGP requisitada no flow (existe um draft para criação de action flowspec específico para redirecionar para um IP, porém ele ainda não se tornou RFC). Portanto, para viabilizar a quarentena para IP, é preciso primeiro criar uma “VRF” no SDN-IPS e especificar qual o IP do redirecionamento:
-> Chamada:
POST /sdnips/contention/add_vrf
-> Corpo da Requisição:
{
"rtcomm" : "<BGP-Community>",
"nexthop" : "<IPv4-Address>"
}
-> Exemplo:
curl -s -X POST -d '{"rtcomm" : "100:666", "nexthop" : "192.168.100.200"}' http://localhost:8080/sdnips/contention/add_vrf | python -m json.tool