Aller au contenu

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 registrations
  • expires_at — TTL de 1 heure à 30 jours
  • default_tags + default_role — attribués automatiquement à chaque agent
  • allowed_cidrs (optionnel) — allowlist d’IP source pour durcir
  • revoked_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

  1. Dashboard → Settings → Enrolment tokens
  2. Nom : par exemple production-cluster-eu-west
  3. TTL : 72 h, max uses : 50, default tags : prod,eu-west,web, role : web
  4. (Facultatif) Allowed CIDRs : par exemple 10.0.0.0/8 si vos hosts sont dans le VPC
  5. Create — copiez le token enrl_… immédiatement

Utilisation avec cloud-init

#cloud-config
runcmd:
- 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.toml

Fusion 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_at dépassé)
  • token revoked
  • max_uses atteint
  • 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.