Часть VI: Крупные проекты — архитектура на уровне гигантов
Глава 30

Безопасность на масштабе — как не стать заголовком новостей

Проблема

Проблема: Маленькие стартапы взламывают редко — хакерам неинтересно. Когда ваша система вырастает, вы становитесь целью. DDoS-атаки, утечки данных, supply chain атаки, комплаенс-проверки. Вопрос не в том, «атакуют ли нас?» — атакуют. Вопрос: «выдержим ли мы?»


Представьте, что вы проснулись утром, открыли Twitter (простите, X), а там — ваш сервис в топе трендов. Не потому, что вы запустили крутую фичу. Потому что утекли данные пользователей. 10 миллионов записей. И ваш CTO уже отвечает на вопросы журналистов.

Звучит как кошмар? Это реальность для десятков компаний каждый год.

Безопасность на масштабе — это не про «поставить firewall и забыть». Это про систему решений, которые работают вместе: от того, как вы храните секреты, до того, как реагируете на инцидент в 3 часа ночи.

Эта глава — не учебник по безопасности. Это набор практик, которые реально работают, когда ваша система обслуживает миллионы пользователей.


#Defense in Depth — ваш лук не должен иметь слабых мест

Есть старая шутка: «Как защититься от медведя в лесу? Бегать быстрее, чем твой друг». В безопасности примерно так же. Вы не должны быть «абсолютно неуязвимы» — это невозможно. Вы должны быть менее привлекательной целью, чем сосед.

Концепция Defense in Depth (эшелонированная защита) — это когда у вас не один замок на двери, а несколько уровней. И если хакер прошёл первый, его ждёт второй, третий и чёрт знает какой по счёту.

#Уровни защиты

Level 1: Network & Perimeter

  • Firewall, DDoS protection, Web Application Firewall (WAF)
  • Ограничение доступа по IP, geo-blocking
  • Только нужные порты открыты. Остальное — закрыто.

Level 2: Identity & Access

  • Authentication: кто ты?
  • Authorization: что тебе можно?
  • Least Privilege: минимум прав для работы

Level 3: Application Security

  • Input validation, SQL injection protection
  • Rate limiting, API security
  • OWASP Top 10 — ваш чек-лист (мы к нему ещё вернёмся)

Level 4: Data Security

  • Encryption at rest — данные зашифрованы в базе
  • Encryption in transit — TLS везде, никакого HTTP
  • Secrets management — никаких паролей в коде

Level 5: Monitoring & Response

  • Log everything, alert on anomalies
  • Incident response playbook
  • Penetration testing

Ключевой принцип: Trust No One (да, мы к этому ещё вернёмся в секции про Zero Trust). Каждый уровень предполагает, что предыдущий может быть скомпрометирован.

#Почему один уровень — это плохо

В 2017 году Equifax — одна из крупнейших кредитных бюро в США — пережила утечку данных 147 миллионов человек. Как? Через известную уязвимость в Apache Struts (CVE-2017-5638). Патч был доступен за два месяца до атаки. Equifax просто не задеплоили его.

Если бы у них был WAF, блокирующий эксплуатацию этой уязвимости — ничего бы не произошло. Если бы сегментация сети не давала доступ к базе с веб-сервера — ущерб был бы меньше. Если бы мониторинг заметил подозрительный трафик — атаку бы остановили раньше.

У них не было ни одного из этих уровней. Они полагались на один замок. И замок не закрыли.


#OWASP Top 10 на практике — не чек-лист, а образ мыслей

OWASP Top 10 — это список самых критичных рисков безопасности для веб-приложений. Каждый разработчик хотя бы слышал о нём. Большинство техлидов кивают: «да, мы знаем». Но на практике...

Давайте пройдёмся по топ-рискам и посмотрим, как они выглядят в реальном коде.

#1. Broken Access Control (Нарушение контроля доступа)

Самый частый и самый опасный. Пользователь может посмотреть чужие данные, потому что вы забыли проверить права.

// ПЛОХО: кто угодно может посмотреть любой заказ
app.get('/api/orders/:id', async (req, res) => {
  const order = await db.orders.findById(req.params.id);
  res.json(order);
});

