Предыстория

Мы против умолчательного открытия доступов из неопределенных источников, поэтому если кто-то получает новую сеть либо сервер, ему придется открыть все необходимые сетевые доступы, по умолчанию обычно никакие сетевые доступы не выдаются для создаваемых сетей. В первые же дни работы я понял, что не смогу достаточно быстро и корректно согласовывать десятки заявок в день вида:

Пример заявки произвольного вида
Пример заявки произвольного вида

Поэтому я поменял все что можно и теперь 17% доступов в среднем согласовывает бот, все заявки на сетевой доступ проходят этап согласования с безопасностью, а сами заявки на сетевой доступ выглядят так:

Пример заявки на открытие сетевого доступа
Пример заявки на открытие сетевого доступа

Вот как подобный доступ был бы согласован:

Пример работы бота
Пример работы бота

Бот

Если не человек выполняет согласование, значит согласование выполняет программа.

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

Так как какие же правила можно написать для бота?

Политика сетевой безопасности

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

Давайте рассмотрим пример нескольких положений такой политики сетевой безопасности:

Разрешенные межсервисные взаимодействия (вырезка из политики сетевой безопасности)
Разрешенные межсервисные взаимодействия (вырезка из политики сетевой безопасности)

Неправда ли неплохо? Мне кажется достаточно красивый способ написания политики сетевой безопасности. На картинке прямоугольник это граница VLAN.

Давайте рассмотрим несколько стрелок на изображении выше:

  • доступ (1) из DMZ в DMZ другого VLAN (другой информационной системы) разрешен так как стрелка нарисована;

  • доступ из DMZ в DB запрещен так как стрелка не нарисована;

  • доступ из DMZ в APP разрешен так как стрелка нарисована;

  • доступ (3) из APP в DB разрешен так как есть стрелка;

  • доступ между APP и DMZ разрешен по любым портам так как есть стрелка;

  • доступ из DB в DMZ запрещен так как стрелки нет;

  • доступ из DB в APP запрещен так как стрелки нет;

  • доступ (2) от пользователей к DMZ и APP серверам разрешен так как стрелка нарисована.

Теперь любой архитектор ПО, системный аналитик, прикладной администратор, системный администратор и другие знают как разрабатывать информационные системы в плане разрешенных сетевых взаимодействий.

Сетевой доступ

Напомним как выглядит правило на межсетевом экране уровня сети:

Источник (SRC_IP)

Получатель (DST_IP)

Порт

Транспортный протокол

Поскольку в источнике может быть объект состоящий из нескольких IP адресов, поэтому дадим нашим пользователям возможность открывать сетевые доступы как от точечного IP адреса либо сети, так и от группы в которой может быть любой набор IP адресов либо сетей. Ну и получателям может быть аналогичный набор параметров. Получаем таблицу которую необходимо видеть в согласованиях:

SRC_IP

SRC_GRP

DST_IP

DST_GRP

Порт

Протокол

Дополним сетевой доступ другими техническим полями и получим следующее:

Пример сетевого доступа
Пример сетевого доступа

Можно кликнуть на IP, на сеть и посмотреть связные доступы и другие параметры. Пример клика на IP:

Пример карточки IP адреса
Пример карточки IP адреса

Реестр информационных систем

Компания должна вести реестр информационных активов, ИТ-активов, бизнес активов. В данном случае примем что информационная система о которой шла речь ранее и является бизнес активом. Соответственно информационные системы должны иметь набор ролей, одна из ролей должна отвечать за согласование сетевых доступов.

Таким образом, наш бот при согласовании сетевых доступов сможет ориентироваться дополнительно при согласовании и на наименования информационной системы. Здесь хочется отметить что если делаем исключение из сетевой политики, то его можно применить только для конкретной информационной системы.

Также каждый доступ мы автоматически сможем согласовывать с ответственными тех систем, IP адреса которых фигурируют в сетевых доступах, это важно - никто не получит сетевой доступ к твоему серверу если ты этого не желаешь, и наоборот - никто не откроет доступ с твоего сервера в неизвестном тебе направлении.

Реестр сетей

Компания должна вести реестр сетей и соответствие каждой сети конкретной информационной системе. Про реестр я уже упоминал в статье ранее. То есть не должно быть так, что существует сеть и она не принадлежит никому явно, что за нее никто не отвечает, а доступы, в которых фигурируют ее IP адреса, никто не согласовывает.

Правила бота

На основе выше изложенного мы можем формировать правила автоматического согласования сетевых доступов на основе следующего:

  1. IP адреса;

  2. группы IP адресов;

  3. система;

  4. порт;

  5. протокол;

  6. действие: согласовать доступ, отклонить.

