# Сетевая безопасность

← [Раздел](README.md) · [Главная](../README.md)

## Цель

Понять **сетевые границы** в облаке: публичная зона, VPC, security groups, WAF, сегментация и безопасная публикация API.

## Предварительно

- [Секреты и шифрование](sekrety-i-shifrovanie.md)

## Время

**3–5 часов**

---

## Публичный интернет vs private network

| Зона | Кто достучится | Что размещают |
|------|----------------|---------------|
| **Public** | Весь интернет | LB, API Gateway, CDN |
| **Private subnet** | Только из VPC | БД, workers, internal API |
| **Management** | VPN / bastion | Админ-доступ |

**Золотое правило:** PostgreSQL **никогда** с `0.0.0.0/0` в security group.

---

## Типовая топология VPC

```mermaid
flowchart TB
  subgraph internet [Интернет]
    Users[Пользователи]
  end
  subgraph dmz [Public subnet]
    LB[Load Balancer]
    NAT[NAT Gateway]
  end
  subgraph private [Private subnet]
    API[API pods]
    DB[(PostgreSQL)]
    Worker[Workers]
  end
  Users -->|443| LB
  LB -->|internal| API
  API --> DB
  Worker --> DB
  API -->|egress| NAT
  NAT -->|HTTPS| SaaS[External SaaS]
```

---

## Security groups / firewall rules

| Правило | Пример |
|---------|--------|
| Ingress LB | 443 from 0.0.0.0/0 |
| API ← LB | 8080 from LB security group only |
| DB ← API | 5432 from API security group only |
| Deny all default | Закрыто, открываем явно |

**Whitelist**, не blacklist — перечисляете разрешённое.

---

## Load Balancer и TLS termination

| Модель | Плюс |
|--------|------|
| TLS на LB | Централизованные сертификаты (Let's Encrypt / ACM) |
| TLS end-to-end | Шифрование до pod (mTLS внутри) |

Для старта: **TLS на Ingress/LB**, HTTP внутри trusted VPC — приемлемо с политикой; для compliance — end-to-end.

---

## WAF (Web Application Firewall)

Фильтр на границе перед API:

| Защита от | Пример |
|-----------|--------|
| SQL injection | Паттерны в query |
| XSS в query params | Блокировка |
| Bot abuse | Geo block, rate |
| OWASP CRS | Готовые rule sets |

WAF **не заменяет** валидацию в коде — defense in depth.

---

## DDoS и rate limiting

| Уровень | Мера |
|---------|------|
| CDN / edge | Absorb volumetric |
| API Gateway | Rate per IP / API key |
| Application | Token bucket в Redis |
| Infra | Auto-scaling (дорого без лимитов) |

NFR: «max 100 req/min per user» — реализуется на Gateway + Redis.

---

## DNS и сертификаты

| Элемент | Практика |
|---------|----------|
| `api.example.com` | CNAME на LB |
| Сертификат | Auto-renew (cert-manager в K8s) |
| Internal DNS | `db.internal` только в VPC |

Не публикуйте внутренние имена в публичном DNS.

---

## Zero Trust (введение)

«Сеть внутри — не значит доверенная». Каждый вызов **аутентифицируется** (mTLS, JWT), даже pod-to-pod. Service mesh (Istio, Linkerd) — продвинутая тема [раздела 10](../10-deploy/kubernetes-bazovo.md).

---

## Bastion / VPN

Админам — не SSH на все ноды с интернета:

| Подход | Суть |
|--------|------|
| Bastion host | Jump box в public subnet |
| VPN | Корпоративный доступ в VPC |
| SSM Session Manager | Без открытого SSH порта |

---

## Kubernetes networking (намёк)

| Объект | Роль |
|--------|------|
| NetworkPolicy | Ingress/egress между pod |
| Ingress | HTTP(S) маршрутизация |
| Service ClusterIP | Внутренний VIP |

Pod по умолчанию может звонить везде — **закройте** NetworkPolicy для prod.

---

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

- [ ] БД только private  
- [ ] Security groups least privilege  
- [ ] HTTPS + HSTS  
- [ ] WAF или rate limit на публичном API  
- [ ] Нет admin портов в интернет  
- [ ] Egress контролируется (не любой malware тянет данные)  

---

## Практика

1. Нарисуйте VPC с public/private для учебного API + БД.  
2. Таблица: 5 правил firewall (source, dest, port, allow/deny).  
3. Где поставить rate limit: CDN, Gateway или app — аргументируйте.

---

## Самопроверка

1. Зачем NAT Gateway для private subnet?  
2. Чем security group отличается от WAF?  
3. Почему БД в public subnet — критическая ошибка?

---

## Дальше

→ [06 — Масштабирование](../06-masshtabirovanie/README.md)
