Короткий ответ

Матрица открытых портов — таблица, по которой можно проверить периметр: белый IP, proto, порт, куда DNAT (если есть), сервис, зона (WAN/LAN/DMZ/mgmt), кто владелец, заявка, обоснование, срок. Сверяйте с ss/nft/nat print и с nmap своих адресов. Нет строки — порт нелегален, закрывайте. Не держите матрицу в личном чате. Не отключайте firewall ради «честного listen».

WAN 203.0.113.10, LAN 10.0.10.0/24, DMZ 10.0.30.0/24, mgmt 10.0.99.0/24.

Симптомы и как отличить

Аудитор спрашивает, зачем 8291. Ответ «наверное WinBox». NAT есть, в Confluence нет. Три белых, матрица на один. Внутренние порты DC смешаны с WAN в одной простыне без колонки zone.

Отличие от ревизии правил: ревизия — каждое правило filter. Матрица — экспозиция сервисов (listen+allow), меньше строк, понятна бизнесу.

Возможные причины

  1. Документ завели при внедрении и бросили.
  2. Облако/второй шлюз не внесли.
  3. UPnP плодил порты.
  4. IPv6 не включили в таблицу.
  5. Путают «порт слушает на сервере» и «порт открыт с улицы».

Диагностика

Соберите факты, не мнения.

1. Белые IP организации

Договор провайдера, A-записи, ip addr на edge, облачные EIP. Только они — цели скана.

2. Слушатели и NAT

sudo ss -lntup
sudo nft list ruleset
/ip address print
/ip firewall nat print where chain=dstnat
/ip service print

3. Скан с улицы

nmap -Pn -sS -p 21,22,25,53,80,110,143,443,445,993,995,3389,51820,8291 203.0.113.10

Полный -p- своего одного IP — по окну. Результаты приложите к матрице датой.

4. Внутренние зоны

Отдельные вкладки: WAN inbound, LAN services (не все 65k, а то, что разрешено меж VLAN), DMZ, mgmt. Иначе таблица врёт, что 445 «открыт» как периметр.

Решение

Шаблон строки:

ПолеПример
asset_ip203.0.113.10
proto/porttcp/443
directionWAN inbound
dest10.0.30.10
servicenginx contoso.example
ownerИванов, IT-web
ticketINC-441
justificationпубличный сайт
expiresбессрочно / 2026-12-01
last_verified2026-09-08 LTE nmap

Сценарий A. Первичное заполнение

  1. Скан WAN → строки.
  2. NAT → сопоставить dest.
  3. Пустые owner — назначить за 5 рабочих дней или закрыть порт.
  4. Внутренние allow LAN→DMZ — вторая таблица.
  5. Egress серверов — третья, см. egress.

Сценарий B. Расхождение скан vs таблица

Лишний open — закрыть. Лишняя строка без open — поправить документ (или скан не с улицы).

Сценарий C. Хранение

Git/wiki с контролем доступа, не пароли в той же таблице. NAT secrets не нужны. Review PR на изменение порта = тот же процесс, что change FW.

Сценарий D. Автосверка

Скрипт: nmap XML своего IP vs CSV. Алерт на diff. Не авто-закрытие портов скриптом без человека.

Сценарий E. Облако

Security group = те же колонки. Скрин/export SG в ту же матрицу. 0.0.0.0/0:3389 — красный.

Концепция pf: GUI aliases не заменяют матрицу. Выгрузка правил + таблица владельцев.

Как вести матрицу так, чтобы скан её не стыдил

Каждое изменение DNAT/allow WAN начинается с черновика строки матрицы в том же тикете, что и diff nft/RouterOS. После выкладки — LTE nmap своих IP, поле last_verified. Раз в квартал полный проход: реестр белых из договора, короткий TCP-профиль, UDP 53/123/161/500/4500/51820, IPv6 AAAA.

Колонка justification для 3389/445 с WAN не может быть «удобно». Для 443 — FQDN, backend 10.0.30.10, сертификат. Owner — ФИО, не «IT». Срок expires на temp. Файлы nmap XML рядом с ограниченным доступом, не в публичном wiki. Автосверка CSV vs nmap — алерт, закрытие порта человеком. Облачные SG в той же таблице: 0.0.0.0/0 на admin-портах = красный, как dstnat на MikroTik.

Как проверить, что проблема устранена

  1. Для каждого open на своём WAN есть строка.
  2. Для каждой строки WAN есть подтверждающий скан или осознанный filtered.
  3. Owner не «IT общий».
  4. Дата last_verified ≤ 90 дней.
  5. Изменение порта проходит через матрицу до или вместе с правилом, не после года.
  6. IPv6 покрыт или явно «IPv6 нет».

Повтор LTE-скана = отчёт в тикете ревизии.

Не смешивайте в одной строке WAN inbound и east-west: 445 на DC для users — не «открытый порт периметра». Цветовая/поле zone обязательно. Для публикаций укажите SNI/FQDN, чтобы 443 сайта не путали с 443 GUI. Раз в изменение DNS A-записи сверьте, не появился ли новый белый без строки. Матрица без IPv6 при живом AAAA — дыра в процессе, добавьте явную пометку «IPv6 не используется» только после ip -6 addr на edge = пусто.

Версия матрицы: дата, автор, hash nmap. При споре «порт нужен» требуют строку и тикет, не голосование в чате. Пустая justification на WAN admin-порту автоматически эскалируется как инцидент экспозиции, не как «допишем потом».

Колонка last_verified заполняется только после LTE-скана или документированного filtered, не после «глянул WinBox». Если сканер недоступен, дата не рисуется задним числом. Это единственный способ не превратить матрицу в художественный текст.

Если не помогло

  • CDN: скан origin vs скан hostname — две строки.
  • Port knocking/скрытые — всё равно строка.
  • UDP не смотрели — добавьте 53/500/4500/51820.
  • Команда боится Excel — используйте любой табличный git.
  • Владелец уволился — переназначить, не удалять строку молча.

Профилактика

  • Change template: обязательные поля матрицы.
  • Квартальный скан периметра.
  • UPnP off.
  • Новые белые IP сразу в реестр.
  • Связь с CMDB серверов.

FAQ

Нужно ли документировать исходящие 443 пользователей?

Как политика («разрешён интернет 80/443»), не каждый dst. Серверный egress — да, списком.

Порт filtered — в матрицу?

Если ожидаемый deny — можно сводной политикой «все прочие WAN drop», не 65535 строк.

Кто утверждает обоснование?

Владелец сервиса + владелец периметра. Одному админу «так надо» мало для 3389.

Хранить nmap XML?

Да, рядом с датой, доступ ограничен.

Матрица vs диаграмма сети

Оба. Диаграмма без портов не проходит аудит экспозиции.