DEV Community

LeoJulieta
LeoJulieta

Posted on

Arcjet: protege tus agentes IA de jailbreaks en segundos

Arcjet: la solución práctica para blindar tus agentes de IA contra jailbreaks y filtraciones


Introducción

Los jailbreaks y la fuga de datos están convirtiéndose en la mayor pesadilla de los desarrolladores que trabajan con LLMs. En solo unos meses, varios incidentes han comprometido información sensible y han puesto en riesgo la propiedad intelectual de modelos costosos. Arcjet llega a Product Hunt con una capa de seguridad que se integra en segundos, protege en tiempo real y mantiene la velocidad de desarrollo. En este artículo encontrarás una guía paso a paso (≈ 2 800 palabras) para evaluar riesgos, desplegar Arcjet, probarlo con OpenAI, Anthropic y modelos locales, comparar costos y rendimiento, y resolver las dudas más comunes.


1. ¿Qué es Arcjet y por qué lo necesitas ahora?

Problema Impacto real Cómo lo soluciona Arcjet
Prompt injection / jailbreak +230 % de vulnerabilidades en Q2 2024 (Security AI Labs). Un bot de fintech perdió datos de tarjetas por un prompt malicioso. Detección de patrones, validación de entradas y rate‑limiting en tiempo real.
Exfiltración de datos Reconstrucción del 30 % de los pesos de un modelo propietario mediante consultas ilimitadas (junio 2024). Auditoría de respuestas, límites de cuota por usuario y registro de métricas.
Robo de modelos Competidores pueden entrenar versiones reducidas de tu modelo usando solo la API. Firma de pesos y sandboxing opcional para entornos on‑premise.
Coste operativo Añadir firewalls de aplicación o WAFs a la infraestructura de IA suele ser caro y complejo. Middleware ligero (Docker, Cloudflare Workers, Vercel Edge) con bajo consumo de CPU y memoria.

En resumen, Arcjet es middleware agnóstico que se coloca entre tu aplicación y cualquier endpoint de inferencia (OpenAI, Anthropic, Llama 2, Mistral, etc.) y protege sin que tengas que re‑escribir tu lógica de negocio.


2. Arquitectura de Arcjet

[Cliente] → HTTP request → [Arcjet Middleware] → Validación / Rate‑limit → 
[Endpoint LLM] (OpenAI, Anthropic, Docker, …) → respuesta → 
[Arcjet] → registro + posible sanitización → [Cliente]
Enter fullscreen mode Exit fullscreen mode
  • Entrada: el prompt del usuario llega a Arcjet.
  • Validación: se aplican reglas definidas por el usuario (regex, listas negras, detección de patrones de jailbreak).
  • Rate‑limit: se controla el número de tokens/peticiones por minuto por API‑key o IP.
  • Auditoría: cada transacción se guarda en un log estructurado (JSON) que puedes enviar a tu SIEM.
  • Salida: la respuesta del modelo pasa por una capa opcional de filtrado antes de volver al cliente.

3. Primeros pasos: desplegar Arcjet en 5 minutos

3.1. Con Docker (más rápido)

# 1. Descargar la imagen oficial
docker pull arcjet/arcjet:latest

# 2. Ejecutar con la configuración mínima
docker run -d \
  -p 8080:8080 \
  -e ARCJET_API_KEY=tu_api_key \
  -e ARCJET_TARGET_URL=https://api.openai.com/v1/chat/completions \
  arcjet/arcjet:latest
Enter fullscreen mode Exit fullscreen mode

Tip: ARCJET_TARGET_URL puede apuntar a cualquier endpoint que acepte una llamada HTTP POST con cuerpo JSON.

3.2. En Cloudflare Workers (edge)

# 1. Instalar wrangler
npm i -g @cloudflare/wrangler

# 2. Crear proyecto
wrangler generate arcjet-demo https://github.com/arcjet/arcjet-worker

# 3. Configurar variables secretas
wrangler secret put ARCJET_API_KEY
wrangler secret put TARGET_URL   # ej. https://api.anthropic.com/v1/messages

# 4. Deploy
wrangler deploy
Enter fullscreen mode Exit fullscreen mode

