# Security — Fundamental Skill

Skill para prácticas de seguridad en ventures de Fundamental. Usar al implementar auth, manejar secrets, revisar dependencias, o escribir código que procesa input de usuario.

---

## Auth Patterns

### JWT (JSON Web Token)
Stateless. Token contiene claims. Ideal para APIs.
- ✅ Access token 15 min. Refresh token 7 días. Rotá secret al detectar uso malicioso
- ❌ Nunca guardes información sensible en el payload (no está encriptado)

### OAuth 2.0 / OIDC
Third-party login o service-to-service.
- ✅ Usá provider consolidado (Auth0, Clerk, Firebase Auth)
- ❌ No aceptes tokens de providers fuera de tu allowlist. Validá issuer y audience

### API Keys
Identifican cliente, no usuario. Webhooks, integraciones B2B.
- ✅ Prefijo sk_live_xxx. Guardá solo hash en DB. Mostrá key una sola vez
- ❌ No para autenticar usuarios. No en URLs (quedan en logs)

---

## Secrets — 5 reglas de oro

1. Nunca hardcodees secrets. Si commiteaste uno, rotalo inmediatamente.
2. .env en desarrollo (.gitignore). Vault en producción (1Password, HashiCorp, AWS Secrets Manager)
3. Cada entorno tiene sus propios secrets
4. Rotá secrets periódicamente. 6 meses = bomba de tiempo
5. Si un secret se filtró, asumí compromiso. Rotalo y auditá acceso

---

## OWASP Top 7

1. **Broken Access Control**: Validá permisos en cada endpoint, no solo frontend. Middleware de autorización por rol.
2. **Cryptographic Failures**: HTTPS everywhere. HSTS. bcrypt/argon2 para passwords. AES-256 para datos en reposo.
3. **Injection**: Nunca concatenes strings para SQL. ORMs o prepared statements ($1, $2). Validá y sanitizá todo input.
4. **Insecure Design**: Threat modeling en features nuevas. ¿Qué pasa si un usuario malicioso usa esto?
5. **Security Misconfiguration**: Debug off en prod. CSP, X-Frame-Options, Helmet.js.
6. **Vulnerable Components**: Dependabot/Renovate. Auditá semanalmente. Reemplazá dependencias sin mantenimiento.
7. **Auth Failures**: Rate limiting en /login. MFA para admins. Password: mínimo 12 chars.

---

## Dependencias

1. Bloqueá pipeline si hay vulnerabilidades critical/high
2. Dependabot/Renovate con auto-merge para parches (semver patch)
3. Auditá salud del paquete antes de instalar: ¿mantenimiento activo? ¿contributors?
4. Lockfile commiteado siempre. CI usa --frozen-lockfile
5. SBOM (Software Bill of Materials): sabé exactamente qué dependencias tenés

---

## Código Seguro

### Input validation
1. Nunca confíes en el input del usuario — validá en backend aunque hayas validado en frontend
2. Whitelist, no blacklist — definí qué es válido, no qué es prohibido
3. Escapá output según contexto — HTML entities, parameterized queries, encodeURIComponent
4. Usá librerías de validación — Zod, Joi. No regex a mano
5. Limitá tamaño de input — body parser con límite (1MB para JSON)

### Prácticas
1. **Prepared statements**: Nunca concatenar strings para SQL. $1, $2 para raw SQL.
2. **CORS restrictivo**: Origin específico, no *. Methods solo los usados.
3. **Rate limiting**: /login, /register, /reset-password. Bloqueo progresivo.
4. **Logs sin datos sensibles**: Nunca loguees passwords, tokens, datos de tarjeta.
5. **Headers de seguridad**: CSP, HSTS, X-Content-Type-Options, X-Frame-Options. Helmet.js.
6. **CSRF protection**: Tokens CSRF en formularios. SameSite=Strict/Lax en cookies.
