antiCisco blogs » Blog Archive » ASA. Статья 16. Глубокое инспектирование протоколов на уровне 7

antiCisco blogs


блоги по технологиям и оборудованию cisco от инструкторов

Опубликовано 8 Февраль , 2011

В главе 15 про Advanced Protocol Handling мы познакомились с механизмом манипуляции пакетами MPF. Но эта часть была бы не полной, если не рассказывать про то, что ASA умеет в плане разбора самого протокола. Напомню, что программисты научили ASA понимать массу протоколов. Понимать значит знать внутреннюю структуру, поля, сообщения данного протокола. А значит манипулировать данными 7 уровня, данными самого приложения.

Как же это сделать?
Прежде чем я буду закидывать вас командами, лирическое отступление, притча, которую я сочинил и рассказывал на курсах.
——-
Представьте себе: вы работаете на рудниках. Например, добываете самоцветы на Урале в 18 веке. Ваши руки сильны и мозолисты, глаз даже в темноте отличит малахит от змеевика. Вы молоды и влюблены. Она прекрасна и юна и вы хотите преподнести ей в сочельник малахитовую шкатулку ручной работы. Но вы не умеете точить малахит. Вы даже не можете с уверенностью сказать, подойдет ли вот этот кусок малахита для шкатулки? А может там трещина, или еще какой изъян? Но на ваше счастье в деревне близ рудника живет и творит МалахитовыйМастер. Вам нужно лишь собрать в мешок весь малахит и принести Мастеру. Сам он стар и никуда не выходит, так что поиск — ваша задача. Из вашего мешка Мастер отберет нужное, а мусор выкинет. И родится чудо рукотворное — подарок суженой неземной красоты…
——

Дочитали? теперь параллели: вы — это policy-map обычный. Вы можете отобрать в класс только внешним признакам. По заголовку 4 уровня. Мастер — policy-map type inspect {PROTOCOL}, т.е. специальный, заточенный на работу конкретно с этим протоколом. Он сам пакеты не ищет ему в мастерскую пакеты приносит обычный policy-map.

Теперь чуть подробнее:
Подобно обычной, описанной в MPF конструкции

class-map -> policy-map -> service-policy

есть аналогичная конструкция, но только специфичная для конкретного протокола

class-map type inspect {PROTO} -> policy-map type inspect {PROTO}

своей service-policy type inspect нет, потому что спецполитика применяется как дополнительный фильтр при включении обычного инспектирования в обычной policy-map

class-map type inspect ?
configure mode commands/options:
  dns   Configure a class-map of type DNS
  ftp   Configure a class-map of type FTP
  h323  Configure a class-map of type H323
  http  Configure a class-map of type HTTP
  im    Configure a class-map of type IM
  rtsp  Configure a class-map of type RTSP
  sip   Configure a class-map of type SIP...

здесь можно увидеть те протоколы, для которых ASA имеет спецклассы. Не все протоколы, которые ASA умеет разбирать глубоко, удостоились такой чести. Но об этом позже.

Понятно, что атрибуты у протокола http разительно отличаются от ftp или dns. Описывать здесь все атрибуты всех протоколов я не буду: будет понятна логика — можно будет подобрать нужные параметры

policy-map type inspect ?
configure mode commands/options:
  dcerpc             Configure a policy-map of type DCERPC
  dns                Configure a policy-map of type DNS
  esmtp              Configure a policy-map of type ESMTP
  ftp                Configure a policy-map of type FTP
  gtp                Configure a policy-map of type GTP
  h323               Configure a policy-map of type H.323
  http               Configure a policy-map of type HTTP
  im                 Configure a policy-map of type IM
  ip-options         Configure a policy-map of type IP-OPTIONS
  ipsec-pass-thru    Configure a policy-map of type IPSEC-PASS-THRU
  mgcp               Configure a policy-map of type MGCP
  netbios            Configure a policy-map of type NETBIOS
  radius-accounting  Configure a policy-map of type Radius Accounting
  rtsp               Configure a policy-map of type RTSP
  sip                Configure a policy-map of type SIP
  skinny             Configure a policy-map of type Skinny

Здесь можно увидеть все протоколы, для которых есть свой «МалахитовыйМастер». Как видите, их больше, чем спецклассов. Это связано с тем, что у части протоколов нужно контролировать всего 1-2 параметра и их можно описать непосредственно в спецполитике командой

parameters

Эти параметры тоже свои для каждого протокола. Например:

policy-map type inspect ipsec-pass-thru TEST
parameters
?
MPF policy-map parameter configuration commands:
  ah    Specify parameters for AH tunnel
  esp   Specify parameters for esp tunnel
  exit  Exit from MPF policy-map parameter configuration submode
  help  Help for MPF policy-map parameter submode commands
  no    Negate or set default values of a command
  quit  Exit from MPF policy-map parameter configuration submode

Создав спецполитику мы должны ее применить. Напомню, что сама по себе она не может быть применена, т.к оперирует уже «очищенными» от заголовков пакетами приложений. А на вход ей пакеты поставляет обычная политика командой

inspect {PROTO} [{ИМЯ спецполитики}]

Давайте на примере разберем создание и применение спецполитики. Пусть мы хотим запретить удалять файл .htaccess с ftp сервера 172.16.1.100.
Для этого нам надо подготовить шаблон текстовый, который мы будем искать

regex HTACCESS “\.[Hh][Tt][Aa][Cc][Cc][Ee][Ss][Ss]”
=============================================================================
Для справки: ASA использует вот такой язык регулярных выражений

