Saltar al contenido
ColliePWA

02/Documentation

Seguridad: leer antes de ejecutar

Lo que expone un Collie, las defensas y la vinculación de un dispositivo como credencial de escritura

Collie proporciona acceso a una shell remota en su máquina por diseño. Una sola llamada a la API de Collie envía pulsaciones de teclas arbitrarias directamente a un panel de terminal activo. Cualquier persona con acceso de red a la URL puede leer cada panel (código fuente, secretos, variables de entorno, salida del agente) y ejecutar comandos como su usuario.

No existe un sandbox ni una lista de comandos permitidos, ya que filtrar comandos anularía el propósito de la herramienta. Trate la URL como un inicio de sesión de root.

Modelo de riesgos

Límites de seguridad y riesgos clave:

  • Se ejecuta con sus permisos de usuario. Collie hereda todos sus derechos de acceso, incluidos ~/.ssh, git push --force, rm -rf y sudo.
  • La autenticación identifica dispositivos, no personas. Tailscale verifica el punto de conexión de hardware en lugar del usuario que lo tiene. No hay contraseñas ni sesiones de usuario; un teléfono desbloqueado o robado proporciona una shell abierta. Puede mitigar esto emparejando el dispositivo (abajo). El bloqueo por inactividad integrado simplemente oculta una pantalla desatendida y no proporciona un límite de seguridad real (ADR 0007).
  • Todos los usuarios locales del sistema pueden acceder al puerto. Los sockets estándar de multiplexores de terminal (tmux, zellij, herdr) utilizan permisos del sistema de archivos para restringir el acceso a otros usuarios locales. Collie escucha en un puerto TCP local, lo que lo expone a todos los UID locales. El emparejamiento o el control por dispositivo restringen el acceso de escritura, pero las operaciones de lectura permanecen accesibles para todos los usuarios locales. Esto limita los riesgos de ejecución pero no evita la divulgación de datos (ARCHITECTURE.md §6).
  • Una sola instancia expone todas las sesiones. Por defecto, un proceso de Collie gestiona cada sesión de multiplexor detectada bajo la raíz de configuración de Herdr, incluidas las sesiones de sandbox (Multisesión).
  • Las escrituras se registran en <state-dir>/audit.log, que es ~/.local/state/collie/audit.log a menos que COLLIE_STATE_DIR lo mueva. El servidor registra todas las pulsaciones de teclas entrantes, respuestas, subidas de archivos y eventos del ciclo de vida de paneles/pestañas. Tenga en cuenta que un registro de auditoría proporciona visibilidad a posteriori en lugar de control de acceso (ARCHITECTURE.md §6).
  • Controles defensivos predeterminados. Collie se vincula estrictamente a interfaces de bucle invertido (loopback), enruta el tráfico exclusivamente mediante tailscale serve o un proxy inverso equivalente, y aplica reglas estrictas de CSP, comprobaciones de mismo origen y validación de encabezados Host. La salida del panel se procesa como nodos de texto de React en lugar de innerHTML. Nunca use tailscale funnel ni exponga un puerto sin procesar. Para autorizar hardware específico, use emparejamiento directamente o, si su proxy inyecta identificadores de dispositivo, las dos variables COLLIE_DEVICE_* siguientes.
variablequé hace
COLLIE_ALLOW_NON_LOOPBACK_BIND=1Desactiva el enlace exclusivo a loopback; si no se establece, el puente rechaza vincularse a 0.0.0.0.
COLLIE_ALLOW_ANY_HOST=1Deshabilita la validación del encabezado Host, que de otro modo está activada por defecto y se bloquea por seguridad en caso de fallo.
COLLIE_TRUSTED_USERRechaza una solicitud cuyo encabezado Tailscale-User-Login falte o no coincida.
COLLIE_TRUSTED_USER_OPTIONAL=1Permite la ausencia del encabezado Tailscale-User-Login (los nodos etiquetados nunca envían uno).
COLLIE_DEVICE_HEADERNombre del encabezado que su proxy inyecta con un identificador de dispositivo.
COLLIE_DEVICE_ALLOWLISTIdentificadores de dispositivo separados por comas autorizados para escribir; todos los demás dispositivos permanecen en modo de solo lectura (docs/deployment.md).
🚫 Nunca use tailscale funnel con Collie. Funnel enruta el tráfico a internet público, mientras que tailscale serve restringe el acceso a su tailnet privada. No existe ningún caso de uso admitido para ejecutar Collie a través de Funnel.

Restrinja aún más el acceso con ACLs de Tailscale y COLLIE_TRUSTED_USER. Se proporciona tal cual, sin garantía.

Qué información sale de su máquina

Nada, por defecto y por política. Collie no envía eventos de instalación, estadísticas de uso, informes de fallos ni analíticas. No existe ninguna opción que los habilite.

La única llamada saliente no solicitada es la comprobación de actualizaciones: una petición HTTPS GET anónima a la API pública de etiquetas de GitHub (bridge/update.ts) que compara su versión con la etiqueta más reciente. No transmite datos sobre usted ni sobre su máquina, solo el user-agent estático collie-update-check.

Si alguna vez se añade recopilación de datos, el límite máximo es el consentimiento explícito: desactivado por defecto, formulado como una pregunta visible, nunca activado mediante una opción o por omisión. Eliminar esa promesa constituiría un cambio incompatible (ADR 0034).

Emparejar un dispositivo: la credencial de escritura

bin/collie pair          # on the host — prints an 8-character code and a QR code, good for 10 minutes

Abra Collie en el teléfono, vaya a SettingsPaired devices e introduzca el código con una etiqueta para el dispositivo, o escanee el código QR impreso por el comando para abrir directamente esa pantalla con el código ya rellenado. El teléfono almacena el token devuelto. Collie solo conserva el hash y el token se muestra una sola vez. No es necesario reiniciar el proceso; el daemon en ejecución aplica los emparejamientos y las revocaciones en la siguiente solicitud.

Las dos restricciones de dispositivo responden a preguntas distintas, y es posible utilizar cualquiera de ellas, ambas o ninguna:

preguntaconfía enrevocación mediante
COLLIE_DEVICE_HEADER¿está este dispositivo en la lista del operador?su proxy, para inyectar un nombre saneadola edición de COLLIE_DEVICE_ALLOWLIST y el reinicio posterior
emparejamiento¿posee este dispositivo una credencial emitida por mí?nada en la redcollie devices revoke <label> (en tiempo real)

El emparejamiento no requiere infraestructura adicional. Es adecuado para una configuración directa de tailscale serve donde no existe ningún proxy para inyectar encabezados.

Ambas opciones restringen únicamente el acceso de escritura. Las solicitudes de lectura permanecen abiertas para cualquier elemento que supere la comprobación de mismo origen.

bin/collie devices list             # what holds a credential, and when each was last seen
bin/collie devices revoke old-phone # effective immediately, no restart

La restricción de escritura solo está activa mientras haya al menos un dispositivo emparejado. Ningún dispositivo está emparejado hasta que se ejecute collie pair, por lo que hasta entonces las operaciones de lectura y escritura funcionan como antes. Empareje primero su teléfono actual. Revocar el último dispositivo desactiva la restricción nuevamente para evitar bloqueos de acceso.

Cinco intentos fallidos de código invalidan el código, lo que requiere ejecutar collie pair de nuevo.

En un host que ejecute varias instancias, anteponga COLLIE_INSTANCE=<name> a los comandos y abra la URL de esa instancia específica en el teléfono (Múltiples instancias de Collie en un mismo host).

Editar esta página en GitHub