# AuthN и AuthZ

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

## Цель

Чётко различать **аутентификацию** и **авторизацию**, понимать сессии, токены, OAuth/OIDC, RBAC — основу access control в DevSecOps.

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

- [OWASP Top 10 для начинающих](owasp-top10-dlya-nachinayushih.md)

## Время

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

---

## Два разных вопроса

| | AuthN (Authentication) | AuthZ (Authorization) |
|---|------------------------|------------------------|
| Вопрос | **Кто** ты? | **Что** тебе можно? |
| Аналогия | Паспорт на входе | Пропуск в VIP-зону |
| Fail | 401 Unauthorized | 403 Forbidden |
| Пример | Login + password | Role `admin` может delete |

**Можно** быть authenticated, но **не** authorized (guest vs admin).

---

## Факторы аутентификации

| Фактор | Пример |
|--------|--------|
| Something you **know** | Password, PIN |
| Something you **have** | Phone OTP, hardware key |
| Something you **are** | Biometrics |

**MFA** = 2+ фактора из **разных** категорий. Password + security question — **не** MFA (оба know).

---

## Пароли — хранение

| ❌ Никогда | ✅ Правильно |
|-----------|-------------|
| Plain text | bcrypt / Argon2 + unique salt |
| MD5/SHA1 alone | Pepper in KMS (optional) |
| Reuse across users | Password policy + breach check |

DevSecOps: secret scan + audit DB dumps в lab.

---

## Сессии vs токены

### Session (server-side)

```
Login OK → server создаёт sessionId → cookie SESSIONID=abc
         → server хранит abc → userId=42
```

| Плюс | Минус |
|------|-------|
| Revoke instantly | Stateful, scale tricky |

### Token (JWT — упрощённо)

```
Login OK → server выдаёт JWT (signed JSON)
Client шлёт: Authorization: Bearer eyJ...
Server проверяет подпись
```

| Плюс | Минус |
|------|-------|
| Stateless | Сложный revoke до expiry |

**Cookie flags:** `HttpOnly`, `Secure`, `SameSite=Lax/Strict`.

---

## OAuth 2.0 и OpenID Connect

| | OAuth 2.0 | OIDC |
|---|-----------|------|
| Фокус | **Authorization** (delegation) | **Authentication** (+ profile) |
| Пример | «App может post в Twitter» | «Login with Google» |

**Не путать** OAuth provider с session management вашего app.

Flow **Authorization Code + PKCE** — стандарт для SPA/mobile.

---

## RBAC, ABAC

| Model | Как |
|-------|-----|
| **RBAC** | User → Role → Permissions |
| **ABAC** | Policy на атрибутах (department, time) |

Kubernetes **Role / ClusterRoleBinding** — RBAC.

```yaml
# Упрощённо: role read pods
kind: Role
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list"]
```

**Least privilege:** `get,list` only, не `*`.

---

## API keys vs user auth

| | User session/JWT | API key |
|---|------------------|---------|
| Для | Humans in browser | Machine-to-machine |
| Rotation | Session expiry | Regular key rotation |
| Scope | User permissions | Service account scope |

API keys в **header**, не в URL (логируются).

---

## Типичные ошибки (OWASP A01, A07)

1. **IDOR** — AuthN есть, AuthZ нет на object level
2. **JWT alg none / weak secret**
3. **Missing logout** / infinite session
4. **Admin functions** только скрыты в UI
5. **Default credentials** в staging

---

## Zero Trust (концепт)

«Never trust, always verify» — каждый request проверяется: identity, device, context.

DevSecOps: mTLS между сервисами, short-lived tokens, continuous validation.

---

## Практика

1. Залогиньтесь на учебный site → DevTools → Cookies → flags.
2. Вызовите API с token и без — сравните 401 vs 200.
3. В K8s: `kubectl auth can-i delete pods --as=system:serviceaccount:default:default`
4. Нарисуйте login flow: browser → API → DB.

---

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

1. 401 vs 403 — когда какой?
2. Чем session cookie отличается от JWT в localStorage (риски)?
3. Что такое MFA на примере банка?
4. Зачем RBAC в Kubernetes?

---

## Дальше

→ [Криптография на практике](kriptografiya-praktika.md)
