Как стать автором
Обновить

ASA: списки доступа (продолжение цикла статей про ASA)

Время на прочтение6 мин
Количество просмотров59K
Довольно простая глава. Списки доступа (ACL, Access Control List) – это правила проверки заголовка ip пакета до уровня 4 модели OSI. Списки доступа – это просто конструкции, состоящие из строчек. В каждой строчке – правило разрешить (permit) или запретить (deny). Строчки просматриваются сверху вниз на предмет точного совпадения заголовка пакета со строкой списка доступа. Списки доступа на ASA могут выполнять несколько ролей:

1. Фильтрация на интерфейсе входящего или исходящего трафика
2. Описание правил NAT (Policy NAT)
3. Описание правил редистрибуции маршрутов (в route-map)
4. Критерий попадания в класс трафика для дальнейшей обработки (Modular Policy Framework, MPF)
5. Описание «интересного трафика» для шифрования. Применяется список доступа в crypto map
6. Описание прав удаленного пользователя при подключении через IPSec или SSL VPN
Важно: в конце любого списка доступа стоит невидимое «запретить все» (implicit deny any), поэтому «мимо» списка доступа ни один пакет не пройдет.


Списки доступа делятся на стандартные и расширенные.

Стандартные списки доступа проверяют только адреса источника. На ASA такие списки доступа имеют весьма узкое применение (например, для описания трафика для удаленного VPN пользователя, который необходимо заворачивать в туннель. Технология Split Tunneling)

Формат команды

access-list {NAME} [line #] standard {permit|deny|remark} {NETWORK} {MASK}


Ключевое слово remark используется для вставки комментариев в списки доступа.
параметр line # используется для вставки строки в определенное место списка доступа. Например, если уже существует список доступа и надо вставить между 4 и 5 строкой новую, то достаточно написать

  access-list {NAME} line 5 {новая строка}

все строки строки начиная с 5 сдвинутся на 1 вниз.
Удалить конкретную строку из списка доступа можно, явно написав

  no access-list {NAME} {конкретная строка списка доступа целиком}

написать только номер строки вот так

  no access-list {NAME} line #

нельзя – ASA скажет, что «incomplete command».
Удалить полностью список доступа можно построчно :) Но не очень удобно для больших списков, поэтому есть команда

  clear configure access-list {NAME}

Незнание этой команды сильно портит кровь настройщикам ASA и является весомым аргументом для их язвительных замечаний :)

Важно: команда clear configure довольно мощная и может привести к неприятным последствиям, поскольку убивает из текущей конфигурации все строчки, начинающиеся с ключевых слов, указанных после слов clear configure. Например, можно убить всю текущую конфигурацию командой

  clear configure all

Маска сети в списках доступа на ASA используется прямая (а не wildcard как на маршрутизаторах). Для удобства указания адресов есть ряд сокращений, которые удобно использовать. Так, если необходимо описать «все сети», то вместо громоздкой записи

  0.0.0.0 0.0.0.0

Можно использовать ключевое слово

  any

а вместо описания хоста с маской 32 бита

  1.2.3.4 255.255.255.255

Можно использовать ключевое слово host перед самим адресом

  host 1.2.3.4

Порядок следования строк в списках доступа очень важен, т.к. просмотр идёт сверху вниз и останавливается при первом же совпадении. Поэтому наиболее точные указания надо ставить повыше.
Пример: если мы хотим разрешить трафик на конкретный хост 10.1.1.100, запретить на подсеть 10.1.1.0/24 и разрешить все, кроме этой сети, то писать надо так

  access-list SPLIT remark -=ACL for VPN users=-
  access-list SPLIT permit host 10.1.1.100
  access-list SPLIT deny 10.1.1.0 255.255.255.0
  access-list SPLIT permit any

В этом случае указание хоста – более точно, чем указание сети. А сеть – более точное указание, чем «все адреса».

Формат расширенных списков доступа несколько сложнее, потому что учитывает ещё и протокол, адреса назначения и может также учитывать порты TCP/UDP источника и назначения (в формате команды — одна
строка):

  access-list {NAME} [line#] {permit|deny] {protocol} {source net} {source mask}  [{operator} {port#}] {destination net} {destination mask} [{operator} {port#}]

protocol – протокол стека TCP/IP (ICMP,TCP,UDP,OSPF,IGMP,ESP и т.д.) Если надо указать все IP пакеты, то и писать надо в качестве протокола слово «ip»
operator – буквенная запись математических операторов (eq – равно, gt – больше, lt – меньше, range – диапазон)
port – номер или название TCP или UDP порта.
Пример:
  access-list ANTISPOOF deny ip host 0.0.0.0 any
  access-list ANTISPOOF deny ip host 255.255.255.255 any
  access-list ANTISPOOF permit tcp any host 1.2.3.4 eq 80
  access-list ANTISPOOF permit tcp any host 1.2.3.4 eq https
  access-list ANTISPOOF permit udp any any range 16384 32768
  access-list ANTISPOOF permit icmp any any unreachable

В качестве удобного способа отладки можно использовать ключевое слово log в конце строки списка доступа. Тогда каждый раз, когда по этой строке пройдет совпадение, будет генерироваться syslog сообщение. Можно регулировать частоту генерирования такого сообщения.

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

  deny ip any any log

Также, удобно пользоваться ключевым словом inactive (начиная с версии 8.0) для временного отключения строки списка доступа, не удаляя её совсем.

  access-list  ANTISPOOF permit icmp any any unreachable inactive

Чтобы вновь вернуть эту строку к жизни, надо снова её набрать без слова inactive

Еще полезным дополнением является указание временного диапазона работы строки списка доступа. Для этого используется конструкция time-range

time-range {NAME}
  {absolute|periodic} {время работы}

Например:
time-range WORKTIME
  periodic weekdays 10:00 to 19:00

Далее останется только применить time-range к строке списка доступа

  access-list  {NAME} {строка} time-range {NAME}

Например:
  access-list  ANTISPOOF permit ip any host 198.133.219.25 time-range WORKTIME

Посмотреть полученные списки доступа можно командой

  show run access-list {NAME}

При этом вы увидите строки конфига, которые начинаются со слов access-list {NAME}.
Если же нужно просмотреть список доступа с проставленными номерами строк и с совпадениями по строкам, то лучше использовать команду

  show access-list {NAME}

Важно: в отличие от маршрутизаторов, которые по списку доступа проверяют каждый пакет, ASA проверяет пакет по списку доступа только если записи о сессии нет в кэше сессий (о сессиях читайте в Главе «Обработка пакетов и создание сессии»). Поэтому количество совпадений (hit) для сессионных протоколов (TCP и UDP) скорее означает количество открытых по этой строке сессий.

Совет: я рекомендую всем применять не слишком длинные, но «говорящие» названия списков доступа и писать их большими буквами. Можно даже выработать для себя свои названия для разных случаев и всегда их придерживаться, например список доступа на вход интерфейса backup у меня бы выглядел FROMBACKUP, а для проброса мимо NAT на интерфейсе dmz — NONATDMZ. Часто бывает так, что конфигурацию создают несколько администраторов или часть сделана при помощи Web-интерфейса, который создает свои имена списков (какие же они неудобные!) и тогда в настройках плохочитаемая каша. Можно переименовать список доступа с некрасивым именем, используя команду rename

  access-list {UGLYNAME} rename {PRETTYNAME}


______________
UPD 21.01.2010 00:18
Простите, выпал кусочек

На интерфейсе списки доступа применить можно как на вход, так и на выход интерфейса. Список доступа на вход подобен охраннику ночного клуба, который может не пустить вас внутрь из-за непрезентабельной внешности. А список доступа на выход интерфейса подобен турникетам на выходе из бутика, который начинает истерично пиликать, если почует спрятанные за пазухой гламурные стринги :)

  access-group {NAME} {in|out} interface {INTERFACE NAME}

Пример:

access-group FROMOUTSIDE in interface outside

______________

Объектные группы

Если в вашей сети есть много схожих объектов (например, сетей пользователей, серверов с одинаковым набором сервисов и т.д.), то при настройке списков доступа вы обязательно столкнетесь с тем, что они становятся трудночитаемыми и плохо расширяемыми. Для упрощения написания больших списков доступа на ASA применяются так называемые объектные группы (object group). При помощи них можно группировать схожие элементы сети (протоколы, сети, сервисы, сообщения icmp).

object-group network {NAME}
  network-object host {ip}
  network-object {NET} {MASK}
!
object-group service {NAME} {tcp|udp}
  port-object {operator} {port}
!
object-group protocol {NAME} 
  protocol-object {PROTOCOL}
!
object-group icmp {NAME} 
  icmp-object {icmp type}


Пример:
object-group network SERVERS
  network-object host 192.168.100.100
  network-object host 192.168.100.101
  network-object host 192.168.100.102
!
object-group service WEBTCP tcp
  Port-object eq 80
  Port-object eq 443
  Port-object eq 1494


Сами объектные группы применяются вместо явного указания однотипного элемента в списке доступа. Например, вместо адресов источника или назначения можно применить объектную группу сетевого типа (object-group network), а вместо явного указания сервиса TCP (ssh, http) можно применить группу типа сервис ТСР.

Пример:
 access-list FROMOUTSIDE permit tcp any object-group SERVERS object-group WEBTCP

При этом ASA все равно развернет ваши группы в списках доступа построчно, но при этом все строки списка с объектной группой будут иметь один и тот же номер строки.

  asa# show access-list FROMOUTSIDE
access-list FROMOUTSIDE line 1 permit tcp any object-group SERVERS object-group WEBTCP
access-list FROMOUTSIDE line 1 permit tcp any host 192.168.100.100 eq 80 (hit 5)
access-list FROMOUTSIDE line 1 permit tcp any host 192.168.100.100 eq 443
access-list FROMOUTSIDE line 1 permit tcp any host 192.168.100.100 eq 1494
access-list FROMOUTSIDE line 1 permit tcp any host 192.168.100.101 eq 80 (hit 2)
  <output omitted>

Заметьте, что количество совпадений (hit) будет при этом у каждой строки, а не только общее количество совпадений.
Посмотреть объектные группы можно командой

  show run object-group [{тип}]


Трансляция сетевых адресов (coming soon :))
Теги:
Хабы:
+5
Комментарии7

Публикации