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

# IAM и least privilege

## Цель

Освоить **Identity and Access Management (IAM)** и принцип **least privilege** (минимально необходимые права): как проектировать роли, избегать permanent admin, и audit'ить доступ в облаке.

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

- [README раздела 07](README.md).
- Понимание: user login, «аккаунт в AWS/GCP».

## Время

~30 минут чтения + упражнение на paper IAM design

---

## Что такое IAM

**IAM** — система ответа на вопросы:

- **Кто** ты? (authentication — identity)
- **Что** тебе разрешено? (authorization — permissions)

В облаке: humans (users), machines (service accounts / roles), groups, policies.

## Least privilege

**Least privilege:** каждый субъект получает **только** права, нужные для задачи, **только** на время задачи.

| ❌ Плохо | ✅ Хорошо |
|----------|-----------|
| `AdministratorAccess` для CI bot | Role: `s3:PutObject` на `arn:.../artifacts/*` |
| Shared root account password | Root MFA, не используется daily |
| One prod role for all apps | Per-service IAM role |

## IAM компоненты (универсально)

| Компонент | Описание |
|-----------|----------|
| **Identity** | User, group, service account |
| **Policy** | JSON/YAML: Allow/Deny actions on resources |
| **Role** | Набор policies; assumable другим identity |
| **Resource** | S3 bucket, K8s namespace, VM |

Cloud-agnostic mental model; синтаксис differs (AWS IAM vs GCP IAM vs Azure RBAC).

## Policy structure (концепт AWS-style)

```json
{
  "Effect": "Allow",
  "Action": ["s3:GetObject"],
  "Resource": "arn:aws:s3:::example-bucket/reports/*",
  "Condition": {
    "IpAddress": { "aws:SourceIp": "10.0.0.0/8" }
  }
}
```

| Element | Security use |
|---------|--------------|
| **Condition** | IP, MFA present, time-bound |
| **Deny** | Explicit deny wins over allow |
| **Resource ARN** | Scope narrow paths |

## Human access patterns

| Pattern | Когда |
|---------|-------|
| **SSO (SAML/OIDC)** | Corporate login → cloud roles |
| **No long-lived keys** | Humans use temporary creds |
| **Break-glass admin** | Emergency only, logged |
| **MFA mandatory** | All console access |

## Service accounts / workload identity

Приложение в K8s не должно использовать static `AWS_ACCESS_KEY` в Secret.

| Approach | Benefit |
|----------|---------|
| **IRSA** (AWS) / Workload Identity (GCP) | Pod → role mapping, short-lived tokens |
| **Scoped role per deployment** | Compromise one pod ≠ full account |

## RBAC vs IAM

| Layer | Scope |
|-------|-------|
| **Cloud IAM** | S3, RDS, EC2 API |
| **K8s RBAC** | pods, secrets inside cluster |

Оба нужны — см. [kubernetes-security.md](kubernetes-security.md).

## Anti-patterns

| Pattern | Risk |
|---------|------|
| `*:*` on `*` | Full account takeover if leaked |
| Same creds dev/prod | Dev leak → prod breach |
| Never review access | Orphaned admin from ex-employee |
| Policy copy-paste | Excess S3 List on all buckets |

## Access review cadence

| Frequency | Action |
|-----------|--------|
| Quarterly | Remove unused users/keys |
| On offboarding | Disable within 24h |
| On role change | Adjust group membership |
| Automated | Alert on admin policy attach |

Tools: cloud IAM analyzer, Steampipe, Prowler (read-only audit).

## JIT access (Just-In-Time)

Temporary elevation:

1. Engineer requests `prod-db-read` на 2 часа
2. Approver + ticket
3. Auto-revoke

Снижает standing privilege.

## Checklist нового сервиса

- [ ] Dedicated service account / role (not shared)
- [ ] Policy scoped to resource ARNs, not `*`
- [ ] No static keys in K8s Secret if IRSA available
- [ ] Humans via SSO, no IAM user per developer with keys
- [ ] MFA on root and privileged groups
- [ ] CloudTrail / audit logs enabled ([раздел 08](../08-runtime-monitoring/logging-audit-trail.md))

## Упражнение

Спроектируйте IAM для «backup worker»:

- Пишет в `s3://backups-example/app/`
- Читает из RDS snapshot API (describe + export only)
- Запускается как K8s CronJob

Запишите: identity type, минимальный список actions, что **явно Deny**.

---

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

1. Чем authentication отличается от authorization?
2. Что такое least privilege на бытовом примере?
3. Почему static AWS keys в pod — anti-pattern?
4. Зачем quarterly access review?

## Дальше

[Сети и сегментация](seti-segmentaciya.md)
