Mass provisioning
Het probleem
Per-agent tokens zijn one-shot — één klik in de dashboard levert één token op voor één registratie. Dat schaalt niet wanneer je 20 of 100 VMs in parallel opspint vanuit Terraform of een autoscaling group. Je wil één geheim dat alle hosts mogen gebruiken, met een ingebouwde teller en vervaltijd.
Enrolment tokens
Een enrolment token (prefix enrl_) is een meervoudig bruikbaar secret met:
max_uses— harde plafond op het aantal registratiesexpires_at— TTL van 1 uur tot 30 dagendefault_tags+default_role— automatisch toegekend aan elke geregistreerde agentallowed_cidrs(optioneel) — bron-IP allowlist voor extra hardeningrevoked_at— instant kill switch vanuit de dashboard
De hub bewaart alleen de SHA-256; het raw token wordt één keer getoond en mag je daarna alleen nog in je secret store stoppen.
Token aanmaken
- Dashboard → Settings → Enrolment tokens
- Naam: bijv.
production-cluster-eu-west - TTL: 72 uur, max uses: 50, default tags:
prod,eu-west,web, role:web - (Optioneel) Allowed CIDRs: bijv.
10.0.0.0/8als de hosts in je VPC zitten - Create — kopieer het
enrl_…token meteen
Gebruik in 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 'De installer detecteert de enrl_ prefix, roept
POST /api/v1/agents/enrol aan op de hub, en krijgt een vers per-agent token
(agt_…) terug. Dat token komt in /etc/monsys/agent.toml. Het enrolment
token wordt niet bewaard op de host — de agent gebruikt vanaf nu alleen zijn
eigen one-shot token.
Gebruik in Terraform
module "monsys" { source = "git::https://github.com/gotrust/monsys.git//agent/packaging/terraform" monsys_token = var.monsys_enrolment_token # uit 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, één secret. Elke host komt online met zijn eigen agt_… token
plus de tags prod,eu-west,web,shard-N.
Gebruik in 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.tomlTag merging
Tags van het token (default_tags) komen eerst; tags die je via
MONSYS_TAGS of de Terraform tags variabele meegeeft worden eraan
toegevoegd (geen duplicates). Hetzelfde voor role: token default wint,
behalve als de installer een expliciete MONSYS_ROLE mee krijgt.
Audit
Elke registratie wordt geregistreerd in enrolment_uses met:
- token id
- nieuw agent id
- bron-IP
- timestamp
Wanneer 100 agents binnen 5 minuten verschijnen, zie je in de enrolment-tokens lijst direct welke token dat heeft geautoriseerd, en kan je via één klik revoken als er een rare host tussen zit.
Failure modes
Alle onderstaande gevallen geven 401 terug — bewust geen onderscheid om
attackers niet te helpen:
- token bestaat niet (verkeerde hash)
- token verlopen (
expires_atvoorbij) - token revoked
max_usesbereikt- bron-IP buiten de
allowed_cidrs
Operator-feedback krijg je via de dashboard (uses counter, expiry, status).
Token rotatie
Tokens worden niet hernieuwd — je maakt simpelweg een nieuwe aan en revoked de oude wanneer je klaar bent met de batch. Geregistreerde agents blijven werken; alleen nieuwe registraties via dat token worden geblokkeerd.