В главе 15 про Advanced Protocol Handling мы познакомились с механизмом манипуляции пакетами MPF. Но эта часть была бы не полной, если не рассказывать про то, что ASA умеет в плане разбора самого протокола. Напомню, что программисты научили ASA понимать массу протоколов. Понимать значит знать внутреннюю структуру, поля, сообщения данного протокола. А значит манипулировать данными 7 уровня, данными самого приложения.
Как же это сделать?
Прежде чем я буду закидывать вас командами, лирическое отступление, притча, которую я сочинил и рассказывал на курсах.
——-
Представьте себе: вы работаете на рудниках. Например, добываете самоцветы на Урале в 18 веке. Ваши руки сильны и мозолисты, глаз даже в темноте отличит малахит от змеевика. Вы молоды и влюблены. Она прекрасна и юна и вы хотите преподнести ей в сочельник малахитовую шкатулку ручной работы. Но вы не умеете точить малахит. Вы даже не можете с уверенностью сказать, подойдет ли вот этот кусок малахита для шкатулки? А может там трещина, или еще какой изъян? Но на ваше счастье в деревне близ рудника живет и творит МалахитовыйМастер. Вам нужно лишь собрать в мешок весь малахит и принести Мастеру. Сам он стар и никуда не выходит, так что поиск — ваша задача. Из вашего мешка Мастер отберет нужное, а мусор выкинет. И родится чудо рукотворное — подарок суженой неземной красоты…
——
Дочитали? теперь параллели: вы — это policy-map обычный. Вы можете отобрать в класс только внешним признакам. По заголовку 4 уровня. Мастер — policy-map type inspect {PROTOCOL}, т.е. специальный, заточенный на работу конкретно с этим протоколом. Он сам пакеты не ищет ему в мастерскую пакеты приносит обычный policy-map.
Прежде чем я буду закидывать вас командами, лирическое отступление, притча, которую я сочинил и рассказывал на курсах.
——-
Представьте себе: вы работаете на рудниках. Например, добываете самоцветы на Урале в 18 веке. Ваши руки сильны и мозолисты, глаз даже в темноте отличит малахит от змеевика. Вы молоды и влюблены. Она прекрасна и юна и вы хотите преподнести ей в сочельник малахитовую шкатулку ручной работы. Но вы не умеете точить малахит. Вы даже не можете с уверенностью сказать, подойдет ли вот этот кусок малахита для шкатулки? А может там трещина, или еще какой изъян? Но на ваше счастье в деревне близ рудника живет и творит МалахитовыйМастер. Вам нужно лишь собрать в мешок весь малахит и принести Мастеру. Сам он стар и никуда не выходит, так что поиск — ваша задача. Из вашего мешка Мастер отберет нужное, а мусор выкинет. И родится чудо рукотворное — подарок суженой неземной красоты…
——
Дочитали? теперь параллели: вы — это policy-map обычный. Вы можете отобрать в класс только внешним признакам. По заголовку 4 уровня. Мастер — policy-map type inspect {PROTOCOL}, т.е. специальный, заточенный на работу конкретно с этим протоколом. Он сам пакеты не ищет ему в мастерскую пакеты приносит обычный policy-map.
Теперь чуть подробнее:
Подобно обычной, описанной в MPF конструкции
Подобно обычной, описанной в 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.gmatches 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 othermetacharacters on thesubexpression.
For example, d(o|a)gmatches dog and dag, butdo|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 matcheslse 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 ametacharacter, matches a literal character. For example,\[ matches the left square bracket.
|
char
|
Character
|
When character is not ametacharacter, 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.
Источник: anticisco.ru/blogs/2011/02/asa-статья-16-глубокое-инспектирование-пр/
Комментариев нет:
Отправить комментарий