# 🔒 Security & Production Guide - Aggios

## 🔐 Guia de Segurança

### 1. Secrets Management

#### ⚠️ NUNCA commitear secrets

```bash
# ❌ ERRADO
DB_PASSWORD=minha_senha_secreta
JWT_SECRET=abc123

# ✅ CORRETO
# .env (não versionado no git)
DB_PASSWORD=${DB_PASSWORD}
JWT_SECRET=${JWT_SECRET}

# Usar HashiCorp Vault / AWS Secrets Manager / etc
```

#### Geração de Secrets Seguros

```bash
# JWT Secret (32+ caracteres aleatórios)
openssl rand -base64 32

# Senhas de Banco
openssl rand -base64 24

# Tokens de API
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
```

### 2. Environment Configuration

#### Development (.env.local)
```env
ENV=development
DB_SSL_MODE=disable
JWT_SECRET=local_dev_key_not_secure
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:3001
MINIO_USE_SSL=false
```

#### Staging (.env.staging)
```env
ENV=staging
DB_SSL_MODE=require
JWT_SECRET=$(openssl rand -base64 32)
CORS_ALLOWED_ORIGINS=https://staging.aggios.app
MINIO_USE_SSL=true
```

#### Production (.env.production)
```env
ENV=production
DB_SSL_MODE=require
DB_POOL_SIZE=50
JWT_SECRET=$(openssl rand -base64 32)
JWT_EXPIRATION=2h
REFRESH_TOKEN_EXPIRATION=30d
CORS_ALLOWED_ORIGINS=https://aggios.app,https://dash.aggios.app
MINIO_USE_SSL=true
RATE_LIMIT_REQUESTS=50
RATE_LIMIT_WINDOW=60
SENTRY_DSN=https://xxx@sentry.io/project
LOG_LEVEL=info
```

### 3. JWT Security

#### Token Expiration Strategy
```
Access Token
├── Duração: 15-30 minutos
├── Escopo: operações sensíveis
└── Armazenar: memória

Refresh Token
├── Duração: 7-30 dias
├── Escopo: renovar access token
└── Armazenar: secure HTTP-only cookie
```

#### Prevent Token Abuse
```go
// 1. Revoke tokens on logout
DELETE FROM refresh_tokens WHERE user_id = ? AND token_hash = ?

// 2. Invalidate on password change
DELETE FROM refresh_tokens WHERE user_id = ?

// 3. Track token usage
INSERT INTO token_audit (user_id, action, timestamp)

// 4. Detect suspicious activity
SELECT * FROM token_audit 
WHERE user_id = ? AND created_at > now() - interval '1 hour'
HAVING count(*) > 100
```

### 4. Password Security

#### Hashing com Argon2
```go
// ✅ CORRETO: Argon2id
hash := argon2.IDKey(
    password, salt,
    time: 3,      // iterations
    memory: 65536, // 64 MB
    parallelism: 4,
    keyLength: 32
)

// ❌ EVITAR
// - MD5
// - SHA1
// - SHA256 sem salt
// - bcrypt (mais fraco que Argon2)
```

#### Password Policy
```
Mínimo 12 caracteres em produção
├── Incluir maiúsculas (A-Z)
├── Incluir minúsculas (a-z)
├── Incluir números (0-9)
├── Incluir símbolos (!@#$%^&*)
├── Não reutilizar últimas 5 senhas
├── Expiração: opcional (preferir MFA)
└── Histórico: manter por 1 ano
```

### 5. HTTPS/TLS

#### Certificados (Let's Encrypt via Traefik)
```yaml
certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@aggios.app
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web
      tlsChallenge: {} # fallback
```

#### Security Headers (Traefik)
```yaml
middlewares:
  security-headers:
    headers:
      contentTypeNosniff: true          # X-Content-Type-Options: nosniff
      browserXssFilter: true             # X-XSS-Protection: 1; mode=block
      forceSTSHeader: true               # Strict-Transport-Security
      stsSeconds: 31536000               # 1 ano
      stsIncludeSubdomains: true
      stsPreload: true                  # HSTS preload list
      customFrameOptionsValue: SAMEORIGIN # X-Frame-Options
```

### 6. Database Security

