BusDK Update

Bus Events suojaa domain-eventit omilla scopeilla

bus-api-provider-events tarkistaa nyt suojatut Bus integration -eventit domain-kohtaisilla JWT-scopeilla. VM:n käynnistys, container-ajot, usage-kyselyt ja SSH-script-ajot eivät avaudu enää pelkällä yleisellä event-scopella.

Events API käyttää normaalia Bus API -audiencea ai.hg.fi/api, lukee accountin bearer-tokenin sub-claimista ja jättää callerin antaman account-metadatan ilman valtuutusvaikutusta.

26.4.2026bus-eventsACLJWT scopes

Tiiviisti

TL;DR

  • Suojatut event-prefixit mappautuvat domain-scopeihin: esimerkiksi bus.vm.start.* vaatii vm:write ja bus.containers.run.* vaatii container:run.
  • events:send ja events:listen riittävät edelleen suojaamattomiin event-nimiin, kuten paikallisiin example.*-testivirtoihin.
  • Wildcard-kuuntelu ja yleiset event-scopet eivät näe suojattuja Bus integration -eventtejä oletuksena.
  • Laaja admin-käyttö on erillinen palvelinasetus: --allow-broad-event-scopes tai BUS_EVENTS_ALLOW_BROAD_SCOPES=1.

Events API:n ensimmäinen versio suojasi HTTP-pinnan yleisillä events:send- ja events:listen-scopeilla. Se riittää avoimelle tapahtumakanavalle, mutta Bus integration -eventit ohjaavat domain-toimintoja: VM-status, VM-start/stop, container-runner, usage-tietojen listaus ja poistot sekä SSH-scriptien suoritus.

Uusi ACL-kerros tekee event-nimestä valtuutettavan kohteen. Esimerkiksi nämä prefixit saavat domain-scope-vaatimukset:

bus.vm.status.*         -> vm:read
bus.vm.start.*          -> vm:write
bus.containers.run.*    -> container:run
bus.containers.delete.* -> container:delete
bus.usage.list.*        -> usage:read
bus.usage.delete.*      -> usage:delete
bus.ssh.script.run.*    -> ssh:run

Julkaisu ja kuuntelu käyttävät samaa sääntöä eri suuntiin. Token, jossa on container:run, voi julkaista tai kuunnella bus.containers.run.*-eventtejä, mutta ei saa samalla oikeutta lukea bus.usage.list.*-vastauksia. Broad events:listen ei näe kaikkia suojattuja eventtejä vahingossa.

$ bus-events --api-token "$BUS_API_TOKEN" \
  send --name bus.vm.start.request --payload '{"region":"fi-hel2"}'
{
  "error": "insufficient_scope"
}

Kun sama pyyntö ajetaan tokenilla, jolla on vm:write, provider hyväksyy eventin ja leimaa accountin verified JWT:stä. Caller ei voi nostaa oikeuksia lisäämällä payloadiin tai metadataan toisen accountin tunnusta.

Suojaamattomat nimet pysyvät kevyinä kehitys- ja paikalliskäyttöä varten. example.ping toimii edelleen events:send- ja events:listen-scopeilla. Tuotantoon vietävät Bus integration -eventit kannattaa kuitenkin nimetä dokumentoitujen domain-prefixien alle, jotta scope-raja on näkyvä sekä API-providerissa että integraatiotyöntekijöiden READMEissä.

Lisätiedot löytyvät bus-events-dokumentaatiosta ja bus-api-provider-eventsin dokumentaatiosta.