При написании правил воспользуемся форматом YAML и опишем для примера следующие (выделенные ранее цифрами 1,2,3) разрешенные сетевые доступы из политики сетевой безопасности.

Правило номер 1 (разрешен доступ из DMZ любой системы в DMZ любой другой системы):

PROM_allow:
    comment: Разрешено в чужую DMZ по HTTPS по TCP
    src:
      purpose:
        zones:
          - PROM_DMZ # с сервера из любой DMZ сети любой системы
    dst:
      purpose:
        zones:
          - PROM_DMZ # можно к серверу в любой DMZ сети любой системы
    ports: [443]     # по порту 443
    protocols: [TCP] # транспорт TCP
    action: [allow]  # согласовать доступ

Правило номер: 2 (разрешено пользователям системы обращаться к серверам своей системы):

USERS_allow:
    comment: Согласовывать доступ своим пользователям
    src:
      purpose:
        zones:
          - USERS # из сетей помеченных как пользовательские
    dst:
      purpose:
        zones:
          - DMZ
					- APP
    ports: [any]  # по всем портам
    busines: same # вот этот параметр и отвечает за самое интересное:
                  # доступ разрешен только в свои DMZ сети
    protocols: [TCP]
    action: [allow]

Как вы понимаете любой доступ пользователей своей системы будет согласован к серверам своей системы так как указан порт "any", соответственно мы должны анализировать журнал согласованных доступов на предмет злоупотреблений.

Правило номер 3 (разрешен доступ в сегмент баз данных своей системы по портам SQL-net):

DB_allow:
    comment: Разрешено в свою DB по SQL-net
    src:
      purpose:
        zones:
          - APP # с сервера из любой APP сети
    dst:
      purpose:
        zones:
          - DB  # можно к серверу в любой DMZ сети
    business: same          # только со своего же сервера
    ports: [1520-1525,5432] # только стандартные доступы к базе данных
    protocols: [TCP]        # транспорт TCP
    action: [allow]         # согласовать доступ

А теперь давайте напишем защитное правило запрещающее опасные доступы:

 DB_BLOCK:
    comment: Доступ из DB запрещен куда-либо
    src:
      purpose:
        zones: [DB] # из сегмента баз данных
    dst:
      purpose:
        groups: [APP,DMZ] # в сегменты приложений и демилитаризованную зону
    ports: [any]
    protocols: [any]
    action: [deny] # действие: отклонить доступ при согласовании

Возвращаясь к первой заявке с которой началась статья получается такое правило:

ANY_to_KMS_allow:
    comment: Разрешено до сервера активации лицензий KMS Microsoft
    src:
      purpose:
        zones: [any] # конечно же реализована защита что any
    dst:						 # это внутренние сети, а не внешние
      purpose:
        hosts: [192.168.2.111]
    ports: [1688] # Разрешаем только порты KMS
    protocols: [TCP]
    action: [allow]

Приоритет правил

Естественно как правила межсетевого экранирования применяются к сетевым пакетам в последовательном порядке так и правила согласования этих правил писать необходимо в определенном порядке:

По умолчанию разрешающие правила (VIP правила разрешающие), например:

ANY_to_SIEM_0.3:
    comment: Разрешено из ANY до серверов безопасников для журналирования по Syslog для целей SOC
    src:
      purpose:
        zones: [any]
    dst:
      purpose:
        hosts: [192.168.3.33]
    ports: [514] # порт syslog
    protocols: [UDP/TCP] #TCP на случай если строка лога большая
    action: [allow]

По умолчанию запрещающие правила (100% запрещающие), например:

DB_Block:
    comment: Запрещено из базы в интернет напрямую
    src:
      purpose:
        zones:
          - DB
    dst:
      purpose:
        zones: INTERNET # кастомная своя зона
    ports: [any]        # запрещено по всем портам
    protocols: [any] 		# запрещено по всем протоколам
    action: [deny]      # от слова совсем

Остальные разрешающие правила в перемешку с запрещающими, например, те что рассмотрены выше в предыдущем разделе статьи.

Согласовать нельзя досогласовать

Начиная отклонять доступы неизбежно наткнетесь на следующие недовольства:

  1. безопасник надеется на бота, теперь совсем не заходит в систему согласования и не смотрит новые согласования;

  2. доступ отклонили, но инициатор уговорил безопасника согласовать доступ в качестве исключения, однако, согласовать придется по маршруту заново с ответственными за систему заново и только потом с безопасником системы;

  3. другие.

