Seguridad y buenas prácticas

API de Revendedores

La API está diseñada partiendo de la base de que cada llamada tiene impacto financiero directo y puede acceder a credenciales sensibles del servidor. Por ello, los requisitos de seguridad están claramente por encima del estándar habitual en REST.

Controles aplicados

  • HMAC-SHA256: Cada petición se firma con HMAC-SHA256 sobre método, ruta, marca de tiempo, nonce y hash del cuerpo. Verificación en tiempo constante (hash_equals).
  • AES-256-GCM: Los secretos se almacenan persistentemente solo como cifrado AES-256-GCM (libsodium). La clave maestra reside fuera de la base de datos en /etc/kh-reseller-api/master.key.v{N}.
  • Replay protection: Ventana de marca de tiempo +-300s, caché de nonce 600s. Una petición firmada correctamente no puede reenviarse.
  • Scope-based authorization: Lista de permisos explícita por clave. Los permisos de escritura y sensibles deben activarse de forma explícita.
  • IP whitelist (optional): Lista blanca de IP opcional por clave (notación CIDR, IPv4 e IPv6).
  • Rate limit: Multinivel: por clave (minuto y día) y por IP (minuto). Cubo de tokens con tolerancia a ráfagas.
  • Idempotency: Los pedidos y las acciones de servicio destructivas requieren Idempotency-Key. 24h de protección contra repetición frente a reintentos de red.
  • Tenant isolation: Cada consulta a la base de datos filtra estrictamente por el identificador de su cuenta. El acceso entre clientes es imposible por construcción.
  • Tamper-evident audit log: Cada petición se registra en el log de auditoría con hash en cadena (chain_hash[n] = sha256(chain_hash[n-1] || row_n)). Cualquier manipulación retroactiva se detecta por la ruptura del hash.
  • Credentials.read alerting: Cada llamada credentials.read genera una entrada de auditoría dedicada y, opcionalmente, un correo de confirmación al titular de la cuenta.
  • SSRF-guarded webhooks: Las URLs de webhook se validan antes de almacenarse: solo HTTPS, la resolución DNS solo puede devolver IPs públicas (sin RFC1918, sin link-local).

Buenas prácticas en su lado

  • Guarde el secreto en un gestor de secretos (HashiCorp Vault, AWS Secrets Manager, Doppler, 1Password); nunca en el código, nunca en un repositorio git.
  • Rote el secreto con regularidad (al menos anualmente o tras cambios de personal). Rotación con un solo clic en el portal, el secreto anterior queda invalidado de inmediato.
  • Una clave dedicada por caso de uso con el permiso mínimo (solo lectura si es posible). Nada de claves "todo permitido".
  • Si su integración se ejecuta desde IPs fijas (cloud, bastión), configure una lista blanca de IP.
  • Genere el Idempotency-Key en su servidor y persístalo, no lo genere de nuevo en cada reintento. Recomendación: UUIDv4 por cada pedido lógico.
  • Configure un webhook hacia su propia URL y vigile al menos order.created y credentials.read como flujo de eventos.

Divulgación de seguridad

Por favor, comunique los problemas de seguridad de forma confidencial a security@kernelhost.com. Clave PGP bajo petición. Respuesta garantizada en 24h. Programa bug-bounty en preparación.