// ХОРОШО: проверяем, что заказ принадлежит пользователю
app.get('/api/orders/:id', async (req, res) => {
  const order = await db.orders.findById(req.params.id);
  if (order.userId !== req.user.id && req.user.role !== 'admin') {
    throw new ForbiddenError();
  }
  res.json(order);
});

Звучит банально? Вы удивитесь, сколько реальных утечек происходит именно из-за отсутствия этой проверки.

[Anti-pattern: см. references/anti-patterns.md — отсутствие валидации доступа — частный случай «No Observability», только в контексте безопасности. Беда в том, что вы можете не заметить, что кто-то читает чужие данные, пока не станет слишком поздно.]

#2. Cryptographic Failures

Не кастомная криптография. Пожалуйста, никогда не пишите свою криптографию. Используйте стандартные библиотеки.

  • Храните пароли через bcrypt (не md5, не sha256, не «я сам придумал алгоритм»)
  • TLS 1.3 — дефолт (TLS 1.0 и 1.1 — уже legacy, отключайте)
  • Шифрование данных в покое — AES-256, не свой алгоритм
  • Никогда не храните чувствительные данные в логах

#3. Injection

SQL injection, NoSQL injection, Command injection, LDAP injection — все они лечатся одним способом: никогда не доверяйте пользовательскому вводу.

// ПЛОХО: SQL injection — классика
const query = `SELECT * FROM users WHERE email = '${req.body.email}'`;

// ХОРОШО: parameterized queries
const query = 'SELECT * FROM users WHERE email = $1';
const result = await db.query(query, [req.body.email]);

Используйте ORM или parameterized queries. Всегда. Неважно, насколько «безопасный» ваш input.

#4. Security Logging and Monitoring Failures

Если вы не логируете подозрительную активность — вы не узнаете об атаке, пока не станет слишком поздно. Среднее время обнаружения утечки (dwell time) — 207 дней (источник: IBM Cost of Data Breach 2024). Двести семь дней, Карл.

  • Логируйте все authentication failures
  • Логируйте access denial (403)
  • Alert на аномалии: 100 failed logins с одного IP за минуту
  • Correlation ID через все сервисы (см. Главу 10: Observability)

Остальные риски из OWASP Top 10 (Cross-Site Scripting, Server-Side Request Forgery, Insecure Design и т.д.) — тоже важны. Но если вы закроете эти четыре, вы уже закроете 80% проблем.

Совет

Совет: Сделайте OWASP Top 10 частью code review. Не как чек-лист «проверить и забыть», а как набор сценариев: «а что если этот endpoint вызовет злоумышленник?»


#Secrets Management — пароли не хранятся в Git

Если я вижу в репозитории config/database.yml с паролем от продакшн-базы, у меня дёргается глаз. Серьёзно, 2026 год на дворе. Почему пароли всё ещё в Git?

#Проблема

Секреты — это не только пароли от базы. Это:

  • API-ключи (AWS, Stripe, OpenAI, SendGrid)
  • JWT signing keys
  • TLS-сертификаты
  • SSH-ключи
  • Encryption keys

Всё это должно быть не в репозитории. Никогда. Даже если репозиторий приватный.

#HashiCorp Vault

Vault — это стандарт де-факто для управления секретами. Ключевая фишка: секреты не хранятся на диске сервера, а запрашиваются по API.

# application получает секрет на старте
$ vault kv get secret/db/prod

Key                Value
---                -----
host               db.prod.internal
port               5432
username           app_user
password           a1b2c3d4e5...

Vault поддерживает:

  • Dynamic secrets — секреты с TTL, которые автоматически ротируются
  • Lease — временные доступы с истечением
  • Audit log — каждый запрос к Vault логируется
  • Auto-unseal — автоматическая расшифровка хранилища
// Vault integration example
import * as vault from 'node-vault';

const client = vault({ endpoint: 'https://vault.internal:8200' });
await client.approleLogin({ role_id, secret_id });

const { data } = await client.read('secret/data/db/prod');
const dbConfig = data.data;

const db = await createConnection({
  host: dbConfig.host,
  password: dbConfig.password,
});

#AWS Secrets Manager (или GCP Secret Manager, или Azure Key Vault)

Если вы уже в облаке, managed secrets manager — ваш выбор. AWS Secrets Manager автоматически ротирует секреты для RDS, Redshift, DocumentDB.