#### PostgreSQL Security
```sql
-- 1. Criar usuário dedicado (sem superuser)
CREATE USER aggios WITH PASSWORD 'strong_password_here';
GRANT CONNECT ON DATABASE aggios_db TO aggios;
GRANT USAGE ON SCHEMA public TO aggios;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO aggios;

-- 2. Habilitar SSL
-- postgresql.conf
ssl = on
ssl_cert_file = '/path/to/server.crt'
ssl_key_file = '/path/to/server.key'

-- 3. Restrict connections
-- pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    aggios_db       aggios          127.0.0.1/32            md5
host    aggios_db       aggios          ::1/128                 md5
# Replicação (se houver)
host    replication     replication     192.168.1.0/24          md5

-- 4. Row Level Security (RLS)
ALTER TABLE users ENABLE ROW LEVEL SECURITY;

CREATE POLICY user_isolation ON users FOR SELECT
    USING (tenant_id = current_setting('app.current_tenant')::uuid);

-- 5. Audit Logging
CREATE TABLE audit_log (
    id BIGSERIAL PRIMARY KEY,
    table_name TEXT,
    operation TEXT,
    old_data JSONB,
    new_data JSONB,
    user_id UUID,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

#### SQL Injection Prevention
```go
// ✅ CORRETO: Prepared Statements
query := "SELECT * FROM users WHERE email = ? AND tenant_id = ?"
rows, err := db.Query(query, email, tenantID)

// ❌ ERRADO: String concatenation
query := fmt.Sprintf("SELECT * FROM users WHERE email = '%s'", email)
rows, err := db.Query(query)
```

### 7. Redis Security

#### Redis Authentication
```yaml
# docker-compose.yml
redis:
  command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
  environment:
    REDIS_PASSWORD: ${REDIS_PASSWORD}
```

#### Redis ACL (Redis 6+)
```bash
# Criar usuário readonly para cache
ACL SETUSER cache_user on >cache_password \
  +get +strlen +exists +type \
  ~cache:* \
  &default
