Provisionnement de masse
Le problème
Les tokens par-agent sont à usage unique : un clic dans le dashboard donne un token bon pour une seule registration. Ça ne tient pas la route quand Terraform ou un autoscaling group lance 20 ou 100 VMs en parallèle. Il faut un seul secret que toutes les hosts peuvent utiliser, avec un compteur intégré et une durée de vie.
Tokens d’enrolment
Un token d’enrolment (préfixe enrl_) est un secret multi-usage avec :
max_uses— plafond strict du nombre de registrationsexpires_at— TTL de 1 heure à 30 joursdefault_tags+default_role— attribués automatiquement à chaque agentallowed_cidrs(optionnel) — allowlist d’IP source pour durcirrevoked_at— kill switch instantané depuis le dashboard
Le hub ne stocke que le SHA-256 ; le token brut est affiché une seule fois, ensuite il ne vit que dans votre secret store.
Créer un token
- Dashboard → Settings → Enrolment tokens
- Nom : par exemple
production-cluster-eu-west - TTL : 72 h, max uses : 50, default tags :
prod,eu-west,web, role :web - (Facultatif) Allowed CIDRs : par exemple
10.0.0.0/8si vos hosts sont dans le VPC - Create — copiez le token
enrl_…immédiatement
Utilisation avec cloud-init
#cloud-configruncmd: - bash -c ' export MONSYS_TOKEN="enrl_xxxxx" export MONSYS_TAGS="$(curl -fsS http://169.254.169.254/latest/meta-data/placement/availability-zone)" curl -fsSL https://get.monsys.ai/install.sh | sudo -E bash 'L’installer détecte le préfixe enrl_, appelle
POST /api/v1/agents/enrol sur le hub et reçoit un token per-agent neuf
(agt_…). Ce token est écrit dans /etc/monsys/agent.toml. Le token
d’enrolment n’est pas conservé sur la host — l’agent utilise ensuite
exclusivement son propre token à usage unique.
Utilisation avec Terraform
module "monsys" { source = "git::https://github.com/gotrust/monsys.git//agent/packaging/terraform" monsys_token = var.monsys_enrolment_token # depuis Vault / SOPS tags = ["shard-${count.index}"] role = "web"}
resource "aws_instance" "web" { count = 50 ami = "ami-..." instance_type = "t4g.small" user_data = module.monsys.cloud_init}50 instances, un seul secret. Chaque host démarre avec son propre token
agt_… plus les tags prod,eu-west,web,shard-N.
Utilisation avec Ansible
- name: install monsys agent hosts: all become: true vars: monsys_token: "{{ lookup('hashi_vault', 'secret/monsys/enrolment') }}" tasks: - shell: | export MONSYS_TOKEN="{{ monsys_token }}" export MONSYS_TAGS="{{ group_names | join(',') }}" export MONSYS_ROLE="{{ ansible_role | default('') }}" curl -fsSL https://get.monsys.ai/install.sh | bash args: creates: /etc/monsys/agent.tomlFusion des tags
Les tags du token (default_tags) viennent en premier ; les tags que vous
passez via MONSYS_TAGS ou la variable Terraform tags sont ajoutés
ensuite (sans doublons). Idem pour role : la valeur par défaut du token
l’emporte, sauf si l’installer reçoit un MONSYS_ROLE explicite.
Audit
Chaque registration est enregistrée dans enrolment_uses avec :
- id du token
- id du nouvel agent
- IP source
- timestamp
Quand 100 agents apparaissent en 5 minutes, vous voyez immédiatement dans la liste des enrolment tokens lequel a autorisé ce flux, et vous pouvez le revoke d’un clic s’il y a un host suspect.
Modes d’échec
Tous les cas ci-dessous renvoient 401 — délibérément sans distinction
pour ne pas aider un attaquant :
- token inexistant (hash erroné)
- token expiré (
expires_atdépassé) - token revoked
max_usesatteint- IP source hors des
allowed_cidrs
Le feedback opérateur passe par le dashboard (compteur d’uses, expiry, statut).
Rotation
Les tokens ne se renouvellent pas — vous en créez un nouveau et revoke l’ancien quand le batch est terminé. Les agents déjà enregistrés continuent de fonctionner ; seules les nouvelles registrations via ce token sont bloquées.