воскресенье, 3 августа 2014 г.

ASA. Статья 14. Modular Policy Framework (MPF)

С 7 версии ОС у ASA наконец появилась хоть какая-то возможность управлять потоками пакетов. Т.е. появились зачатки QoS. В версии 8.0 эти возможности весьма расширили.
На ASA эту технологию, видимо, чтобы запутать админов, называют не так, как на маршрутизаторах. Там она называется MQC (Modular QoS CLI), а на asa — MPF. Однако, идея похожая: надо определить классы трафика при помощи команды class-map, затем создать политику (policy-map), где для различным классам сопоставить различные действия для качества обслуживания (например, ограничить полосу до явно указанной), или другие сложные действия (например, поменять параметры в ТСР заголовке или отправить на модуль AIP-SSM). И последним шагом надо применить созданную политику при помощи команды service-policy к интерфейсу либо глобально. Вот давайте с этими тремя шагами поподробнее познакомимся.
Классы трафика.
Как было упомянуто выше, для начала надо раскидать пакеты по классам. Помните, что все, что не указано явно, попадет в class-default.
Создаем класс:
Asa(config)# class-map [ИМЯ_КЛАССА]
Сопоставляем классу трафик
Asa(config-cmap)# match ?
mpf-class-map mode commands/options:
  access-list                 Match an Access List
  any                         Match any packet
  default-inspection-traffic  Match default inspection traffic:
                              ctiqbe----tcp--2748      dns-------udp--53
                              ftp-------tcp--21        gtp-------udp--2123,3386
                              h323-h225-tcp--1720      h323-ras--udp--1718-1719
                              http------tcp--80        icmp------icmp
                              ils-------tcp--389       mgcp------udp--2427,2727
                              netbios---udp--137-138   radius-acct---udp--1646
                              rpc-------udp--111       rsh-------tcp--514
                              rtsp------tcp--554       sip-------tcp--5060
                              sip-------udp--5060      skinny----tcp--2000
                              smtp------tcp--25        sqlnet----tcp--1521
                              tftp------udp--69        waas------tcp--1-65535
                              xdmcp-----udp--177
  dscp                        Match IP DSCP (DiffServ CodePoints)
  flow                        Flow based Policy
  port                        Match TCP/UDP port(s)
  precedence                  Match IP precedence
  rtp                         Match RTP port numbers
  tunnel-group                Match a Tunnel Group
Как видите, пакеты в класс можно определить списком доступа, по полю DSCP, по полю precedence, по заголовку RTP, по имени туннельной группы (это очень удобно для выделения , скажем, потока по IPSec к конкретному соседу). Также есть возможность разделить весь трафик по адресам назначения
Asa (config-cmap)# match flow ip destination-address
И по портам назначения
Asa (config-cmap)# match port tcp eq 80,443
И совсем загадочная строчка default-inspection-traffic. Это ключевое слово означает «весь трафик, который asa умеет обрабатывать глубоко», т.е. залезая уже в тело пакета и разыскивая элементы, характерные для конкретного протокола.
Обычно спрашивают, можно ли добавить в этот default-inspection-traffic какой-нибудь еще протокол? Ответ – нет. Только с изменением версии ОС количество и версии исследуемых протоколов могут меняться. Следующий типичный вопрос: это чтож, получается что asa будет напрягаться по поводу всех протоколов, даже если это нам не надо? Ответ – нет. Список протоколов, по которому будет производиться глубокий анализ, вы зададите в политике.
Примечание: название class-map можно поменять вручную. Командой rename, которая доступна из режима(config-cmap). Например, если частично настройка производилась через графическую оболочку и имена классов были выбраны самой asa. В этом случае они длинные и сложночитаемые.
Как правило, на asa уже создан один класс. Он называется inspection_default. Он создавался автоматически при переходе из 6 в 7 ОС. В этот класс попадают как раз все протоколы, которые asa умеет инспектировать глубоко.
Политика.
Для указания действия для классов трафика, необходимо создать политику.
Asa(config)# policy-map [POLICY_NAME]
Далее,указываем, для какого класса задавать действия:
Asa(config-pmap)# class [CLASS_NAME]
Asa(config-pmap-c)# ?
MPF policy-map class configuration commands:
  csc             Content Security and Control service module
  exit            Exit from MPF class action configuration mode
  help            Help for MPF policy-map class/match submode commands
  inspect         Protocol inspection services
  ips             Intrusion prevention services
  no              Negate or set default values of a command
  police          Rate limit traffic for this class
  priority        Strict scheduling priority for this class
  quit            Exit from MPF class action configuration mode
  service-policy  Configure QoS Service Policy
  set             Set connection values
  shape           Traffic Shaping
