Как работают security groups и network ACLs?
Кратко о сути
Security Group (SG) — это stateful фаервол уровня экземпляра/интерфейса (ENI). Network ACL (NACL) — stateless фаервол уровня подсети. Оба работают на уровне сети в VPC, но имеют разный принцип работы, область применения и модель правил.
Основные отличия
-
Уровень применения
SG применяется к сетевому интерфейсу (инстансу). NACL применяется к подсети (все инстансы в подсети унаследуют правила NACL). -
Stateful vs stateless
Security Group — stateful: если входящий пакет разрешён, ответ автоматически разрешён (и наоборот) без явного правила для ответа. NACL — stateless: для ответа нужен отдельный обратный правило (и для входа, и для выхода). -
Типы правил
SG — только правила ALLOW (разрешить). Нельзя явно DENY. NACL поддерживает ALLOW и DENY и правила нумеруются; первое совпадение решает. -
Порядок применения
SG смотрит на все правила и применяет их «совокупно» (нет порядка). NACL ищет первое правило по порядку (по номеру) и применяет его. -
Возможность ссылок на объекты
SG позволяет указывать в правилах другие SG (удобно для разрешения трафика между слоями приложения). NACL оперирует только CIDR. -
По умолчанию
В типичной реализации VPC: default SG имеет специфические разрешения (обычно разрешает трафик между участниками той же группы и открыт исходящий), default NACL часто разрешает весь трафик — кастомные NACL обычно более строгие.
Примеры и поведение (пошагово)
-
Подключение SSH к инстансу:
-
Security Group: inbound TCP 22 от 203.0.113.5/32 — достаточно. Ответ клиенту вернётся автоматически (stateful).
-
NACL: если используется кастомный NACL, нужно добавить inbound правило Allow TCP 22 from 203.0.113.5/32 и outbound правило Allow TCP ephemeral-ports to 203.0.113.5/32 (или более общую outbound allow для ответов), потому что NACL stateless и ответный трафик имеет другой порт.
-
Пример правила NACL (порядок важен):
Rule 100 — ALLOW TCP 22 from 203.0.113.5/32
Rule 110 — ALLOW TCP 80 from 0.0.0.0/0
Rule 32767 — DENY ALL
Первое правило, соответствующее пакету, применяется и последующие не проверяются.
Практические рекомендации
-
Используйте SG как основной механизм защиты экземпляров: создавайте SG по слоям (bastion, app, db), указывайте минимальные разрешения и используйте ссылки между SG для внутренних соединений.
-
Используйте NACL как дополнительный, подсетевой слой: для ограничений на уровне CIDR (чёрные списки, защита от широкомасштабных атак) или для быстрых блокировок IP-диапазонов. Не усложняйте NACL лишними правилами — они сложнее в управлении.
-
Для stateless NACL всегда добавляйте зеркальные правила для возвратного трафика (или широкие правила для диапазонов ephemeral-портов), чтобы не ломать соединения.
-
Не полагайтесь только на NACL для внутренней сегментации — SG удобнее и безопаснее для этого.
-
Для отладки: проверьте, к какому SG привязан ENI, к какой подсети и какой NACL ассоциирован с подсетью; проверьте таблицу маршрутов/IGW/NAT; используйте VPC Flow Logs и tcpdump/ss на инстансе; тестируйте соединение nc/curl.
Типичные ошибки и ловушки
-
Ожидание stateful-поведения от NACL — забывают добавить обратные правила → соединения падают.
-
Неправильный порядок правил в NACL — специфичные правила стоят ниже общего DENY.
-
Смешение логики (слишком много правил в NACL вместо использования SG) — ухудшает управляемость.
-
Отсутствие ограничения исходящего трафика в SG (по умолчанию многие SG разрешают весь исходящий трафик) — это риск утечек/компрометации.
Как выбирать
-
Для тонкой, роле-ориентированной политики — Security Groups.
-
Для сетевой фильтрации на подписи CIDR/массовых списков/защиты на уровне подсети — NACLs.