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

# Trivy, Semgrep и Gitleaks

## Цель

Разобрать три столпа сканирования в DevSecOps: **секреты в Git** (Gitleaks), **уязвимости в коде и зависимостях** (Semgrep + Trivy), **CVE в образах** (Trivy image). Научиться запускать локально и в CI.

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

- Установленный Docker или возможность запускать контейнеры.
- Учебный репозиторий с несколькими файлами (можно пустой Node/Python проект).

## Время

~70 минут (включая локальные прогоны).

## Сравнение инструментов

| Инструмент | Что ищет | Когда запускать |
|------------|----------|-----------------|
| **Gitleaks** | API keys, tokens, private keys в файлах и истории Git | Каждый push/MR |
| **Semgrep** | Паттерны уязвимого кода (SQLi, XSS, слабая крипто) | Каждый MR |
| **Trivy fs** | CVE в lock-файлах, misconfig IaC | MR + nightly |
| **Trivy image** | CVE в слоях OCI-образа | После `docker build` |

## Gitleaks

### Локальный запуск

```bash
docker run --rm -v "$(pwd):/repo" zricethezav/gitleaks:latest \
  detect --source /repo --verbose --redact
```

### Конфиг allowlist

`gitleaks.toml` (фрагмент):

```toml
[allowlist]
paths = [
  '''^docs/examples/''',
  '''\.env\.example$'''
]
```

Используйте для **учебных** фейковых ключей, не для обхода реальных утечек.

### История Git

```bash
gitleaks detect --source . --log-opts="--since=2024-01-01"
```

Если секрет уже в истории — ротация ключа + `git filter-repo` (осторожно, согласуйте с командой).

## Semgrep

### Быстрый старт

```bash
docker run --rm -v "$(pwd):/src" returntocorp/semgrep semgrep scan --config auto /src
```

Наборы правил:

- `p/ci` — быстрый CI набор
- `p/owasp-top-ten` — веб-риски
- кастомные правила в `.semgrep.yml`

### Пример кастомного правила

```yaml
rules:
  - id: hardcoded-example-password
    languages: [python]
    message: Не храните пароли в коде
    severity: ERROR
    pattern: password = "..."
```

### False positives

Подавление с обязательным комментарием:

```python
# nosemgrep: hardcoded-example-password
password = "demo-only"  # учебный пример
```

## Trivy

### Файловая система (зависимости)

```bash
trivy fs --severity HIGH,CRITICAL --format table .
```

Сканирует: `package-lock.json`, `go.sum`, `requirements.txt`, `Dockerfile`, Kubernetes YAML.

### Образ

```bash
docker build -t myapp:learn .
trivy image --severity CRITICAL myapp:learn
```

### Политика в CI

```bash
trivy image --exit-code 1 --severity CRITICAL myapp:learn
```

Exit code 1 = есть Critical → пайплайн красный.

### `.trivyignore`

```
# CVE-2024-00000 в базовом образе, тикет SEC-123, пересмотр 2025-09-01
CVE-2024-00000
```

Каждое исключение — с **тикетом и датой**, иначе аудит провалит.

## Связка в одном Makefile

```makefile
.PHONY: security
security: gitleaks semgrep trivy-fs

gitleaks:
	docker run --rm -v "$(PWD):/repo" zricethezav/gitleaks:latest detect --source /repo

semgrep:
	docker run --rm -v "$(PWD):/src" returntocorp/semgrep semgrep scan --config p/ci --error /src

trivy-fs:
	docker run --rm -v "$(PWD):/work" aquasec/trivy fs --severity HIGH,CRITICAL /work
```

## Приоритизация находок

1. **Secret в main** — немедленная ротация.
2. **Critical RCE в prod image** — патч в 24–72 ч (по политике).
3. **High в dev dependency** — плановый спринт.
4. **Low в транзитивной lib** — риск-оценка.

Используйте CVSS + экспозицию (интернет / внутренняя сеть).

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

1. Может ли Gitleaks найти ключ, удалённый в последнем коммите, но оставшийся в истории?
2. Чем Semgrep отличается от Trivy fs для Python-проекта?
3. Зачем `--redact` в Gitleaks?
4. Как документировать запись в `.trivyignore`?

## Дальше

[Vault и секреты](vault-i-sekrety.md) — куда складывать ключи вместо репозитория.