// AWS Secrets Manager
import { SecretsManager } from '@aws-sdk/client-secrets-manager';

const sm = new SecretsManager({ region: 'us-east-1' });
const { SecretString } = await sm.getSecretValue({
  SecretId: 'prod/db/orders',
});

const dbConfig = JSON.parse(SecretString);

Разница между Vault и облачными решениями:

  • Vault — кроссплатформенный, работает везде (on-prem, multi-cloud)
  • Managed — меньше ops, интеграция с облачными сервисами
  • Vault — сложнее в настройке (unseal, HA, storage backend)
  • Managed — дороже при большом количестве секретов

#Best Practices для секретов

  1. Никогда не хардкодьте. Правда, не делайте этого.
  2. Ротация. Пароль от базы должен меняться. Раз в 90 дней — минимум.
  3. Least privilege. Сервис A не должен знать секреты сервиса B.
  4. Audit trail. Логируйте, кто и когда запрашивал какой секрет.
  5. Временные секреты. Если секрет может иметь TTL — пусть он его имеет.

#Supply Chain Security — ваш код не одинок

Помните SolarWinds (2020)? Хакеры скомпрометировали систему сборки SolarWinds и внедрили бэкдор в обновление их Orion-продукта. 18 000 организаций скачали заражённое обновление. Жертвы: Министерство финансов США, Министерство юстиции, десятки Fortune 500.

Это supply chain attack. И вы тоже в зоне риска.

#Что под угрозой

Ваш код зависит от сотен библиотек. Каждая из них — потенциальный вектор атаки:

  • Компрометация пакета (malicious package)
  • Устаревшая зависимость с известной CVE
  • Компрометация инструмента сборки
  • Компрометация CI/CD пайплайна

#SBOM (Software Bill of Materials)

SBOM — это полный список всех компонентов вашего ПО: библиотек, их версий, лицензий, транзитивных зависимостей. Как список ингредиентов на упаковке продуктов.

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "metadata": {
    "component": {
      "name": "my-app",
      "version": "1.2.3"
    }
  },
  "components": [
    {
      "type": "library",
      "name": "express",
      "version": "4.18.2"
    },
    {
      "type": "library",
      "name": "lodash",
      "version": "4.17.21"
    }
  ]
}

Форматы: CycloneDX (OWASP) и SPDX (ISO). CycloneDX стал де-факто стандартом.

Генерировать SBOM можно автоматически:

# Для Node.js
npx @cyclonedx/cyclonedx-npm --output-file bom.json

# Для Go
cyclonedx-gomod -o bom.json -main .

# Docker image
docker buildx imagetools inspect myapp:latest --format '{{ json .SBOM }}'

#Signature Verification

SLSA (Supply chain Levels for Software Artifacts) — это фреймворк для оценки безопасности пайплайна сборки. Уровни от SLSA 1 (начальный) до SLSA 4 (максимальный).

На практике: подписывайте свои образы и артефакты.

# Подписать Docker образ
cosign sign --key cosign.key myapp:latest

# Проверить подпись
cosign verify --key cosign.pub myapp:latest

#Что делать прямо сейчас

  1. Dependency scanning. Dependabot, Snyk, Renovate — автоматическое обнаружение уязвимых зависимостей
  2. Lock files. package-lock.json, go.sum, Cargo.lock — фиксируйте версии
  3. Mirror registries. Не качайте пакеты напрямую из npm/PyPI — используйте зеркало с проверкой
  4. CI/CD security. Не запускайте untrusted код в пайплайне
  5. SBOM generation. Включите в CI/CD генерацию SBOM для каждого релиза

#Zero Trust для микросервисов — доверяй, но проверяй (точнее, не доверяй вообще)

Zero Trust — это не продукт. Это модель безопасности, которая предполагает, что компрометация уже произошла.

#Традиционная модель (Perimeter-based)

Помните старую архитектуру? Внутренняя сеть — доверенная, внешняя — недоверенная. Все, кто внутри корпоративной сети, — «свои». Firewall на границе, а внутри — полное доверие.

Проблема: как только хакер проник внутрь (через VPN, фишинг, уязвимый сервис), он получает доступ ко всему.

#Zero Trust модель

Никому не доверяем по умолчанию. Каждый запрос — верифицирован, авторизован, зашифрован и залогирован.

#Принципы Zero Trust для микросервисов

