воскресенье, 21 мая 2017 г.

Cisco ASA Firewall - Алгоритм перезаливки списка доступа (ACL) с использование команды clear

    Когда требуется внести какие-либо правки в список контроля доступа (ACL), можно это сделать множеством способов: используем CLI, ASDM, CSM. Все перечисленные инструменты могут выполнить одинаковые действия, выбор остается за оператором. Но если в список необходимо внести много правок, например, для того, чтобы провести ревизию, переименовать группы, что-то заменить или удалить, то редактирование списков непосредственно на устройстве может представлять из себя довольно муторное занятие. В таком случае лично я предпочитаю использовать блокнот, в который я мог бы скопировать текущий список доступа, отредактировать его целиком и полностью так, как мне нужно, а после этого залить его назад на устройство, предварительно удалив предыдущую версию ACL.
   У такого подхода есть плюсы и минусы. Плюсы очевидны:
  • Можно заняться редактированием независимо от устройства, не занимая сессию;
  • Редактирование и поиск элементов в блокноте явно быстрее, чем непосредственно на устройстве;
  • Можно легко удалять, добавлять элементы, следя за синтаксисом.
   Минусы:
  • Необходимо внимательно следить за синтаксисом, чтобы при заливке не возникли ошибки где-нибудь в середине списка доступа, после чего необходимо было бы повторять процедуру. Хотя этот пункт - не самое страшное. Страшно другое...
  • Данный способ необходимо использовать с осторожностью, поскольку если конфигурация такова, что список контроля доступа в том числе разрешает доступ оператору для настройки устройства, то при перезаливке оператор просто напросто "отвалится", потеряв доступ к устройству. Поэтому этим методом рекомендуется пользоваться в случае наличия внеполосного управления (Out-of-Band, OOB), например, через отдельную сеть на интерфейсе Management.
   Поэтому прежде, чем начать, убедитесь, что не возникнет проблем с доступностью устройства. Будем считать, что я всех предупредил. Поехали.
   Для тестовых целей создаем список доступа, который бы разрешал внутренним пользователям идти к каким-либо внешним пользователям по портам UDP. Содержимое списка доступа смысла не имеет, важен сам алгоритм. Также предположим, что мы весьма педантичны и хотим, чтобы в конфигурации все было красиво и понятно. Поэтому мы, во-первых, на каждый адрес, сеть или группу портов создаем объекты с описанием того, что это за порты и адреса, а, во-вторых, создаем группы портов или объектов в соответствии с принятой у нас в организации логикой. Ниже представлен такой тестовый список контроля доступа с комментариями, что и зачем.
object network Inside_User //Внутренний ресурс
 host 10.25.11.1
 description Customer
!
object network VIP_1 // Внешний ресурс 1
 host 10.10.10.1
 description VIP number One
!
object network VIP_2 //Внешний ресурс 2
 host 10.10.11.1
 description VIP number One
!
object-group service VIP_S_1 udp  //Требуемые сервисы
 description UDP VIP number One ports
 port-object eq 123
 port-object eq 666
!
object-group network FROM_CUSTOMER //Группируем внутренние ресурсы
 description From Customer Side
 network-object object Inside_User
!
object-group network TO_VIPs //Группируем внешние ресурсы
 description To VIPs number one
 network-object object VIP_1
 network-object object VIP_2
! 
access-list ISP_IN remark __Traffic from Customer to VIPs number one on UDP port services
access-list ISP_IN extended permit udp object-group FROM_CUSTOMER object-group TO_VIPs object-group VIP_S_1 
access-list ISP_IN remark __denying and logging all other traffic
access-list ISP_IN extended deny ip any any log warnings
!
access-group ISP_IN out interf ISP //Применяем список на интерфейсе ISP
   Заливаем этот список доступа на Cisco ASA. Но в процессе заливки мы: а) случайно кликнули в консоли правой кнопкой мыши, поэтому дважды скопировали содержимое буфера в консоль, т.е. дважды залили указанную выше конфигурацию на устройство и б) нам показалось, что последние два правила ACL не залились должным образом, поэтому мы скопировали еще раз последние две строки ACL.
   Что произошло в итоге?  Блок, в котором описаны объекты, не пострадал, т.к. софт ASA распознал дублирование объектов. Поэтому за объекты переживать не нужно. А вот со списками доступа произошла неприятность. Функциональные строки не продублировались, т.к. ASA этого не допускает, а вот каждая ремарка воспринимается как уникальная, поэтому все ремарки были добавлены в конец списка доступа. В итоге в конфиге мы видим такую картину:

access-list ISP_IN remark __Traffic from Customer to VIPs number one on UDP port services
access-list ISP_IN extended permit udp object-group FROM_CUSTOMER object-group TO_VIPs object-group VIP_SERVICES_1 
access-list ISP_IN remark __denying and logging all other traffic
access-list ISP_IN extended deny ip any any log warnings
!
//Все, что выше данного комментария - наш список доступа, который нужен.
//Все, что ниже - необходимо удалить.
!
access-list ISP_IN remark __Traffic from Customer to VIPs number one on UDP port services
access-list ISP_IN remark __denying and logging all other traffic
access-list ISP_IN remark __denying and logging all other traffic 
   В целом не сложно удалить лишние комментарии к строкам списка доступа. Но! Если поставить перед любым таким комментарием no, то удалится первое вхождение комментария в список доступа. Т.е. не тот, который нам не нужен. Поэтому удалять комментарии придется с использование номера строки, который можно узнать, выполнив команду show access-list <название нужного списка>:

