Seguridad local
- Normativa
- Borrador 1.0
- Actualizado
- Ver como Markdown
10.1 Línea base
Escuchar solo en localhost no es seguridad absoluta: una página web maliciosa aún puede intentar acceder a los puertos locales. Por eso LMSP combina varias medidas.
- Un servicio DEBE enlazarse por defecto a las direcciones loopback. NO DEBE escuchar en
0.0.0.0ni en ninguna otra dirección que no sea loopback, salvo que el modo LAN esté activado (sección 10.5). - En la primera ejecución, un servicio DEBERÍA generar un secreto de servicio aleatorio de alta entropía y usarlo, en lugar de cualquier valor por defecto incorporado, para emitir y verificar tokens.
- Toda solicitud a la interfaz principal DEBE llevar un token de portador válido, salvo los endpoints de arranque enumerados en la sección 4.2. Provenir de loopback nunca basta por sí solo.
10.2 Emparejamiento y tokens
Un cliente obtiene su propio token de portador con un código de emparejamiento local. El usuario pide al servicio que muestre un código de emparejamiento, del modo que el servicio ofrezca, y el cliente lo envía:
POST /lmsp/v1/pair
Content-Type: application/json
{
"client_name": "example-client",
"pairing_code": "K7QD-4M2X",
"scopes": ["inference"]
}
| Campo de la solicitud | Significado |
|---|---|
client_name |
Nombre para mostrar del cliente, que se muestra al usuario. |
pairing_code |
El código que el usuario obtuvo del servicio. |
scopes |
Lista opcional de ámbitos solicitados. Por defecto es ["inference"]. |
El servicio responde con un token. El token_type es siempre Bearer:
{
"client_id": "cli_01J8MAT3W6X9B2D5F8H1K4N7QZ",
"access_token": "lmsp_example_3f9a1c52e7d84b60",
"token_type": "Bearer",
"scopes": ["inference"]
}
Después, el cliente envía Authorization: Bearer <token> con cada solicitud.
- Un código de emparejamiento DEBE ser de un solo uso y DEBERÍA caducar en un plazo de 5 minutos. DEBERÍA tener al menos 40 bits de entropía. Un servicio DEBE limitar la frecuencia de los intentos fallidos. Un código incorrecto o caducado se responde con
401yunauthorized. - Los tokens son independientes para cada cliente, de modo que el usuario puede revocar uno sin afectar a los demás. Un servicio DEBERÍA permitir al usuario listar y revocar los clientes emparejados.
- Un cliente DEBERÍA guardar su token en el llavero o en el administrador de credenciales del sistema operativo. Un servicio DEBERÍA almacenar solo un hash de cada token.
- Un token ausente, no válido o revocado se responde con
401,unauthorizedy una cabeceraWWW-Authenticate: Bearer. Un token válido que carece del ámbito que necesita un endpoint se responde con403yforbidden.
10.3 Ámbitos
Los permisos se dividen en ámbitos distintos. Descargar modelos, eliminar modelos y ejecutar herramientas nunca viajan con el ámbito de inferencia.
| Ámbito | Permite |
|---|---|
inference |
Leer el catálogo de modelos, crear respuestas y tareas, y leer y cancelar las tareas del propio cliente. |
models:manage |
Cargar y liberar modelos de la memoria. |
models:install |
Reservado. Descargar y eliminar modelos. |
tools:execute |
Reservado. Ejecutar herramientas en el lado del servicio. |
Las tareas y las respuestas almacenadas pertenecen al cliente que las creó. Un servicio DEBERÍA responder a la solicitud de otro cliente como si no existieran (task_not_found o response_not_found).
10.4 Protecciones del navegador y de la red
- Un servicio DEBE rechazar por defecto las solicitudes de navegador de origen cruzado, y permitir solo los valores de
Originconfigurados explícitamente. Una solicitud con cualquier otroOriginse responde con403yforbidden. - Cuando se permite un origen, el servicio responde a sus solicitudes previas CORS y envía
Access-Control-Allow-Origincon ese origen exacto, nunca con*. - Un servicio DEBE validar la cabecera
Host, para evitar el DNS rebinding. Solo acepta los nombres de host que sirve: los nombres y direcciones loopback, más los nombres configurados para el modo LAN. Cualquier otro valor se responde con403yforbidden.
10.5 Modo LAN
El modo LAN significa escuchar más allá de las direcciones loopback.
- Un servicio NO DEBE activar el modo LAN salvo que el usuario lo habilite explícitamente.
- En modo LAN, un servicio DEBE exigir autenticación y DEBERÍA activar también TLS. Un cliente NO DEBERÍA enviar un token por HTTP sin cifrar a una dirección que no sea loopback, salvo que el usuario lo permita explícitamente.
- El anuncio mDNS solo se permite en modo LAN, cuando el usuario ha activado además el descubrimiento en la LAN (sección 3.2).
10.6 Registro y privacidad
- Las rutas de modelos, los registros, los prompts y el contenido generado NO DEBEN aparecer en los anuncios mDNS.
- Por defecto, un servicio DEBERÍA registrar solo metadatos (horas, endpoints, códigos de estado, ids, recuentos de tokens y duraciones). NO DEBERÍA registrar prompts completos ni contenido generado.
- Las respuestas de estado y los detalles de error NO DEBEN contener rutas de modelos, prompts, tokens de acceso ni otra información sensible.