#mTLS (Mutual TLS)

mTLS — это когда не только клиент проверяет сертификат сервера, но и сервер проверяет сертификат клиента. Оба конца аутентифицируют друг друга.

# Конфигурация mTLS в service mesh (Istio)
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: prod
spec:
  mtls:
    mode: STRICT  # все сервисы обязаны использовать mTLS

В режиме STRICT ни один сервис не может общаться с другим без валидного сертификата.

#Service Mesh как реализация Zero Trust

Service Mesh (см. Главу 18) даёт Zero Trust «из коробки»:

  • mTLS между сервисами — автоматически
  • Authorization policies — на уровне API
  • Auditing каждого запроса
# Istio Authorization Policy
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: orders-service-policy
  namespace: prod
spec:
  selector:
    matchLabels:
      app: orders
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/prod/sa/payment-service"]
      to:
        - operation:
            methods: ["POST"]
            paths: ["/api/orders"]

Только payment-service может создавать заказы. Любой другой запрос — denied.

#Где не нужен Zero Trust

Zero Trust — не бесплатно. mTLS добавляет latency, сертификаты нужно ротировать, политики — управлять. Для небольших систем (< 10 микросервисов) — оправдан ли overhead? Чаще всего нет.

Решение: start with perimeter security, добавляйте Zero Trust по мере роста.


#Безопасность AI-агентов — новые векторы угроз

С появлением AI-coding агентов возникают угрозы, которых не было в классической модели безопасности. Они требуют отдельного внимания.

#Least Agency Principle

Агент должен иметь минимально необходимые права для выполнения задачи.

Звучит очевидно. На практике означает:

  • Агент, редактирующий README, не должен иметь production-доступ
  • Агент, пишущий код, не должен иметь доступ к secrets management
  • Каждый запуск агента — в изолированном workspace/sandbox
  • Права выдаются на задачу, а не на роль

#Data Exfiltration через Skills

Комбинация Skills (процедурных инструкций) + open network access = высокий риск утечки данных. Агент может получить доступ к внутренним данным и отправить их на внешний сервер.

Mitigation: двухуровневая система allowlist:

  • Организационный уровень: какие домены разрешены в принципе
  • Запросный уровень: какие домены разрешены для конкретного запроса

#Domain Secrets Pattern

Credentials инжектятся через sidecar (domain_secrets), а не через промпт. Агент не видит сам секрет — только получает доступ к ресурсу.

# Вместо того чтобы давать агенту API-ключ в промпте:
You have the API key: sk-xxx

# Используйте sidecar-инъекцию:
agent --secret db-host --secret api-key
# Агент может подключиться к БД, но не может прочитать/передать ключ

#Инцидент: Agent-to-Agent

Задокументированный случай (Google CTO office, 2026):

  1. AI-агент сгенерировал false URL
  2. Подключился к deprecated legacy agent
  3. Legacy agent отправил false emails 50 коллегам

Урок: изоляция агентов, запрет agent-to-agent communications без approval. Даже если агенты принадлежат одной системе.

#Permission Fatigue

Исследования показывают: пользователи одобряют 93% всех permission prompts. Не потому что 93% запросов осмысленны. А потому что предупреждений слишком много — и люди перестают их читать.

Вывод: диалоговая безопасность не работает. Нужен defense-in-depth:

  • Sandboxing на уровне инфраструктуры
  • Auto-mode classifiers (агент сам определяет уровень риска)
  • Zero Trust для AI-агентов (каждый доступ проверяется, даже если агент «свой»)
  • Audit trails для всех действий агента

#⚠️ Slopsquatting

Новый тип supply chain атаки, порождённый AI-агентами:

  1. AI-агент подбирает библиотеку для решения задачи
  2. Находит typosquatting-пакет с вредоносным кодом
  3. Устанавливает его без ведома разработчика

Mitigation:

  • Ограничить реестры, из которых агент может устанавливать пакеты
  • Использовать lock-файлы (package-lock.json, poetry.lock, Cargo.lock)
  • Не давать агенту права на npm install / pip install без подтверждения
  • Dependency scanning на каждый PR (Dependabot, Snyk)
  • ~20% AI-генерированного кода ссылается на несуществующие пакеты (Zenodo, 2026)