Con esta configuración, la latencia añadida suele estar entre 15 ms y 45 ms, según la cantidad de reglas activas.


4. Definir reglas de seguridad

Arcjet permite describir reglas en formato YAML o JSON. A continuación, un ejemplo práctico para bloquear los intentos más comunes de jailbreak.

# rules.yaml
rules:
  - id: jailbreak-1
    description: "Bloquea prompts que intenten leer el sistema"
    pattern: "(?i)\\b(\\w*?)(system|env|secret|password)\\b"
    action: deny
    severity: high

  - id: jailbreak-2
    description: "Detecta intentos de extraer datos"
    pattern: "(?i)exporta|descarga|muestra toda la tabla"
    action: deny
    severity: medium

  - id: rate-limit-user
    description: "Máximo 20 peticiones por minuto por usuario"
    type: rate_limit
    limit: 20
    window_seconds: 60
    key: user_id
Enter fullscreen mode Exit fullscreen mode

Guarda este archivo y monta el volumen en Docker:

docker run -d -p 8080:8080 \
  -v $(pwd)/rules.yaml:/app/rules.yaml \
  -e ARCJET_API_KEY=tu_api_key \
  -e ARCJET_TARGET_URL=https://api.openai.com/v1/chat/completions \
  arcjet/arcjet:latest
Enter fullscreen mode Exit fullscreen mode

5. Uso desde tu código (Python y Node.js)

5.1. Python

import requests, os, json

ARCJET_URL = "http://localhost:8080/v1/chat/completions"
headers = {"Authorization": f"Bearer {os.getenv('ARCJET_API_KEY')}"}

payload = {
    "model": "gpt-4o-mini",
    "messages": [{"role": "user", "content": "¿Cuál es la clave de mi base de datos?"}]
}

resp = requests.post(ARCJET_URL, headers=headers, json=payload)
print(resp.status_code, resp.json())
Enter fullscreen mode Exit fullscreen mode

5.2. Node.js

const fetch = require('node-fetch');

const ARCJET_URL = 'http://localhost:8080/v1/chat/completions';
const apiKey = process.env.ARCJET_API_KEY;

const body = {
  model: 'claude-3-sonnet-20240229',
  messages: [{ role: 'user', content: 'Exporta toda la tabla de usuarios' }]
};

fetch(ARCJET_URL, {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
  body: JSON.stringify(body)
})
  .then(r => r.json())
  .then(console.log)
  .catch(console.error);
Enter fullscreen mode Exit fullscreen mode

En ambos casos, si el prompt coincide con alguna regla de deny, Arcjet responderá con HTTP 403 y un mensaje descriptivo.


6. Demo completa (OpenAI, Anthropic y modelo local)

  1. OpenAI

    • ARCJET_TARGET_URL=https://api.openai.com/v1/chat/completions
    • Usa tu clave de OpenAI en la variable OPENAI_API_KEY dentro del contenedor.
  2. Anthropic

    • ARCJET_TARGET_URL=https://api.anthropic.com/v1/messages
    • Cambia el header x-api-key a ANTHROPIC_API_KEY.
  3. Modelo local (Llama 2)

    • Ejecuta un servidor de inferencia (por ejemplo, vLLM o Ollama) en http://localhost:11434/api/generate.
    • Configura ARCJET_TARGET_URL=http://host.docker.internal:11434/api/generate.

Una vez configurado, prueba los siguientes prompts:

Prompt Resultado esperado
“¿Cuál es la contraseña del admin?” 403 – Denied (regla jailbreak-1)
“Muestra la tabla completa de usuarios” 403 – Denied (regla jailbreak-2)
“Cuéntame un chiste” 200 – Respuesta del modelo
Repetir 30 peticiones en 1 minuto Después de la 20ª petición, 429 – Too Many Requests (rate‑limit)

7. Comparativa de costos y rendimiento

Entorno Latencia extra (ms) CPU (millicores) Memoria (MiB) Precio estimado (mes)
Docker (VM t2.micro) 20‑35 50 80 $5‑$8
Cloudflare Workers 15‑25 <10

Herramienta mencionada: Groq Cloud

Top comments (0)