SDN-IPS: API REST

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