Character

Description

Notes

.

Dot

Matches any single
character. For example, d.g matches dog,
dag, dtg, and any word that contains those
characters, such as doggonnit.

(exp)

Subexpression

A subexpression
segregates characters from surrounding characters, so that you can use other metacharacters on the subexpression.

 For example, d(o|a)g matches dog and dag, but do|ag matches do and ag.
A subexpression can also be used with repeat
quantifiers to differentiate the characters meant for repetition. For
example, ab(xy){3}z
matches abxyxyxyz.

|

Alternation

Matches either expression
it separates. For example, dog|cat matches
dog or cat.

?

Question mark

A quantifier that
indicates that there are 0 or 1 of the previous expression. For example, lo?se matches lse or lose.

Note: You must enter Ctrl+V
and then the question mark or else the help function is invoked.

*

Asterisk

A quantifier that
indicates that there are 0, 1 or any number of the previous expression. For
example, lo*se matches lse, lose, loose, and
so forth.

{x}

Repeat quantifier

Repeat exactly x times.
For example, ab(xy){3}z
matches abxyxyxyz.

{x,}

Minimum repeat quantifier

Repeat at least x times.
For example, ab(xy){2,}z
matches abxyxyz, abxyxyxyz,
and so forth.

[abc]

Character class

Matches any character in
the brackets. For example, [abc] matches a,
b, or c.

[^abc]

Negated character class

Matches a single
character that is not contained within the brackets. For example, [^abc] matches any character other than a, b, or c. [^A-Z]
matches any single character that is not an uppercase letter.

[a-c]

Character range class

Matches any character in
the range. [a-z] matches any lowercase letter. You can mix characters
and ranges: [abcq-z] matches a, b, c, q, r,
s, t, u, v, w, x, y, z, and so does [a-cq-z].

The dash (-) character is
literal only if it is the last or the first character within the brackets: [abc-] or [-abc].

""

Quotation marks

Preserves trailing or
leading spaces in the string. For example, " test"
preserves the leading space when it looks for a match.

^

Caret

Specifies the beginning
of a line

\

Escape character

When used with a metacharacter, matches a literal character. For example, \[ matches the left square bracket.

char

Character

When character is not a metacharacter, matches the literal character.

\r

Carriage return

Matches a carriage return
0x0d

\n

Newline

Matches a new line 0x0a

\t

Tab

Matches a tab 0x09

\f

Formfeed

Matches a form feed 0x0c

\xNN

Escaped hexadecimal
number

Matches an ASCII
character that uses a hexadecimal that is exactly two digits

\NNN

Escaped octal number

Matches an ASCII
character as octal that is exactly three digits. For example, the character
040 represents a space.

================Конец справки======================================

Теперь создадим спецкласс, где опишем критерии поиска

class-map type inspect ftp HT
  match filename regex HTACCESS
  match request-command dele

Примечание: если надо искать более одного регулярного выражения в классе, то можно изготовить несколько regex и объединить их в кучку командой:

class-map type regex match-any REGCLASS
  match regex REGEX1
  match regex REGEX2

а потом можно применить такой класс вместо явного указания regex, например в нашем случае

match filename regex class {REGCLASS}

Затем создадим спецполитику

policy-map type inspect ftp FTPDEL
  class HT
    reset [log]

Дальше надо куда-то эту конструкцию применить.

Например,

policy-map global_policy
  class inspection_default
    inspect ftp strict FTPDEL
!
service-policy global_policy global

Однако, как легко убедиться, так мы запретим удалять нужный файл не только с 172.16.1.100, но и вообще с любого ftp сервера. Как же исправить эту ситуацию?

Для этого надо вспомнить, что пакеты на анализ спецполитике поставляет обычная. А следовательно надо описать не дефолтовый класс для инспектирования ftp и применить спецполитику для инспектирования этого, нового класса

access-list FTPSPEC permit tcp any host 172.16.1.100 eq 21
class-map FTPDEL
  match access-list FTPSPEC
policy-map FTPSPEC
  class FTPSPEC
    inspect ftp strict HT

Теперь применим эту новую политику на интерфейс INS

service-policy FTPSPEC interface INS

Важно: часто возникает конфликт, если инспектирование одного и того же протокола включено в политике глобальной, и политике, примененной на интерфейсе. Инспектирование просто перестает работать! Я крайне рекомендую не допускать такой ситуации и отключать инспектирование глобальное. Правда, если инспектирование данного протокола нужно и на других интерфейсах, придётся писать новую политику для них и применять отдельно на каждом интерфейсе.

Пусть в нашем примере нам надо лишь инспектировать ftp на указанный хост и более никуда. Тогда для чистоты отключим в глобальной политике:

policy-map global_policy
  class inspection_default
    no inspect ftp

И на этом наша настройка будет закончена. Сохраниться не забудьте 🙂

Чтобы посмотреть, срабатывает ли ваша политика, достаточно дать команду
show service-policy

где подробно, по всем классам и подклассам будет выведена статистика. В частности, будет показано, сколько пакетов было уничтожено

Для закрепления материала попробуйте заблокировать обращение по http на все сайты, содержащие в своем имени текст “odnoclas”. А также все передачи exe-файлов через http.

Предыдущая статья SNAF <<<

 

Метки: , ,
Опубликовано: Безопасность cisco

 

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

Вы должны войти чтобы прокомментировать.