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 -rfysudo. - 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.loga menos queCOLLIE_STATE_DIRlo 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 serveo 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 deinnerHTML. Nunca usetailscale funnelni exponga un puerto sin procesar. Para autorizar hardware específico, use emparejamiento directamente o, si su proxy inyecta identificadores de dispositivo, las dos variablesCOLLIE_DEVICE_*siguientes.
| variable | qué hace |
|---|---|
COLLIE_ALLOW_NON_LOOPBACK_BIND=1 | Desactiva el enlace exclusivo a loopback; si no se establece, el puente rechaza vincularse a 0.0.0.0. |
COLLIE_ALLOW_ANY_HOST=1 | Deshabilita 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_USER | Rechaza una solicitud cuyo encabezado Tailscale-User-Login falte o no coincida. |
COLLIE_TRUSTED_USER_OPTIONAL=1 | Permite la ausencia del encabezado Tailscale-User-Login (los nodos etiquetados nunca envían uno). |
COLLIE_DEVICE_HEADER | Nombre del encabezado que su proxy inyecta con un identificador de dispositivo. |
COLLIE_DEVICE_ALLOWLIST | Identificadores de dispositivo separados por comas autorizados para escribir; todos los demás dispositivos permanecen en modo de solo lectura (docs/deployment.md). |
🚫 Nunca usetailscale funnelcon Collie. Funnel enruta el tráfico a internet público, mientras quetailscale serverestringe 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 minutesAbra Collie en el teléfono, vaya a Settings → Paired 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:
| pregunta | confía en | revocación mediante | |
|---|---|---|---|
COLLIE_DEVICE_HEADER | ¿está este dispositivo en la lista del operador? | su proxy, para inyectar un nombre saneado | la edición de COLLIE_DEVICE_ALLOWLIST y el reinicio posterior |
| emparejamiento | ¿posee este dispositivo una credencial emitida por mí? | nada en la red | collie 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 restartLa 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).