#DDoS Protection — когда ваш сервер атакует вся планета

DDoS (Distributed Denial of Service) — это когда злоумышленник отправляет на ваш сервер столько запросов, что он перестаёт отвечать легитимным пользователям. Просто, эффективно, дёшево.

#Типы DDoS-атак

Layer 3/4 (Network): SYN flood, UDP amplification, ICMP flood

  • Цель: исчерпать сетевые ресурсы
  • Защита: AWS Shield, Cloudflare Magic Transit

Layer 7 (Application): HTTP flood, Slowloris, запросы к тяжёлым endpoint'ам

  • Цель: исчерпать вычислительные ресурсы
  • Защита: WAF, rate limiting, Cloudflare WAF

#Cloudflare — как это работает

Cloudflare использует Anycast-сеть. У них один IP-адрес, но он анонсируется из 300+ датацентров. Атака распределяется по всей сети.

Когда приходит DDoS-атака:

  1. Трафик поступает в ближайший датацентр Cloudflare
  2. Анализируется на уровне edge (не доходя до вашего сервера)
  3. Подозрительный трафик отбрасывается
  4. Чистый трафик — проксируется на ваш origin (или кэшируется на CDN)
flowchart LR
    A[Атакующий] -->|Мусорный трафик| B[Cloudflare Edge]
    B -->|Отбрасывается| X[Корзина]
    C[Реальный пользователь] -->|Чистый трафик| B
    B -->|Проксируется| D[Ваш сервер origin]
    D -->|Ответ| B
    B -->|Кэшированный ответ| C

#AWS Shield

AWS Shield — это встроенная защита от DDoS в AWS. Два уровня:

Shield Standard (бесплатно):

  • Защита от L3/L4 атак (SYN/UDP floods)
  • Включена для всех AWS-ресурсов
  • Автоматическая — ничего настраивать не надо

Shield Advanced ($3000/мес + трафик):

  • Защита от L7 атак (HTTP floods)
  • Финансовая защита — AWS компенсирует затраты на масштабирование во время атаки
  • Dedicated DDoS Response Team (DRT) — 24/7 поддержка
  • Аналитика и дашборды

#Rate Limiting — первый уровень защиты

# Nginx rate limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://backend;
    }
}

Честно: rate limiting не остановит мощную DDoS-атаку. Но он отсечёт 90% «бытовых» атак — ботов, scrapers, script kiddies.

#Что делать при DDoS-атаке

  1. Кэш. Чем больше контента вы можете отдать из кэша (CDN), тем меньше нагрузка на origin
  2. Ручной threshold. AWS WAF + rate-based rules
  3. Scaling. Auto-scaling может помочь, но не для всех атак (Layer 7 всё равно съедает capacity)
  4. Звонок провайдеру. Cloudflare, Akamai, AWS — у них есть команды, которые включат защиту вручную

#Penetration Testing как процесс, а не разовая активность

«Мы наймем пентестеров перед запуском» — звучит как план. Но давайте честно: если ваш пентест проходит раз в год, а код вы деплоите каждый день, между проверками вы живёте с открытой уязвимостью.

#Разовые пентесты — прошлый век

Проблемы разовых пентестов:

  • В день аудита пентестер проверяет атаки, которые уже неактуальны (вы починили ту уязвимость за месяц до)
  • Через неделю после пентеста вы задеплоили новую фичу — и она уже содержит баг
  • Результаты пылятся в табличке, никто их не смотрит до следующего аудита

#Continuous Security Testing

Современный подход — интегрировать тестирование безопасности в CI/CD.

SAST (Static Application Security Testing):

  • Анализ исходного кода без запуска
  • Инструменты: SonarQube, Semgrep, CodeQL, Checkmarx
  • Запускается на каждом PR
# GitHub Actions — SAST на каждый PR
name: Security Scan
on: pull_request
jobs:
  semgrep:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: semgrep/semgrep-action@v1
        with:
          config: p/default  # OWASP Top 10 rules

DAST (Dynamic Application Security Testing):

  • Анализ работающего приложения
  • Инструменты: OWASP ZAP, Burp Suite, Acunetix
  • Запускается на staging/review apps

IAST (Interactive Application Security Testing):

  • Агент внутри приложения анализирует трафик
  • Меньше false positives, больше контекста

#Bug Bounty — когда хакеры работают на вас