С точки зрения качества обслуживания наблюдаем весьма широкий набор:
Asa(config-pmap-c)# police {input/output} {SPEED} [BURST][conform-action] [exceed-action]
Т.е. мы может отдельно описать полосу пропускания на вход и выход, явно указав размер всплеска (burst) в байтах, действие при нормальных условиях и действие при превышении порога. Впрочем, можно ограничиться лишь скоростью. В этом случае всплеск будет выбран минимальным для указанной скорости.
Asa(config-pmap-c)# priority
Здесь все просто: просто приоритет. И все :) Если в классе есть пакет – наш ему приоритет!
asa(config-pmap-c)# shape average {SPEED} [{BPI}]
SPEED – скорость в битах в секунду, кратная 8000
BPI – bits per interval, количество бит, которые необходимо для нужной скорости отправить за раз. Кратно 128 битам. Однако, циска сама не рекомендует явно задавать этот параметр. Мол, алгоритм
сам разберется :)
Также можно делать вложенные политики при помощи указания команды service-policy, например, для того, чтобы трафик, направленный через IPSec к определенному соседу, внутри шифрованного канала имел определенную структуру. К примеру, приоритетно пропускал голос.
Примечание: в версиях ОС до 8.0 не было возможности делать сглаживание (shape) и применять вложенные политики.
Что у нас есть еще. Отправка трафика на модули антивируса или IPS.
asa(config-pmap-c)# ips {inline|promicsous} {fail-open|fail-close}
отправляем пакеты на ips либо в режиме inline, и тогда модуль может сам принять решение об уничтожении пакета. Режим удобен тем, что модуль активно влияет на проходящий трафик. Плох этот режим тем, что модуль может вносить дополнительную задержку, особенно при его предельной загрузке. Режим promiscous означает, что модуль получит лишь копию пакета и сможет лишь детектировать атаку (такой режим еще называют IDS – Intrusion Detection System). Но этот режим не вносит задержек и не влияет на трафик.
Fail-open означает, что если модуль по каким-то причинам не отвечает (сломался) – трафик пойдет без анализа
Fail-close означает, что если модуль неисправен, то пакеты этого класса не пройдут сквозь asa. Как правило, ставят fail-open. Fail-close – для безопасников-маньяков.
asa(config-pmap-c)# csc {fail-open|fail-close}
Важно: пакеты для модулей перехватываются в обе стороны. Т.е. вся сессия попадет под пристальный взор модуля.
Еще одна возможность воздействовать на проходящий трафик – заставить изменять параметры пакетов при помощи команды set

Asa(config-pmap-c)# set connection ?
mpf-policy-map-class mode commands/options:
   advanced-options Configure advanced connection parameters
   conn-max Keyword to set the maximum number of all
     simultaneous connections that are allowed. Default
     is 0 which means unlimited connections.
   decrement-ttl Decrement Time to Live field
   embryonic-conn-max Keyword to set the maximum number of TCP embryonic
     connections that are allowed. Default is 0 which
     means unlimited connections.
   per-client-embryonic-max Keyword to set the maximum number of TCP embryonic
     connections that are allowed per client machine.
     Default is 0 which means unlimited connections.
   per-client-max Keyword to set the maximum number of all
     simultaneous connections that are allowed per
     client machine. Default is 0 which means unlimited
     connections.
   random-sequence-number Enable/disable TCP sequence number randomization.
     Default is to enable TCP sequence number
     randomization
   timeout Configure connection timeout parameters
