AWSMiddleTechnical

Security Group vs NACL — в чём разница?

Security Group — stateful firewall уровня ENI/ресурса, только allow-правила, поддерживает ссылки на другие SG. NACL — stateless firewall уровня подсети, поддерживает как allow, так и deny, правила нумерованы с приоритетом. SG — основной инструмент, NACL — дополнительный слой защиты.

Security Group vs Network ACL (NACL) в AWS VPC

Security Group и NACL — это два независимых уровня сетевой безопасности в VPC. Они работают на разных уровнях и дополняют друг друга.

Security Group (SG)

Security Group — виртуальный firewall, работающий на уровне сетевого интерфейса (ENI) конкретного ресурса: EC2, RDS, Lambda ENI, ELB и др.

  • Привязка: к отдельному ресурсу (ENI), а не к подсети. На один ресурс — до 5 SG, в каждой SG — до 60 inbound и 60 outbound правил.
  • Stateful: если входящий трафик разрешён, ответный исходящий трафик автоматически разрешается (и наоборот).
  • Только разрешающие правила: нет возможности написать явный Deny — всё, что не разрешено, запрещено по умолчанию.
  • Источник: в качестве источника/назначения можно указать другую SG (не только CIDR) — это мощный механизм для разрешения трафика между уровнями приложения.
  • Оценка правил: все правила оцениваются вместе (нет номеров приоритетов) — разрешается если хотя бы одно правило совпадает.

Network ACL (NACL)

NACL — firewall уровня подсети. Применяется ко всему трафику, входящему в подсеть и исходящему из неё.

  • Привязка: к подсети. Одна NACL может быть ассоциирована с несколькими подсетями; у подсети — всегда ровно одна NACL.
  • Stateless: входящие и исходящие правила независимы. Если разрешить входящий TCP 443, нужно явно разрешить исходящий ответный трафик (ephemeral ports 1024–65535).
  • Разрешающие и запрещающие правила: правила нумерованы (1–32766), обрабатываются по возрастанию номера. Первое совпавшее правило применяется. Правило * в конце запрещает всё остальное.
  • Default NACL: разрешает весь трафик. Созданные вручную NACL — запрещают всё по умолчанию.

Сравнение в коде

# Security Group: разрешить входящий HTTPS и SSH
aws ec2 authorize-security-group-ingress \
  --group-id sg-0abc123456789def0 \
  --protocol tcp --port 443 \
  --cidr 0.0.0.0/0

aws ec2 authorize-security-group-ingress \
  --group-id sg-0abc123456789def0 \
  --protocol tcp --port 22 \
  --source-group sg-0bastion123456789  # другая SG как источник

# NACL: добавить правило разрешения и запрета
aws ec2 create-network-acl-entry \
  --network-acl-id acl-0abc123456789def0 \
  --rule-number 100 \
  --protocol tcp \
  --rule-action allow \
  --ingress \
  --cidr-block 0.0.0.0/0 \
  --port-range From=443,To=443

# Явный запрет конкретного IP (только в NACL, не в SG)
aws ec2 create-network-acl-entry \
  --network-acl-id acl-0abc123456789def0 \
  --rule-number 50 \
  --protocol -1 \
  --rule-action deny \
  --ingress \
  --cidr-block 203.0.113.0/24

Когда использовать что

  • Security Group — основной инструмент. Использовать для управления доступом к конкретным ресурсам. Ссылки на другие SG позволяют строить чёткие правила между уровнями (ALB → App SG → DB SG).
  • NACL — дополнительный уровень для блокировки подозрительных IP/CIDR диапазонов на уровне подсети, для реализации Deny-правил (которых нет в SG), для аварийной блокировки атак.

Подводные камни

  • NACL stateless — забыть разрешить ephemeral ports (1024–65535) для исходящих ответных пакетов — классическая ошибка. Клиент подключается с высокого порта, и без исходящего правила на эти порты ответ не пройдёт.
  • Нумерация правил NACL — правило с меньшим номером имеет приоритет. Если добавить allow с номером 200, но deny с номером 100 на тот же CIDR, deny сработает.
  • Изменения NACL применяются мгновенно и влияют на все ресурсы в подсети — в отличие от SG, которые применяются к конкретным ENI.
  • Default NACL разрешает всё — создавая новую подсеть и не меняя NACL, можно ошибочно думать, что есть ограничения. Всегда явно назначайте кастомную NACL.
  • SG не поддерживает Deny — нельзя заблокировать конкретный IP через SG. Для блокировки используйте NACL или WAF.
  • Трафик между инстансами в одной подсети проходит через SG обоих инстансов, но через NACL — только один раз (при входе в подсеть).

Common mistakes

  • Считать SG и NACL одинаковыми firewall.
  • Забывать outbound/ephemeral ports в NACL.
  • Использовать 0.0.0.0/0 там, где нужна ссылка на SG.

What the interviewer is testing

  • Различает scope SG и NACL.
  • Объясняет stateful и stateless поведение.
  • Понимает rule order и allow/deny в NACL.

Sources

Related topics