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.