```

### 8. MinIO Security

#### Bucket Policies
```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::minioadmin:user/backend"
      },
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": "arn:aws:s3:::aggios/tenant-123/*"
    }
  ]
}
```

#### Versioning & Lifecycle
```bash
# Habilitar versionamento
mc version enable minio/aggios

# Lifecycle rules (delete old versions after 90 days)
mc ilm rule list minio/aggios
```

### 9. API Security

#### Rate Limiting
```go
// Implementar com Redis
const (
    maxRequests = 100           // por window
    windowSize  = 60 * time.Second
)

// Por IP
key := fmt.Sprintf("rate_limit:%s", clientIP)
count, _ := redis.Incr(key)
redis.Expire(key, windowSize)

if count > maxRequests {
    http.Error(w, "Too many requests", http.StatusTooManyRequests)
}
```

#### CORS Configuration
```go
// Whitelist específico
allowedOrigins := []string{
    "https://aggios.app",
    "https://dash.aggios.app",
    "https://admin.aggios.app",
}

// Validar cada request
origin := r.Header.Get("Origin")
for _, allowed := range allowedOrigins {
    if origin == allowed {
        w.Header().Set("Access-Control-Allow-Origin", origin)
        break
    }
}
```

#### Input Validation
```go
// Sempre validar
if !emailRegex.MatchString(email) {
    return errors.New("invalid email")
}

if len(password) < 12 {
    return errors.New("password too weak")
}

if !subdomain.IsValidFormat() {
    return errors.New("invalid subdomain")
}
```

### 10. Monitoring & Alerting

#### Detectar Anomalias
```yaml
# Prometheus alerting rules
groups:
  - name: security
    rules:
      - alert: HighFailedLogins
        expr: increase(login_failures_total[5m]) > 10
        annotations:
          summary: "High rate of failed logins"
      
      - alert: UnusualAPIActivity
        expr: rate(api_requests_total[5m]) > 1000
        annotations:
          summary: "Unusual API activity detected"
      
      - alert: DatabaseConnectionPool
        expr: pg_stat_activity_count > 45
        annotations:
          summary: "Database connection pool near limit"
```

---

## ✅ Production Checklist

### Infrastructure
- [ ] DNS configurado e propagado
- [ ] SSL/TLS certificados válidos (Let's Encrypt)
- [ ] Firewall configurado (UFW/Security Groups)
- [ ] SSH keys em vez de passwords
- [ ] VPN para acesso administrativo
- [ ] Load balancer configurado
- [ ] CDN para assets estáticos (Cloudflare)
- [ ] DDoS protection habilitado

### Database
- [ ] PostgreSQL em production mode
- [ ] SSL obrigatório nas conexões
- [ ] Backups automatizados (diários)
- [ ] Replicação configurada (alta disponibilidade)
- [ ] Restore testing documentado
- [ ] Slow query logging habilitado
- [ ] Índices otimizados
- [ ] Vacuuming configurado

### Application
- [ ] Environment variables definidas
- [ ] Secrets em vault (não em .env)
- [ ] JWT_SECRET de 32+ caracteres
- [ ] Logging estruturado habilitado
- [ ] Error tracking (Sentry)
- [ ] APM (Application Performance Monitoring)
- [ ] Health checks implementados
- [ ] Graceful shutdown

### Security
- [ ] HTTPS everywhere
- [ ] HSTS headers
- [ ] CSP headers configurados
- [ ] CORS restritivo
- [ ] Rate limiting ativo
- [ ] Authentication forte (JWT + MFA opcional)
- [ ] Password hashing (Argon2)
- [ ] SQL injection prevention (prepared statements)
- [ ] XSS protection
- [ ] CSRF tokens

### Secrets
- [ ] JWT_SECRET rotacionado
- [ ] DB_PASSWORD complexa (32+ chars)
- [ ] REDIS_PASSWORD configurada
- [ ] MINIO secrets seguros
- [ ] API keys armazenadas em vault
- [ ] Nenhum secret em git
- [ ] Rotation policy documentada
- [ ] Audit trail de acessos

### Testing
- [ ] Unit tests (>80% coverage)
- [ ] Integration tests
- [ ] Load tests
- [ ] Security tests (OWASP Top 10)
- [ ] Penetration testing
- [ ] Disaster recovery drill

### Monitoring
- [ ] Logs centralizados (ELK)
- [ ] Métricas (Prometheus)
- [ ] Alertas configurados
- [ ] Dashboard criado (Grafana)
- [ ] Uptime monitoring (Pingdom)
- [ ] Error tracking (Sentry)
- [ ] Performance metrics

### Documentation
- [ ] Runbook de incidents
- [ ] Playbook de escalação
- [ ] Procedure de rollback
- [ ] Disaster recovery plan
- [ ] API documentation
- [ ] Architecture diagrams
- [ ] Onboarding guide

### Compliance
- [ ] GDPR compliance (se EU)
- [ ] LGPD compliance (se Brazil)
- [ ] Data retention policy
- [ ] Privacy policy atualizada
- [ ] Terms of service
- [ ] Cookie policy
- [ ] Audit logging enabled
- [ ] Penetration test report

### Deployment
- [ ] CI/CD pipeline configurado
- [ ] Blue-green deployment
- [ ] Canary releases
- [ ] Automated rollback
- [ ] Version control enabled
- [ ] Change log maintained
- [ ] Deployment approval process
- [ ] Zero-downtime deployments

### Maintenance
- [ ] Backup retention policy
- [ ] Log retention policy
- [ ] Certificate renewal automated
- [ ] Package updates scheduled
- [ ] Security patches applied
- [ ] Documentation updated
- [ ] Team training completed
- [ ] Incident response team assigned

---

## 🆘 Incident Response

### Senha Comprometida
1. Invalidar todos os tokens JWT
2. Forçar password reset do usuário
3. Auditar atividade recente
4. Notificar usuário
5. Revisar outros usuários da organização

### Ataque DDoS
1. Ativar WAF/DDoS protection
2. Rate limiting agressivo
3. Escalate para CDN (Cloudflare)
4. Análise de tráfego
5. Documentar attack pattern

### Data Breach
1. Detectar scope do leak
2. Notificar usuários afetados
3. GDPR/LGPD notification
4. Investigação forense
5. Patch vulnerabilidade
6. Audit trail completo

---

## 📚 Referências de Segurança

- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [CWE/SANS Top 25](https://cwe.mitre.org/top25/)
- [PostgreSQL Security](https://www.postgresql.org/docs/current/sql-createrole.html)
- [JWT Best Practices](https://tools.ietf.org/html/rfc8725)
- [NIST Cybersecurity Framework](https://www.nist.gov/cyberframework)

---

**Última atualização**: Dezembro 2025
**Versão**: 1.0.0
**Responsabilidade**: DevOps + Security Team