Bug Bounty программа — вы платите исследователям безопасности за найденные уязвимости. Модель «pay per bug».

  • HackerOne, Bugcrowd — managed платформы
  • Цены: от $100 за low до $10,000+ за critical
  • Лучший ROI в безопасности: вы платите только за результат
Совет

Совет: Bug Bounty не заменяет пентесты. Но дополняет. Разовый пентест — depth, bug bounty — breadth. У вас 1000 хакеров ищут проблемы вместо одной команды.


#Security Compliance — SOC2, PCI-DSS, HIPAA

Compliance (соответствие стандартам) — то, о чём вы узнаёте, когда продаёте enterprise-клиенту и он просит «а SOC2 report у вас есть?».

#SOC2 (Service Organization Control 2)

Стандарт для SaaS-компаний, обрабатывающих данные клиентов. Самый популярный compliance-фреймворк среди технологических компаний.

Критерии SOC2:

  • Security (обязательно): защита от несанкционированного доступа
  • Availability, Confidentiality, Processing Integrity, Privacy — опционально

Что нужно сделать:

  • Контроль доступа (SSO, MFA, least privilege)
  • Мониторинг и логирование
  • Incident response plan
  • Vendor management
  • Encryption (at rest и in transit)
  • Физическая безопасность (датацентров)

Уровни:

  • Type I: «это задокументировано» (дешевле, быстрее)
  • Type II: «это реально работает в течение N месяцев» (дороже, дольше, но именно его просят enterprise-клиенты)

#PCI-DSS (Payment Card Industry Data Security Standard)

Если вы принимаете кредитные карты — PCI-DSS обязателен.

12 требований группируются по 6 целям:

  1. Build and Maintain a Secure Network
  2. Protect Cardholder Data (encryption!)
  3. Maintain a Vulnerability Management Program
  4. Implement Strong Access Control Measures
  5. Regularly Monitor and Test Networks
  6. Maintain an Information Security Policy

Уровни:

  • Level 1: > 6M транзакций/год — ежегодный аудит QSA (Qualified Security Assessor)
  • Level 2-4: меньше транзакций — SAQ (Self-Assessment Questionnaire)

Самое болезненное в PCI-DSS: вы не можете хранить CVV (код с обратной стороны карты) — ни в базе, ни в логах, нигде. Даже временно. Если CVV есть в логах — вы нарушаете compliance.

#HIPAA (Health Insurance Portability and Accountability Act)

Если вы работаете с медицинскими данными в США — HIPAA.

Ключевое: Protected Health Information (PHI) должна быть защищена.

  • Encryption обязательна
  • Audit logs — кто и когда смотрел данные пациента
  • Business Associate Agreements (BAA) с каждым подрядчиком
  • Breach notification — уведомление в течение 60 дней

#Как не сойти с ума от compliance

Compliance на масштабе — это организационная проблема, а не техническая.

Советы:

  1. Автоматизируйте. Compliance as Code — Osquery, Cloud Custodian, Checkov
  2. Делегируйте. Вам не нужно управлять всем вручную — используйте managed сервисы (AWS имеет PCI/HIPAA/SOC2 аттестацию для многих сервисов)
  3. Не ждите последнего момента. Начать готовиться к SOC2 за месяц до аудита — это боль
  4. Compliance != Security. Можно быть SOC2 compliant и при этом иметь утечку данных. Compliance — минимальный порог, а не гарантия безопасности

#Incident Response — когда всё горит

#Прежде всего: у вас есть план?

Не в голове. Написанный. С контактами. С check-list'ами. С clear ownership.

Если ваш план реагирования: «позвонить Васе, он знает что делать» — у вас нет плана.

#Структура Incident Response (NIST SP 800-61)

1. Preparation

  • Incident response team (IRT)
  • Инструменты: SIEM, SOAR, forensic tools
  • Runbook и playbooks для типовых инцидентов
  • Communication tree — кто кого оповещает

2. Detection & Analysis

  • Обнаружение: SIEM alerts, пользователи жалуются, провайдер предупредил
  • Triage: насколько серьёзно? Какой blast radius?
  • Документирование: время, детали, действия (каждый шаг)

