среда, 12 февраля 2014 г.

Защита Control Plane на примере Juniper

Любому сетевому администратору известно, что сетевое оборудование состоит из Control Plane и Data Plane:
  • Control plane отвечает за все "высокоуровневые" операции, такие как управление роутингом с помощью протоколов маршрутизации и помещение собранной таблицы маршрутизации/коммутации в Forwarding Information Base (FIB), ARP, SNMP etc.
  • Data plane - компонент, который занимается непосредственно маршрутизацией/коммутацией пакетов, а также их фильтрацией с помощью Firewall/ACL. Как правило, этот компонент исполнен "в железе", то есть является микросхемой специального назначения, ASIC (Application Specific Integrated Circuit). Запас производительности обработки пакетов ASIC-а огромен по сравнению с обычным CPU.
 Обычно control plane работает на слабом процессоре MIPS или ARM и исчерпать его ресурсы совсем несложно, поэтому если ваша сеть подвергается DDoS-атакам, то рано или поздно атакующему может прийти в голову "уложить" control plane машрутизатора, чтобы лишить связи ресурсы, находящиеся за ним.
Для защиты control plane-а достаточно настроить политику, жестко ограничивающую поступающий на него трафик. Так как фильтрацией трафика занимается data plane, весь лишний трафик будет отбрасываться прежде чем дойдёт до control plane.

После чтения этой статьи получились такие политики для IPv4 и IPv6 трафика.

Используем фичу Juniper, которая позволяет формировать списки IP-адресов прямо из текущей конфигурации:
# show policy-options

prefix-list BGP-neighbors-v4 {
  apply-path "protocols bgp group <*> neighbor <*.*>";
}
prefix-list BGP-neighbors-v6 {
  apply-path "protocols bgp group <*> neighbor <*:*>";
}
prefix-list DNS-servers-v4 {
apply-path "system name-server <*.*>;";
}
prefix-list DNS-servers-v6 {
  apply-path "system name-server <*:*>;";
}

Таким образом, если Вы, например, добавите нового BGP-соседа, его IP-адрес сразу же занесётся в разрешающие правила фаерволла.

Код полисера для ICMP. Мы разрешаем ICMP к маршрутизатору, однако в разумных пределах. Ничего страшного, если при атаке наш роутер перестанет отвечать на пинги:
# show firewall policer icmp-control-plane
if-exceeding {
    bandwidth-limit 512k;
    burst-size-limit 1500;
}
then discard;


Политика доступа по IPv4:
# show firewall family inet filter control-plane-ipv4
term icmp {
    from {
        protocol icmp;
    }
    then policer icmp-control-plane;
}
term management {
    from {
        source-address {

            ## Управляющая сеть, через которую происходит 
            ## управление роутером по SSH,
            ## сбор статистики по SNMP
            10.20.30.0/24;
        }
        port [ snmp snmptrap tftp ftp http https ssh telnet ];
    }
    then accept;
}
term bgp {
    from {
        source-prefix-list {
            BGP-neighbors-v4;
        }
        protocol tcp;

        ## Важно фильтровать трафик по TTL, так как
        ## атакующие могут подставить source address
        ## на адрес вашего BGP-соседа, а вот правильно
        ## угадать исходящий TTL на каждом боте не получится.
        ## TTL обычной сессии BGP всегда равен 1
        ttl 1;
        port 179;
    }
    then accept;
}
term dns {
    from {
        source-prefix-list {
            DNS-servers-v4;
        }
        protocol udp;
        source-port 53;
    }
    then accept;
}
term ospf {
    from {
        protocol ospf;
    }
    then accept;
}
term discard-all {
    then {
        discard;
    }
}

Политика доступа по IPv6:
# show firewall family inet6 filter control-plane-ipv6
term icmp-ND {
    from {

        ## Эти типы ICMP-сообщений используются в IPv6 для
        ## обнаружения соседей. Этакий аналог ARP. Если 
        ## будет атака ICMP-сообщениями, то эти будут проходить
        ## без препятствий и не будут отсечены полисером.
        icmp-type [ neighbor-advertisement neighbor-solicit ];
    }
    then accept;
}
term icmp-general {
    from {
        payload-protocol icmp6;
    }
    then policer icmp-control-plane;
}
term bgp {
    from {
        source-prefix-list {
            BGP-neighbors-v6;
        }
        payload-protocol tcp;

        ## А вот возможности фильтрации по TTL в IPv6 нет :(
        port 179;
    }
    then accept;
}
term dns {
    from {
        source-prefix-list {
            DNS-servers-v6;
        }
        payload-protocol udp;
        source-port 53;
    }
    then accept;
}
term discard-all {
    then discard;
}

Вешаем эти фильтры на специальный интерфейс lo0.0 - именно он отвечает за проходящий в control plane трафик:
# show interfaces lo0 unit 0
family inet {
    filter {
        input control-plane-ipv4;
    }
}
family inet6 {
    filter {
        input control-plane-ipv6;
    }
}

Всё. Этого должно быть достаточно, чтобы защитить control plane от непрошенных гостей.

Комментариев нет: