Довольно простая глава. Списки доступа (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}
На интерфейсе списки доступа применить можно как на вход, так и на выход интерфейса. Список доступа на вход подобен охраннику ночного клуба, который может не пустить вас внутрь из-за непрезентабельной внешности. А список доступа на выход интерфейса подобен турникетам на выходе из бутика, который начинает истерично пиликать, если почует спрятанные за пазухой гламурные стринги 🙂
access-group {NAME} {in|out} interface {INTERFACE NAME}
Пример:
access-group FROMOUTSIDE in interface outside
Важно: список доступа на интерфейсе в одном направлении может быть только один! И на интерфейс для фильтрации можно применять только расширенные списки доступа
Предыдущая статья SNAF <<< >>> Следующая статья SNAF
Метки: ACL, ASA, SNAF, курс, списки доступа
Опубликовано: Безопасность cisco
после прочтения остался еще 1 вопрос про in и out списки доступа.
в каком случае какие нужно применять? просто я всегда считал, что правильный подход — это резать «плохие пакеты» на входе, и если пакет уже пустил во внутрь файрвола, то выходить запрещать смысла нет.