3. Containment, Eradication & Recovery

  • Stop the bleeding: отключить скомпрометированный сервис
  • Forensics: что произошло? Как попали?
  • Remove access: отозвать ключи, сбросить пароли
  • Patches: закрыть уязвимость
  • Restore из backup'ов (которые вы проверяете, правда?)

4. Post-Incident Activity

  • Post-mortem: что пошло не так? Что сделали правильно?
  • Action items: что нужно изменить в системе
  • Без blameless culture: не «кто виноват», а «как система должна измениться»

#Playbook: пример типового инцидента

=== SECURITY INCIDENT PLAYBOOK: Data Breach ===

1. ОБНАРУЖЕНИЕ
   - Кто обнаружил: __________
   - Время: __________
   - Первичные признаки: __________

2. TRIAGE (первые 15 минут)
   - [ ] Подтвердить, что инцидент реален
   - [ ] Определить severity (SEV1/SEV2/SEV3)
   - [ ] Уведомить IRT лида
   - [ ] Завести тикет с хронологией

3. CONTAINMENT (первые 60 минут)
   - [ ] Отключить скомпрометированный сервис от сети
   - [ ] Отозвать все ключи доступа
   - [ ] Заблокировать подозрительные IP на firewall
   - [ ] Сделать snapshot compromised системы (forensics)

4. INVESTIGATION
   - [ ] Проверить логи доступа
   - [ ] Определить scope утечки (какие данные?)
   - [ ] Проверить другие сервисы на признаки компрометации
   - [ ] Связаться с compliance officer

5. COMMUNICATION
   - [ ] Внутреннее: статус C-level каждые 30 минут
   - [ ] Клиенты: если утечка данных — legal review до публикации
   - [ ] Регуляторы: в соответствии с требованиями (GDPR: 72 часа)

6. RECOVERY
   - [ ] Patch уязвимость
   - [ ] Восстановить из backup
   - [ ] Дополнительные проверки безопасности
   - [ ] Вернуть сервис в продакшн (после approval)

7. POST-MORTEM
   - [ ] Timeline инцидента
   - [ ] Root cause analysis
   - [ ] Action items с дедлайнами
   - [ ] Update runbooks

#War Room — когда case открыт

При серьёзном инциденте собирается War Room:

  • Slack/Discord канал (или Zoom/Google Meet)
  • Только участники — не нужно оповещать всю компанию
  • Канал только для коммуникации по инциденту — без флуда
  • Чёткие роли: commander, investigator, communicator, scribe

#Game Days — не ждите реального инцидента

Game Day — это симуляция инцидента. Вы искусственно создаёте проблему и смотрите, как система и команда реагируют.

  • «А что если наш сертификат TLS истёк?» — проверяем
  • «А что если наш secrets manager недоступен?» — проверяем
  • «А что если атакующий получил доступ к CI/CD?» — проверяем

Game Days не обязаны быть сложными. Начните с малого: один сценарий, 30 минут, одно открытие.


#Кейс: Cloudflare — защита от DDoS в 2 Tbps+

В 2024 году Cloudflare отразила одну из крупнейших DDoS-атак в истории — пиковая мощность превысила 2 терабита в секунду.

#Атака

  • Тип: HTTP/2 Rapid Reset — новая техника, использующая уязвимость в протоколе HTTP/2
  • Мощность: > 2 Tbps
  • Источник: ботнет из тысяч скомпрометированных устройств
  • Цель: клиент Cloudflare (финансовый сектор)

Атака эксплуатировала саму природу HTTP/2: мультиплексирование запросов. Злоумышленник открывал одно TCP-соединение, отправлял поток запросов и сразу же отменял их (RST_STREAM), заставляя сервер выделять ресурсы на несуществующие запросы.

#Как Cloudflare защитилась

  1. Edge-фильтрация на уровне Anycast. Трафик атаки распределился по всей сети Cloudflare — 300+ датацентров. Ни один датацентр не получил критической нагрузки.
  2. Автоматические WAF-правила. Cloudflare WAF автоматически обновился, блокируя паттерн HTTP/2 Rapid Reset.
  3. Машинное обучение. ML-модель анализировала трафик в реальном времени и отличала легитимные пользовательские запросы от атаки.
  4. Автоматическое кэширование. Cloudflare Edge кэшировал ответы, снижая нагрузку на origin-сервер клиента.

#Ключевой инсайт

