Со временем обрывки знаний и умений становится все труднее удержать в голове. Они расползаются по уголкам памяти заполняя все свободное место. Извлекать необходимое на свет становится все сложнее. Этот блог - рабочая записная книжка.

Wednesday, January 23, 2008

Много-в-одном

Среди множества возможностей устройств PIX/ASA есть довольно интересные. Одна из таких - разделение одного физического firewall на несколько виртуальных. Количество, собственно, зависит от приобретенной лицензии. Т.е. прямой зависимости между мощностью железяки и количеством виртуальных firewall нет. Конечно есть табличка в которой примерно обозначены рекомендуемые нагрузки для каждой модели из серии, но всё же это больше зависит от количества денег.
Допустимое количество контекстов можно увидеть с помощью команды show version.

0. Официальная документация
http://www.cisco.com/en/US/docs/security/asa/asa80/configuration/guide/contexts.html

1. А зачем?
В терминологии Cisco виртуальные firewall называются контекстами. В дальнейшем будем использовать именно эту терминологию. Режимы работы называются соответственно одноконтекстный и мультиконтекстный. Посмотреть текущий режим можно командой showmode. В режиме поддержки виртуальных firewall не поддерживаются некоторые возможности:
- динамические протоколы маршрутизации;
- виртуальные частные сети;
- мультикаст рутинг;
- обнаружение угроз (сканирование портов, TCP SYN flood, прочие).

Как видно многие приятные и удобные функциональные возможности становятся недоступными в мультиконтекстном режиме. Что же заставляет пользователей выбирать этот режим работы? Сама компания Cisco Отвечает на это вопрос следующим образом видит такие сферы применения:
- сервисный провайдер который предлагает дополнительные услуги своим клиентам. Вплоть до отдачи управления виртуальным firewall;
- большое предприятие либо студенческий кампус, желающий разделять трафик различных подразделений;
- большое предприятие использующее различные политики безопасности для разных департаментов.

2. Что внутри?
Переходим от маркетинга к практике. Контексты бывают трех видов:
- системный
Системное пространство в котором создаются виртуальные контексты и задаются их параметры. Здесь же настраиваются ассоциации интерфейсов с пользовательскими контекстами. Не имеет никакой сетевой конфигурации и не может использоваться как обычный контекст. При необходимости доступа к сетевым ресурсам использует административный контекст.
- административный
Полноценный виртуальный firewall, но используется в основном для управления физическим устройствам и остальными контекстами. Может использоваться как обычный контекст, но не рекомендуется его использование как пользовательского поскольку пользователь имеющий права доступа к административному контексту по сути имеет права для доступа к любому другому.
- пользовательский
Собственно то ради чего всё это и затевалось. Полноценный виртуальный firewall с отдельной политикой безопасности и выделенными интерфейсами.
Практически всё что может быть настроено на физическом устройстве в одноконтекстном режиме может быть настроено в данном виртуальном.

Каждый пакет поступающий на интерфейсы физического устройства необходимо классифицировать для определения в какой именно виртуальный firewall его отправить. В случае если интерфейс закреплен только за одним виртуальным firewall это проблем не вызывает. Однако при использовании разделенных интерфейсов возникает дополнительная обработка с своими правилами.
Для определения контекста назначения используется специальный классификатор занимающийся определением. В случае разделенных интерфейсов классификатор зачастую не может однозначно определить пункт назначения, однако предусмотрен ряд "подсказок" помогающий определить где находятся искомые сети.
- уникальные МАС-адреса
Есть возможность назначить одному интерфейсу разные МАС адреса в пределах одного контекста. Также можно использовать команду mac-address auto для автоматического назначения адресов.
- NAT
Может использоваться как конфигурация с nat/global так и обыкновенный static, ожидаемо, что в первом случае входящие соединения будут невозможны.

3. Рассмотрим пример
В качестве примера выбрана типичная конфигурация с общим (разделенным) внешним интерфейсом и уникальными внутренними. Два клиента А и В, у клиента А также присутствуетweb-сервер для которого решено организовать демилитаризованную зону.
Итак существующие интерфейсы:
ethernet 0/0 - admin_outside - 10.10.3.1/26
ethernet 0/0 - outsideA - 10.10.3.129/26
ethernet 0/0 - outsideB - 10.10.3.65/26
ethernet 0/1.11 - dmzA - 10.1.1.1/24
ethernet 0/2.21 - insideA - 10.2.1.1/24
ethernet 0/2.22 - insideB - 10.2.2.1/24