Мы начали делать так: если 80% доступов в согласовании бот сопоставил с разрешающим правилом, то 80% доступов согласовываем, а остальные либо неизвестные либо запрещенные отклоняет. Естественно было недовольство из разряда "доступ нормальный, но вы его отклонили, почему?".

Тогда мы решили и переработали систему следующим образом:

  1. все доступы, что попали под разрешающие правила - мы согласовываем;

  2. все доступы, что попали под запрещающие правила - мы отклоняем;

  3. все доступы, что не попали ни под одно правило - переносим их в новое согласование, но уже на тот же этап согласования с безопасником, то есть отдаются на ручное согласование.

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

Статистика

Статистика согласования доступов
Статистика согласования доступов

Как видно успехи всего лишь ~ 17% из-за того, что бот поддерживает обработку только правил межсетевого экрана уровня сети и правил на прокси-сервере, а правила NAT, правила на межсетевого экрана уровня сети, правила наполнения групп не поддерживаются. Есть к чему стремиться, но при этом все сетевые доступы попадают в поле безопасника.

Комментарии (9)


  1. allexx
    11.08.2021 13:10
    +2

    Из вахтера человека перешли к боту-вахтеру, а что если подумать о реальных причинах напиливания дыр и дальнейшей проблемы управления большим числом записей и о каком-то удобным для пользователя способе организации связности с общими сервисами (как у вас в пример KMS)? Подглядеть как делают взрослые https://cloud.google.com/vpc/docs/configure-private-service-connect-apis#supported-apis или https://docs.microsoft.com/en-us/azure/virtual-network/virtual-network-service-endpoints-overview

    Ведь по сути цель таких вот правил не создать записи вида IP->IP Port->Port Proto->Proto, а получать связность с каким-то сервисом (как у вас в примере Windows KMS)?

    К слову, промежуточной вехой в развитии у вас точно будут какие-то глобальные (универсальные) правила открывающие на все сети самые популярных/всегде нужные сервисов (ведь не может быть что у вас нет общих "shared" сервисов?)


    1. Protos Автор
      11.08.2021 15:04
      -2

      То есть должно быть что я как пользователь в интерфейсе выбирают сервис из списка доступных? Мы шли иным путем, идеи свернуть в эту сторону есть. Но суть сетевых доступов у нас как раз в том, что сетевой админ получает четко сформулированное правило которое ему просто нужно перенести на межсетевой экран. С автоматизацией переноса сетевых доступов у нас пока туго. Возможно то о чем вы пишете будет через год-два.


      1. allexx
        11.08.2021 15:42

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

        касаемо подхода, как сама автоматизация это конечно хорошее лучшего, которое решает, экономит время сетевого администратора.

        Моя реальность видимо более динамичная и скажем так разнообразная и тот же пользователь подсети порой не знает как сформулировать правило или группу правил чтобы открыть доступ. Яркий пример это сервис в автомасштабируемом кластере, который хочет доступ к другому сервису в такой же сложной конфигурации кластера и как результат - сложное расследование почему иногда где-то что-то не соединяется, потом дописывание правил. А ещё когда владелец второго сервиса расширяет свою подсеть новым блоком, он рискует сделать для клиентов работающий сервис после этого частично доступным.

        … а еще есть угроза исчерпания квоты записей в firewall сервисе.

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


        1. Protos Автор
          11.08.2021 17:59

          Просто у вас инфраструктура в IaaS и там действительно все уже есть и все по кнопке как я понимаю.


  1. ky0
    11.08.2021 13:24
    +1

    Если согласование и прорубание новых доступов занимает у ответственных сотрудников столько времени, что автоматизация даёт ощутимую пользу - имхо, что-то пошло не так в плане архитектуры сети.


    1. Protos Автор
      20.08.2021 11:25

      У нас такая сетевая политика: кто-то указал твой IP в сетевом доступе, будь добр поучаствуй в согласовании. Ну а я как безопасник рассматриваю все доступы на последнем этапе, мало ли что там открывают - жесткий "текущий контроль" исполнения политики сетевой безопасности и регламента внесения изменений в правила межсетевого экрана. И да у нас сотни информационных систем.


    1. Protos Автор
      20.08.2021 11:27

      По срокам как раз нормально в части согласования с безопасником - 1 день максимум если по доступу нет вопросов при ручном согласовании, но бот его не смог согласовать, и минуты если бот смог обработать доступ.


  1. Willy64
    11.08.2021 17:36

    Расскажите, пожалуйста, с каких пор слово "доступ" имеет множественное число? Из какого жаргона это пришло?


    1. ky0
      11.08.2021 18:26

      Плюс-минус с момента появления, наверное - а что, есть противоречащие этому факты?