Cloudflare не выиграла за счёт «железа» или «толстых каналов». Они выиграли за счёт архитектуры: распределённая Anycast-сеть, интеллектуальная фильтрация на каждом edge node, автоматическое обнаружение аномалий.

Если бы клиент полагался на собственный датацентр — даже с 100 Гбит/с каналом атака в 2 Tbps просто насытила бы линк за доли секунды. Только глобально распределённая инфраструктура может поглотить атаку такого масштаба.

Источники: Cloudflare Blog, Cloudflare Radar


#Чек-лист: готовы ли вы к атаке?

  • У нас есть WAF перед production-трафиком
  • Все секреты хранятся в Vault или Secrets Manager (не в репозитории)
  • Все внешние соединения — только через TLS 1.3
  • mTLS между микросервисами (или хотя бы шифрование)
  • Dependency scanning (Dependabot/Snyk) работает и alert'ит
  • Генерируется SBOM для каждого релиза
  • Rate limiting настроен на всех публичных endpoint'ах
  • Есть DDoS-защита (Cloudflare / AWS Shield / провайдер)
  • Деплой SAST-сканера в CI/CD
  • Написан Incident Response Plan (не в голове)
  • Проведён хотя бы один Game Day в этом году
  • Известны требования compliance (SOC2? PCI-DSS? HIPAA?)
  • Есть Bug Bounty программа (или хотя бы channel для security research)

#Не делай так

#«У нас всё в облаке, Amazon сам всё защитит»

AWS Shared Responsibility Model — ваш лучший друг и враг. AWS защищает облако, но вы защищаете то, что в облаке. S3 bucket открыт на весь интернет? Это ваша ответственность. RDS без encryption? Ваша. Security group открывает 0.0.0.0/0:3306? Догадались, чья это вина.

Реальная история: Компания оставила S3 bucket открытым. «Там же не было секретных данных, только статика для сайта». В bucket лежал JavaScript с API-ключами. Компрометация за 24 часа. Классика.

#«Мы наняли пентестеров — мы защищены»

Как я уже говорил: пентест — это снимок безопасности на конкретную дату. Если вы деплоите каждый день, снимок устаревает через неделю. Нужен continuous процесс, не разовая проверка.

#«Нам не нужен compliance, мы не банк»

Пока ваши данные не утекли. После утечки — заказчикам будет всё равно, были у вас SOC2 или нет. Compliance — это про доверие. И про то, что вы хотя бы попытались.

#«Пароль? Давайте запишем в .env и забудем»

.env в репозитории — это боль. .env не в репозитории — вы всё ещё рискуете. .env на сервере в plain text — рискуете. Пароль должен быть в secrets manager, с ротацией, audit trail и временным доступом.

#«soc2-is-easy.py»

Видел однажды скрипт, который «автоматизирует прохождение SOC2». Спойлер: compliance — это процесс, а не галка в чек-боксе. Никакой скрипт не создаст культуру безопасности. А без культуры — compliance report ничего не стоит.


#Ключевые выводы

  1. Defense in Depth — единственная работающая стратегия. Никогда не полагайтесь на один уровень защиты. Предполагайте, что каждый уровень может быть скомпрометирован, и стройте следующий.

  2. Безопасность — это процесс, не проект. Разовый пентест, однократный security review, compliance audit раз в год — этого недостаточно. Continuous security — SAST в CI/CD, dependency scanning на каждый PR, security monitoring 24/7.

  3. Zero Trust — это про архитектуру, не про продукт. Не покупайте «Zero Trust solution». Стройте архитектуру, где каждый запрос верифицирован, авторизован и залогирован.

  4. Secrets management — базовая гигиена. Если у вас пароль от продакшн-базы лежит в Git — остановитесь и исправьте это. Всё остальное можно делать после.

  5. Incident Response — самый важный документ, который вы никогда не хотите использовать. Но когда придётся — вы будете рады, что он есть. Напишите playbook, проведите Game Day, соберите контакты. До инцидента.

Forward reference: С появлением AI-coding агентов возникают новые векторы угроз: slopsquatting, agent-to-agent атаки, permission fatigue. Zero Trust архитектура становится обязательной и для AI-агентов. См. Главу 37 «Анти-паттерны AI-assisted разработки» (раздел «Безопасность AI-агентов»).