3.1. Внимание! Переключаю!

Первым делом необходимо изменить режим функционирования устройства с помощью команды mode <режим>

ciscoasa(config)# mode multiple
WARNING: This command will change the behavior of the device
WARNING: This command will initiate a Reboot
Proceed with change mode? [confirm]
Convert the system configuration? [confirm]

При переходе в другой режим работы железяка предлагает сконвертировать конфигурацию в новый режим. При этом настройки всех интерфейсов активных в обычном режиме будут перенесены без изменений в административный контекст. Т.е. операцию можно проводить удалённо, потери соединения не будет. В данном случае при подготовке к миграции была удалена вся конфигурация кроме конфигурации интерфейса ethernet 0/0 который в дальнейшем будет выполнять роль разделенного outside. После перезагрузки и миграции конфигурации:

$ ssh admin@10.10.3.1
admin@10.10.3.1's password:
Type help or '?' for a list of available commands.
ciscoasa/admin> en
Password:
ciscoasa/admin#

Первым визуальным признаком работы в мультиконтекстном режиме является измененный вид приглашения, кроме hostname отображается название текущего контекста. Также режим работы можно просмотреть с помощью команды show mode:

ciscoasa/admin# sh mode
Security context mode: multiple

3.2. Системный контекст

Для перехода между контекстами используется команда changeto context <имя контекста>. Как упоминалось раньше создание сабинтерфейсов и ассоциация их с виртуальными firewall выполняется из системного контекста. Переходим в него и создаем интерфейсы описанные выше.

ciscoasa/admin# changeto system
ciscoasa# conf t

ciscoasa(config)# interface ethernet 0/1.11
ciscoasa(config-subif)# vlan 11
ciscoasa(config-subif)# description DMZ for customer A
ciscoasa(config-subif)# no sh

ciscoasa(config-subif)# exit
ciscoasa(config)# interface ethernet 0/2.21
ciscoasa(config-subif)# vlan 21

ciscoasa(config-subif)# description inside for customer A
ciscoasa(config-subif)# no sh

ciscoasa(config-subif)# exit
ciscoasa(config)# interface ethernet 0/2.22
ciscoasa(config-subif)# vlan 22
ciscoasa(config-subif)# description inside for customer B
ciscoasa(config-subif)# no sh

ciscoasa(config-subif)# exit


Переходим к активной фазе - создаем контексты и ассоциируем их с виртуальными устройствами.
Команды выполняются из системного контекста.

//Создадим контексты
ciscoasa(config)# context CustA
Creating context 'CustA'... Done. (2)

ciscoasa(config-ctx)# context CustB
Creating context 'CustB'... Done. (3)

// Необходимо указать где хранить конфигурацию контекста. Для этого служит команда config-url. Параметры достаточно разнообразны - tftp, http, прочие.
// В данном случае будем хранить конфигурацию на flash. При указании конфига firewall пытается его загрузить. Если не находит пытается создать.
ciscoasa(config-ctx)# config-url flash:/CustA.cfg
INFO: Converting flash:/CustA.cfg to disk0:/CustA.cfg
WARNING: Could not fetch the URL disk0:/CustA.cfg
INFO: Creating context with default config

ciscoasa(config-ctx)# config-url flash:/CustB.cfg
INFO: Converting flash:/CustB.cfg to disk0:/CustB.cfg
WARNING: Could not fetch the URL disk0:/CustB.cfg
INFO: Creating context with default config


// Следующий шаг - ассоциация созданных интерфейсов. Необходима команда - allocate-interface <физический интерфейс> <виртуальное имя>.
// Дополнительным параметром invisible/visible можно указать будет ли физическое имя интерфейса видно из виртуального контекста.
// Например, в данном случае нет никакого желания, чтобы пользователь видел номер его vlan. Значение по-умолчанию invisible.

ciscoasa(config)# context CustA
ciscoasa(config-ctx)# allocate-interface Ethernet0/0 outside
ciscoasa(config-ctx)# allocate-interface Ethernet0/1.11 dmzA
ciscoasa(config-ctx)# allocate-interface Ethernet0/2.21 insideA
ciscoasa(config-ctx)# exit
ciscoasa(config)# context CustB
ciscoasa(config-ctx)# allocate-interface Ethernet0/0 outside
ciscoasa(config-ctx)# allocate-interface Ethernet0/2.22 insideB
ciscoasa(config-ctx)# exit


