Request icon
Return icon
If icon
SlackIncomingWebhook icon
HumanTask icon
Snooze icon
Subflow icon
Webhook icon

Govern Security Exception Requests End to End, from Developer Request to an Auditable Aikido Snooze

Route vulnerability exception requests through policy checks and Enterprise human approval, then snooze in Aikido with the requester, reviewer and expiry recorded.

Categories
BusinessInfrastructure

Every security team has an exception process, and in most places it is a chat message that ends with someone clicking ignore. The justification is lost, the expiry is never set, and nobody can say later who approved what. This blueprint replaces that with a governed path. A developer submits a request through a webhook, policy is evaluated against Aikido's own data rather than the requester's summary, anything critical or actively exploited is refused before a human ever sees it, and the remaining requests go to a named security group for approval. When granted, the exception is written back into Aikido as a snooze whose reason carries the requester, the justification, the reviewer note, and the Kestra execution id, with a duration capped by severity rather than by whatever was asked for.

How it works

  1. The exception_requested trigger (io.kestra.plugin.core.trigger.Webhook) accepts the request from a developer portal, a Backstage action, or a Slack shortcut, guarded by a shared key.
  2. The authenticate and issue_detail tasks fetch the finding from the Aikido public API, so severity, reachability, and exploitability come from the scanner and not from the request form.
  3. The policy_check task (io.kestra.plugin.core.debug.Return) computes eligibility and the granted duration in one place. High severity findings are capped at thirty days and medium at ninety, and the requested duration is never exceeded.
  4. The eligibility task (io.kestra.plugin.core.flow.If) refuses critical and actively exploited findings automatically. This matters: a reviewer under time pressure cannot approve something the policy forbids, because the request never reaches them.
  5. The security_review task (io.kestra.plugin.ee.flow.HumanTask) assigns the decision to the security-approvers group with a three day expiry. Unlike a generic pause, only a member of that group can resume it, so the approval is genuinely attributable.
  6. On approval, snooze_with_audit (io.kestra.plugin.aikido.issues.Snooze) writes the suppression into Aikido with the full justification chain in the reason field, and reports how many individual issues the group-level snooze covered.
  7. The schedule_recheck task launches the reachability triage flow with the expiry date attached as an execution label, so the exception is revisited deliberately rather than lapsing unnoticed.

What you get

  • An exception process where the justification lives on the finding in Aikido, not in a chat thread.
  • Hard policy limits that cannot be approved around, enforced before human review.
  • Duration capped by severity, so a ninety day request on a high severity finding becomes thirty.
  • Approval restricted to a named group through Enterprise human tasks, with the approver recorded.
  • An automatic follow-up so a granted exception has an owner and an end date.

Who it's for

  • Security teams formalising an exception process that currently runs on goodwill.
  • Platform teams offering self-service to developers without handing out the ignore button.
  • Regulated organisations that must evidence who approved each accepted risk and for how long.

Why orchestrate this with Kestra

An exception workflow is mostly governance, and governance is exactly what a script cannot provide. Kestra contributes the webhook entry point, a policy branch that runs before any human is involved, an Enterprise human task scoped to a named approver group rather than anyone with the link, execution labels that make the expiry queryable, and a permanent record tying the request, the decision, and the resulting API write together. The Aikido snooze reason then carries that same chain, so the audit trail survives even for someone reading Aikido alone.

Prerequisites

  • Kestra Enterprise Edition, for io.kestra.plugin.ee.flow.HumanTask and its group assignment.
  • A security-approvers group defined in your Kestra instance, containing the people allowed to grant exceptions.
  • An Aikido workspace with API credentials carrying the issues:read and issues:write scopes.
  • The companion flow aikido-reachability-gated-triage deployed in the same namespace, or change schedule_recheck to point at your own follow-up flow.

Secrets

  • AIKIDO_CLIENT_ID, AIKIDO_CLIENT_SECRET: OAuth2 credentials for the Aikido public API.
  • SLACK_WEBHOOK: incoming webhook for decisions and failures.
  • EXCEPTION_WEBHOOK_KEY: shared secret guarding the webhook trigger.

Quick start

  1. Add the secrets above to your Kestra namespace and create the security-approvers group.
  2. Adjust max_days_high and max_days_medium to your own risk appetite.
  3. Execute the flow manually with the default inputs to see the approval land in the assigned group's task list.
  4. Try it with a critical or actively exploited issue id to confirm the automatic denial path fires before review.
  5. Point your developer portal at the webhook URL with the configured key.

How to extend

  • Replace the webhook with a Kestra App so developers get a real form with validation instead of posting JSON.
  • Add a second approver for high severity findings by chaining a second HumanTask assigned to a different group.
  • Write the decision to your GRC system with io.kestra.plugin.servicenow.Post so the risk register stays in step.
  • Query executions by the exception_expiry label to build a dashboard of every exception about to lapse.
  • Require a linked Jira ticket in the request and reject any exception without a remediation plan attached.
  • Swap the schedule_recheck subflow for a scheduled unsnooze that calls io.kestra.plugin.aikido.issues.Unsnooze on the expiry date, forcing the finding back into the queue.

Links

See How

New to Kestra?

Use blueprints to kickstart your first workflows.