New to Kestra?
Use blueprints to kickstart your first workflows.
Route vulnerability exception requests through policy checks and Enterprise human approval, then snooze in Aikido with the requester, reviewer and expiry recorded.
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.
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.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.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.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.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.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.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.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.
io.kestra.plugin.ee.flow.HumanTask and its group assignment.security-approvers group defined in your Kestra instance, containing the people allowed to grant exceptions.issues:read and issues:write scopes.aikido-reachability-gated-triage deployed in the same namespace, or change schedule_recheck to point at your own follow-up flow.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.security-approvers group.max_days_high and max_days_medium to your own risk appetite.HumanTask assigned to a different group.io.kestra.plugin.servicenow.Post so the risk register stays in step.exception_expiry label to build a dashboard of every exception about to lapse.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.