02/Documentation
Sécurité : à lire avant toute exécution
Ce qu'un Collie expose, les défenses et l'association d'un appareil comme identifiant d'écriture
Collie fournit par conception un accès shell distant à votre machine. Un seul appel à l'API Collie envoie des frappes arbitraires directement à un panneau de terminal actif. Quiconque dispose d'un accès réseau à l'URL peut lire tous les panneaux (code source, secrets, variables d'environnement, sortie de l'agent) et exécuter des commandes sous votre utilisateur.
Il n'y a aucun bac à sable ni aucune liste d'autorisation de commandes, car filtrer les commandes irait à l'encontre de l'objectif même de l'outil. Considérez cette URL comme un accès root.
Associer un appareil : l'identifiant d'accès en écriture
# on the host — prints an 8-character code and a QR code, good for 10 minutes
bin/collie pairCela ne ferme que le chemin d'écriture ; le modèle de risque ci-dessous détaille ce qui reste ouvert.
Ouvrez Collie sur le téléphone, allez dans Paramètres → Appareils associés, puis saisissez le code avec un libellé pour l'appareil, ou scannez le code QR affiché par la commande pour ouvrir directement cet écran avec le code prérempli. Le téléphone enregistre le jeton retourné. Collie ne conserve que le hash, et le jeton n'est affiché qu'une seule fois. Vous n'avez pas besoin de redémarrer le processus ; le démon en cours d'exécution applique les associations et les révocations à la requête suivante.
Les deux systèmes de filtrage d'appareils répondent à des questions différentes, et vous pouvez utiliser l'un, l'autre, les deux ou aucun des deux :
| demande | fait confiance à | révoquer en | |
|---|---|---|---|
COLLIE_DEVICE_HEADER | cet appareil figure-t-il sur la liste de l'opérateur ? | votre proxy, pour injecter un nom qu'il a nettoyé | modifiant COLLIE_DEVICE_ALLOWLIST, puis en redémarrant |
| association | cet appareil possède-t-il un identifiant que j'ai émis ? | rien sur le réseau | collie devices revoke <label> : en direct |
L'association ne nécessite aucune infrastructure supplémentaire. Elle s'adapte à une configuration directe avec tailscale serve où aucun proxy n'existe pour injecter des en-têtes.
Les deux options ne filtrent que l'accès en écriture. Les requêtes de lecture restent accessibles à tout ce qui valide le contrôle same-origin.
bin/collie devices list # what holds a credential, and when each was last seen
bin/collie devices revoke old-phone # effective immediately, no restartLe filtrage en écriture n'est actif que si au moins un appareil est associé. Aucun appareil n'est associé tant que vous n'exécutez pas collie pair ; jusque-là, les opérations de lecture et d'écriture fonctionnent comme avant. Associez d'abord votre téléphone actuel. Révoquer le dernier appareil désactive à nouveau le filtrage pour éviter tout blocage.
Cinq tentatives de code erronées invalident le code, ce qui nécessite d'exécuter à nouveau collie pair.
Sur un hôte exécutant plusieurs instances, préfixez les commandes avec COLLIE_INSTANCE=<name> et ouvrez l'URL de cette instance spécifique sur le téléphone (Plusieurs instances de Collie sur un même hôte).
Modèle de risque
Limites de sécurité principales et risques :
- Il s'exécute avec vos autorisations utilisateur. Collie hérite de l'ensemble de vos droits d'accès, notamment
~/.ssh,git push --force,rm -rfetsudo. - L'authentification identifie les appareils, pas les personnes physiques. Tailscale vérifie le terminal matériel plutôt que la personne physique qui l'utilise. Il n'y a ni mot de passe ni session utilisateur ; un téléphone déverrouillé ou volé offre un shell ouvert. Vous pouvez atténuer ce risque en associant l'appareil (ci-dessus). Le verrouillage d'inactivité intégré ne fait qu'effacer un écran sans surveillance et ne constitue aucune véritable limite de sécurité (ADR 0007).
- Tous les utilisateurs locaux du système peuvent atteindre le port. Les sockets standards des multiplexeurs de terminaux (
tmux,zellij,herdr) utilisent les permissions du système de fichiers pour restreindre l'accès aux autres utilisateurs locaux. Collie écoute sur un port TCP local, ce qui l'expose à tous les UID locaux. L'association ou le contrôle par appareil restreint les droits d'écriture, mais les opérations de lecture restent accessibles à tous les utilisateurs locaux. Cela réduit les risques d'exécution mais n'empêche pas la divulgation de données (ARCHITECTURE.md §6). - Une seule instance expose toutes les sessions. Par défaut, un seul processus Collie sert de façade à chaque session de multiplexeur découverte sous la racine de configuration de Herdr, y compris les sessions en bac à sable (Multi-session).
- Les écritures sont enregistrées dans
<state-dir>/audit.log, qui est~/.local/state/collie/audit.logsauf siCOLLIE_STATE_DIRle déplace. Le serveur journalise toutes les frappes entrantes, les réponses, les téléversements de fichiers ainsi que les événements du cycle de vie des panneaux et des onglets. Notez qu'un journal d'audit offre une visibilité a posteriori et ne constitue pas un contrôle d'accès (ARCHITECTURE.md §6). - Contrôles défensifs par défaut. Collie se lie strictement aux interfaces de bouclage, achemine le trafic uniquement via
tailscale serveou un reverse proxy équivalent, et applique des règles CSP strictes, des vérifications de même origine et la validation de l'en-tête host. Le contenu du panneau est rendu sous forme de nœuds texte React et non viainnerHTML. N'utilisez jamaistailscale funnelet n'exposez jamais de port brut. Pour autoriser un matériel spécifique, utilisez directement association ou, si votre proxy injecte des identifiants d'appareils, les deux variablesCOLLIE_DEVICE_*ci-dessous.
| variable | description |
|---|---|
COLLIE_ALLOW_NON_LOOPBACK_BIND=1 | Désactive la liaison exclusive à l'interface de bouclage ; si non définie, le pont refuse de se lier à 0.0.0.0. |
COLLIE_ALLOW_ANY_HOST=1 | Désactive la validation de l'en-tête host, activée par défaut et bloquante en cas d'erreur. |
COLLIE_TRUSTED_USER | Rejette toute requête dont l'en-tête Tailscale-User-Login est manquant ou ne correspond pas. |
COLLIE_TRUSTED_USER_OPTIONAL=1 | Autorise l'absence d'en-tête Tailscale-User-Login (les nœuds avec des tags n'en envoient jamais). |
COLLIE_DEVICE_HEADER | Nom de l'en-tête que votre proxy injecte avec un identifiant d'appareil. |
COLLIE_DEVICE_ALLOWLIST | Identifiants d'appareils autorisés en écriture, séparés par des virgules ; tous les autres appareils restent en lecture seule (docs/deployment.md). |
🚫 N'utilisez jamaistailscale funnelavec Collie. Funnel route le trafic vers l'Internet public, alors quetailscale serverestreint l'accès à votre tailnet privé. Il n'existe aucun cas d'usage pris en charge pour exécuter Collie sur Funnel.
Restreignez davantage l'accès avec les ACL Tailscale et COLLIE_TRUSTED_USER. Fourni en l'état, sans garantie.
Ce qui quitte votre machine
Rien, par défaut et par principe. Collie n'envoie aucun événement d'installation, aucune statistique d'utilisation, aucun rapport de plantage et aucune télémétrie. Aucun flag ne permet de les activer.
Le seul appel sortant non sollicité est la vérification des mises à jour : une requête HTTPS GET anonyme vers l'API publique des tags de GitHub (bridge/update.ts) qui compare votre version au tag le plus récent. Elle ne transmet aucune donnée sur vous ou votre machine, seulement le user-agent statique collie-update-check.
Si une collecte venait à être ajoutée, un opt-in explicite serait le maximum : désactivé par défaut, demandé via une question visible, jamais activé par un flag ou par défaut. Revenir sur cet engagement constituerait un changement cassant (ADR 0034).
Modifier cette page sur GitHub