При помощи этого параметра можно указать максимальное количество открытых, полуоткрытых (ТСР) сессий на весь класс или поадресно. Также, можно указать размер таймаута для сессий данного класса, включить или выключить (по умолчанию для всех ТСР сессий включено) рандомизацию начальных номеров (initial sequence number).
Отдельно хочу отметить слово decrement-ttl. Возможно, вы уже отмечали, что в команде tracert (traceroute) asa себя не показывает. Происходит это оттого, что по умолчанию asa не уменьшает размер TTL для проходящих пакетов. А значит и traceroute «проскочит» мимо.
Если хочется, чтобы все работало привычно, можно явно приказать asa уменьшать TTL как раз при помощи этой команды. Например, только для UDP и определенных портов или ICMP пакетов.
Осталось не изученным только слово inspect. Разберем его подробно в следующей статье.
Очень важным является порядок обработки пакетов различными действиями. Так, asa не отслеживает, если один и тот же пакет попадет в разные классы. И для одного класса можно применить несколько действий. В таблице приведена последовательность обработки и направление анализируемого трафика (напомню, что NetFlow появилось только в версии 8.2)
 
Feature
Single Interface
Direction
Global Direction
QoS input policing
Ingress
Ingress
TCP and UDP connection
limits and timeouts, and TCP sequence number randomization
Bidirectional
Ingress
TCP normalization
Bidirectional
Ingress
TCP state bypass
Bidirectional
Ingress
CSC
Bidirectional
Ingress
Application inspection (multiple types)
Bidirectional
Ingress
IPS
Bidirectional
Ingress
NetFlow Secure Event Logging filtering
N/A
Ingress
QoS output policing
Egress
Egress
QoS standard priority queue
Egress
Egress
QoS traffic shaping, hierarchical priority queue
Egress
Egress

Обратите внимание, что политика, примененная на интерфейс, отрабатывает иначе, нежели политика, примененная глобально. Глобально примененная политика никогда не отрабатывает в обе стороны одновременно.
Примечание: название политики тоже можно менять командой rename.
Важно: пакет одной технологией обрабатывается один раз! Т.е. если один и тот же пакет по недосмотру или специально попал в 2 разных класса, и в политике настроено одно и то же действие для этих разных классов, например, police, то пакет будет обработан этим полисером 1 раз с учетом тех настроек, которые попадутся первыми (что в конфиге написано первым).
Как правило, одна политика уже создана по умолчанию. И называется global_policy. В ней применен тот самый, созданный по умолчанию inspection_default класс, для которого включено несколько протоколов для инспектирования.
Применение политики
Осталось малость: применить правила. Для применения на интерфейс используем команду

Asa(config)# service-policy [POLICY_NAME] interface {INT}

При этом согласно таблице, часть правил будет работать на вход, часть на выход, а часть – в обе стороны.
Можно применить политику глобально:

Asa(config)# service-policy [POLICY_NAME] global
По умолчанию, политика global_policy уже применена глобально
Важно: бывает так, что политика, примененная глобально, конфликтует с политикой, примененной на интерфейс, хотя вроде как примененная на интерфейс имеет приоритет. Поэтому мой вам совет: старайтесь избегать одинаковых действий в политиках, примененных одновременно. Например, если в политике на интерфейсе включено инспектирование протокола FTP, выключите инспектирование, которое по умолчанию в глобальной политике включено. Иначе может быть конфликт (очень часто бывает так, что инспектирование FTP перестает работать вовсе)

Источник: anticisco.ru/blogs/2010/09/asa-статья-14-modular-policy-framework-mpf/

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

Отправить комментарий