Проверить текущую конфигурацию можно командой show context. В данном случае видно какие контексты созданы и какие интерфейсы им выделены.

ciscoasa# sh context
Context Name Class Interfaces URL
*admin default Ethernet0/0 disk0:/admin.cfg
CustA default Ethernet0/0,Ethernet0/1.11, disk0:/CustA.cfg
Ethernet0/2.21
CustB default Ethernet0/0,Ethernet0/2.22 disk0:/CustB.cfg

Total active Security Contexts: 3

3.3. Конфигурация виртуальных контекстов

Настройка сетевой конфигурации в контексте CustA.

ciscoasa/CustA# conf t
ciscoasa/CustA(config)# int outside
ciscoasa/CustA(config-if)# nameif outside
INFO: Security level for "outside" set to 0 by default.
ciscoasa/CustA(config-if)# ip address 10.10.3.2 255.255.255.0
ciscoasa/CustA(config-if)# no sh
ciscoasa/CustA(config-if)# exit
ciscoasa/CustA(config)# int insideA
ciscoasa/CustA(config-if)# security-level 100
ciscoasa/CustA(config-if)# nameif insideA
ciscoasa/CustA(config-if)# ip addre 10.2.1.1 255.255.255.0
ciscoasa/CustA(config-if)# no sh
ciscoasa/CustA(config-if)# exit
ciscoasa/CustA(config)# int dmzA
ciscoasa/CustA(config-if)# nameif dmzA
ciscoasa/CustA(config-if)# security-level 50
ciscoasa/CustA(config-if)# ip addre 10.1.1.1 255.255.255.0
ciscoasa/CustA(config-if)# no sh
ciscoasa/CustA(config-if)# exit

// При такой конфигурации работать ничего не будет. Необходимо перейти в системный контекст и настроить уникальные адреса
ciscoasa(config)# mac-address auto

// Исходящий трафик благополучно уходит. Подобного же эффекта можно добится с помощью команд NAT в контексте CustA.
ciscoasa/CustA# conf t
ciscoasa/CustA(config)# global (outside) 1 interface
ciscoasa/CustA(config)# nat (dmzA) 1 10.1.1.0 255.255.255.0
ciscoasa/CustA(config)# nat (insideA) 1 10.2.1.0 255.255.255.0

// Для почтового сервера находящегося в dmzA необходимо установить статическую трансляцию
static (dmzA,outside) 10.10.3.130 10.1.1.2 netmask 255.255.255.255

// Если в dmz находятся хосты с реальными адресами на интерфейсах можно поступить следующим образом.
ciscoasa/CustA(config)# static (dmzA,outside) 100.100.100.0 100.100.100.0 netmask 255.255.255.0

3.4. "Вам не положено!". Кратко и лимитах.

Для каждого виртуального контекста есть возможность задавать лимиты различного типа. Например ограничение на количество сессий ssh или ASDM.
Также интересным вариантом может быть ограничение на количество осуществленных трансляций, соединений внутренних хостов. Указывать можно в абсолютных величинах либо в процентном отношении.
Конфигурируется это достаточно просто.
// Для начала надо создать класс обслуживания.
ciscoasa(config)# class bronze

// Введем некоторые ограничения. Например не более двух сессий ssh.
ciscoasa(config-class)# limit-resource ssH 2

// Применим к определенному контексту
ciscoasa(config)# context CustA
ciscoasa(config-ctx)# member bronze

4 comments:

Домовёнок Кузя said...

Всегда ли администратор логинится в admin context по умолчанию, или же это поведение можно изменить? Например, при логине заходить в system?

Спасибо!

pablo said...

Системный контекст не знает что такое сеть. Прямой доступ можно получить только к тем контекстам которые знают - административный или пользовательский.

Домовёнок Кузя said...

Понятно, спасибо.

Ещё маленький вопрос: можно ли настроить для каждого контекста свой ipaddress, чтобы при подключении по этому адресу попадать в нужный контекст, как в отдельный firewall?

pablo said...

Конечно. Я больше скажу - нужно. :)