ASAshka(config)# sh access-list ISP_IN
access-list ISP_IN; 5 elements; name hash: 0x28b1a89
access-list ISP_IN line 1 remark __Traffic from Customer to VIPs number one on UDP port services
access-list ISP_IN line 2 extended permit udp object-group FROM_CUSTOMER object-group TO_VIPs object-group VIP_SERVICES_1 (hitcnt=0) 0xcfb644f5 
  access-list ISP_IN line 2 extended permit udp host 10.25.11.1 host 10.10.10.1 eq ntp (hitcnt=0) 0x58700c20 
  access-list ISP_IN line 2 extended permit udp host 10.25.11.1 host 10.10.10.1 eq 666 (hitcnt=0) 0xcf0e525d 
  access-list ISP_IN line 2 extended permit udp host 10.25.11.1 host 10.10.11.1 eq ntp (hitcnt=0) 0x4d78df62 
  access-list ISP_IN line 2 extended permit udp host 10.25.11.1 host 10.10.11.1 eq 666 (hitcnt=0) 0x81aeb480 
access-list ISP_IN line 3 remark __denying and logging all other traffic
access-list ISP_IN line 4 extended deny ip any any log warnings interval 300 (hitcnt=0) 0xcacc9f6b 
access-list ISP_IN line 5 remark __Traffic from Customer to VIPs number one on UDP port services
access-list ISP_IN line 6 remark __denying and logging all other traffic
access-list ISP_IN line 7 remark __denying and logging all other traffic
ASAshka(config)# 
   Теперь начинаем удалять, помня, что с каждым удалением все строки ниже удаленной уменьшают номер строки на единицу. И в целом все достаточно просто, пока список состоит из 4 строк. Теперь представьте, каково редактировать подобным методом список доступа из 20 строк. А из 50?
   Вместо этого можно сделать следующее:
   1)   Для начала копируем весь конфиг в буфер, после чего скидываем в блокнот и сохраняем для бэкапа;
   2)   Копируем интересующую нас часть - список доступа с указанными выше проблемами;
   3)   Редактируем список так, чтобы не оставалось никаких хвостов;
   4)   В блокноте перед списком доступа ставим команду clear configure access-list <название списка доступа, в данном случае ISP_IN>
   5)   В конце отредактированного списка доступа добавляем команду access-group ISP_IN out interface ISP, т.к. наш список доступа будет удален ранее командой clear, соответственно, удалится и назначение списка нужному интерфейсу в нужном направлении.
   В итоге получаем вот такую конструкцию:

clear config access-list ISP_IN
! 
access-list ISP_IN remark __Traffic from Customer to VIPs number one on UDP port services
access-list ISP_IN extended permit udp object-group FROM_CUSTOMER object-group TO_VIPs object-group VIP_SERVICES_1 
access-list ISP_IN remark __denying and logging all other traffic
access-list ISP_IN extended deny ip any any log warnings
!
access-group ISP_IN out interf ISP 
   Необходимо помнить, что состав команд будет зависеть от того, что именно в списке меняется. Если удаляются ремарки - вид такой, как показано выше. если изменяются сами правила, то необходимо сначала добавить объекты и группы объектов, на которым впоследствии будет ссылаться правило листа. Их так же можно отредактировать в блокноте, после чего вставить перед списком доступа для последующей заливки. Т.е. последовательность действий такая же, как и при настройке в CLI вручную шаг за шагом.
   6)   Перед заливкой в консоль желательно выставить скорость  отправки команд. В разных программах-терминалах это выставляется по-разному. Например, в SecureCRT - Options>Session options>Terminal>Emulation>Advanced>Send Delay options:Line send delay - выставить чуть больше, чем стандартное значение 5 мс. Зачем это нужно - в случае отправки в консоль большого количества строк может произойти ошибка, при которой строки наложатся друг на друга, в итоге не будут приняты ОС. Такое случается редко, и строк должно быть действительно много.
   7)   Копируем из блокнота полученное в пункте 5, вставляем в терминал.
   8)   Проверяем, что все в порядке, что старый лист удалился, новый имеет требуемый вид, лист применился к интерфейсу.
   9)   Сохраняем конфиг командой write.

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

BONUS: если в конфиге много объектов, которые не нужны и не входят в группы объектов, а так же много групп объектов, которые не используются нигде в списках контроля доступа, в правилах NAT, и вам нужно удалить и группы, и объекты, можно использовать команду clear config object-group и clear config object. Первая удалит все неиспользуемые группы объектов. Вторая удалит все неиспользуемый (не входящие в группы) объекты. При этом будет выдано предупреждение с перечнем групп и объектов, которые не могут быть удалены по причине использования:

ASAshka(config)# clear config object-group 
Removing object-group (VIP_SERVICES_1) not allowed, it is being used.
Removing object-group (FROM_CUSTOMER) not allowed, it is being used.
Removing object-group (TO_VIPs) not allowed, it is being used.
!
ASAshka(config)# clear config object 
ERROR: unable to delete object (Inside_User). object is being used. 
ERROR: unable to delete object (VIP_1). object is being used. 
ERROR: unable to delete object (VIP_2). object is being used.
   Особенно актуально для любителей насоздавать тестовых групп с последующим забыванием про них и необходимостью ревизии и чистки конфига.


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

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