Skip to main content
Jenks Guo

Documentación / explanation

Seguridad y privacidad

Qué pueden hacer las interfaces pública y de administración, cómo SSO, los tokens de servicio para agentes, el registro de auditoría y el acceso a GitHub las protegen, y qué ocurre con los datos de los visitantes.

Dos tipos de acceso

Público — cualquiera, sin credenciales. La REST API (/api/v1/*), el servidor MCP público (/mcp), los comandos públicos del CLI y los archivos estáticos son solo de lectura. Exponen únicamente el corpus publicado, que es público por diseño. ask_jenks y el chat del sitio llaman a un modelo de lenguaje, por lo que tienen límite de velocidad por dirección IP para impedir abusos.

Admin — Jenks, y los agentes de IA a los que él les da un token. /api/admin/*, /mcp/admin, jenks admin … y la consola pueden validar, escribir y eliminar archivos de contenido, subir y borrar archivos multimedia, y promocionar dev a main. Eso es poder real, así que hay tres capas.

Inicio de sesión para personas: SSO

La consola está en https://admin.jenksguo.xyz/admin (y https://admin.dev.jenksguo.xyz/admin para el sitio de desarrollo). Cloudflare Access está delante de esos hosts: nadie accede a la consola hasta que inicia sesión con una cuenta de Google permitida. /admin en cualquier otra dirección redirige allí.

El Worker no confía simplemente en los encabezados de Cloudflare. En cada solicitud de administración verifica por sí mismo el token de Access firmado — la firma contra las claves públicas del equipo de Access, la etiqueta de audiencia de la aplicación, el emisor y la expiración — y el correo electrónico debe estar en la lista de administradores.

Tokens de servicio para agentes

Un agente de IA nunca usa el inicio de sesión de Jenks. Jenks crea un token de servicio para cada agente en la consola (Access → New agent token):

  • Nombrado — "Claude Code on MacBook", para que el registro de auditoría indique qué agente hizo qué.
  • Con alcance — content (contenido, traducciones y textos del sitio), media (la biblioteca multimedia), publish (escribir directamente en producción y promover dev → main). Todo token puede leer. Sin publish, un agente guarda en dev y Jenks promueve el cambio.
  • Con vencimiento — de 30 a 365 días (90 por defecto).
  • Revocable — un clic, efectivo en la siguiente solicitud.
  • Vinculado a SSO — solo una persona autenticada mediante Access puede crear, listar o revocar tokens; un token de agente no puede crear otro token. Un token también deja de funcionar si la persona que lo creó deja de ser admin.
  • Almacenado como hash — el token se muestra una vez, cuando se crea; la base de datos guarda solo su hash SHA-256.

Los agentes envían el token como Authorization: Bearer jgx_agt_… a /api/admin/* o /mcp/admin en https://jenksguo.pages.dev (Access detendría a un programa en el host de administración). Los navegadores no envían ese encabezado por sí solos, así que una página maliciosa no puede tomarlo prestado.

El registro de auditoría

Cada escritura de administración — y cada intento rechazado — queda registrada: quién (un correo o agent:<name>), qué herramienta, qué archivos, rama, host, y el resultado o error. La creación y revocación de tokens también se registran. El contenido de los archivos nunca se registra. Jenks lee el registro en la consola (Access); un agente solo puede leer sus propias entradas (admin_audit_log). El historial de Git sigue siendo el registro de lo que cambió en el contenido en sí.

El token de administrador de emergencia (break-glass)

El token de administrador original sigue funcionando, para emergencias, pero no puede crear tokens de agente. Vive en el Llavero de macOS como agent-env:JENKSGUO_ADMIN_TOKEN y como un secreto cifrado del Worker, y se compara en tiempo constante. Rótalo si pudo haberse filtrado: guarda un valor nuevo en el Llavero y en el secreto del Worker, y el anterior deja de funcionar al instante. Solo para desarrollo local (wrangler dev en localhost) la consola puede iniciar sesión con él: el token se intercambia una vez por una cookie de sesión HttpOnly.

Qué puede tocar la API de administración

Las escrituras están limitadas a una lista de permitidos de rutas de contenido — las entradas del corpus, lentes, habilidades, documentos centrales, el glosario de traducción y estos docs. No puede cambiar código, flujos de trabajo, secretos ni nada fuera de content/. Cada escritura se valida primero contra el esquema de contenido.

Archivos multimedia

Las imágenes, videos y PDFs subidos a través de las interfaces de administración se almacenan en un bucket Cloudflare R2 y se sirven desde /media/…. Son públicos por dirección desde el momento en que se suben, así que solo pertenece allí material destinado a todo visitante.

  • El tipo de archivo se detecta a partir de los bytes, no del nombre, y solo se aceptan formatos web de imagen, video y PDF (25 MB cada uno).
  • Se rechazan imágenes SVG si contienen scripts o manejadores de eventos, y todo SVG se sirve dentro de una zona de seguridad de contenido, por lo que incluso un SVG manipulado abierto directamente no puede ejecutar código en este sitio.
  • A diferencia del contenido, los medios no están en git: la eliminación es permanente. Se rechazan eliminaciones mientras el contenido publicado siga usando el archivo.

Acceso a GitHub

Las escrituras de administración se convierten en commits a través de la API de GitHub usando un token de acceso personal de alcance fino limitado al repositorio único, con solo los permisos que la publicación necesita. Se almacena como un secreto cifrado del Worker. Como cada cambio es un commit:

  • el historial de git registra cada cambio — qué cambió, cuándo y por qué (el mensaje de commit; el tráiler del commit nombra al agente),
  • siempre es posible deshacer — cualquier versión anterior de cualquier archivo puede restaurarse.

Los cambios arriesgados pueden prepararse en la rama dev y verificarse en https://dev.jenksguo.xyz antes de que algo llegue al sitio en vivo.

Privacidad de los visitantes

  • Sin rastreadores de publicidad ni cookies de marketing.
  • La transcripción del chat se mantiene solo en el navegador del visitante (sessionStorage) y se borra cuando la pestaña se cierra. El sitio no almacena transcripciones de chat.
  • Los mensajes del chat se envían a través del Cloudflare Worker a OpenRouter, que los enruta a un modelo de lenguaje de terceros. Se pide a los visitantes que no compartan información personal sensible.
  • La voz está desactivada hasta que el visitante toque el micrófono, y se apaga sola después de diez turnos o cuando no detecta una conversación real. La entrada de voz usa el propio reconocimiento de voz del navegador cuando está disponible; de lo contrario, el audio se envía a OpenRouter para su transcripción. Las respuestas habladas se generan con Cloudflare Workers AI (Deepgram Aura-2, inglés) u OpenRouter (otros idiomas), con la síntesis de voz del dispositivo como alternativa. No se almacenan grabaciones ni audio generado.
  • Cloudflare conserva registros de solicitudes estándar para seguridad y limitación de velocidad.

Privacidad del contenido

Todo lo que está bajo content/ es público. Los currículums de Jenks contenían números de teléfono, una dirección particular y contactos de referencias; nada de eso está en el corpus, y nunca debe añadirse. Los hechos sobre otras personas se limitan a lo necesario para describir las funciones de Jenks.

Informar de un problema

Envía un correo a jenksguo@gmail.com con los detalles. Por favor, no pruebes la interfaz de administración sin permiso.

.mdEsta página está traducida con ayuda de IA; los títulos oficiales permanecen en inglés.