Edge authentication not stated

infoedge-auth-unset

How a caller proves who it is decides what a leak costs: a password or a key in configuration can be copied and used from anywhere, a managed identity or an IAM role cannot. With security.edgeAuthDeclared set, the design has promised to say which on every such hop. Set auth on this edge: managed-identity, iam-role, service-account, workload-identity, api-key, oauth, mtls, basic or none.

Severity
info
Selects
every edge
Components in scope
2,366
What it checks

It looks at every edge, and fires when:

  • — all of these hold:
  • — the design requirement `security.edgeAuthDeclared` is true
  • — the edge's `auth` has no value
  • — the edge's target node:
  • — the node is a sql-database, nosql-database, cache, object-store, queue, stream, key-management, ai-service or search-index
Message
Edge '{{edge.from}}' -> '{{edge.to}}' reaches data, secrets or an AI service and does not say how it authenticates. Set auth on the edge.

{{node.id}} style paths are filled in from the node, the edge or the design the finding is about.

Applies to · 2,366 components

This rule is about an edge, so it belongs to a pair of nodes rather than one component.

This rule names no kind: it reads the design as a whole.
Tripped by · 1

Reference designs whose broken twin names this rule in its header. The gate reads the same header, and fails when a rule no design trips.

Source
# yaml-language-server: $schema=../schema/rule.schema.json
# The design promises that every hop into stored data, secrets, queues and AI vendors says how it
# authenticates, and this one does not. Whether the caller holds a password, a key in its
# environment, or a cloud identity is the difference between a leak that bills and one that cannot
# happen; the edge's `auth` is where the design says which.
# Opt-in through security.edgeAuthDeclared, so a design that never talks about authentication is
# not told about every hop it draws.
# Tripped by: designs/reference/llm-gateway/design.broken.yaml
schemaVersion: "1"
type: "rule"
id: "edge-auth-unset"
severity: "info"
select:
  edge: {}
when:
  all:
    - requirement: "security.edgeAuthDeclared"
      equals: true
    - field: "auth"
      exists: false
    - to:
        kind:
          - "sql-database"
          - "nosql-database"
          - "cache"
          - "object-store"
          - "queue"
          - "stream"
          - "key-management"
          - "ai-service"
          - "search-index"
message: "Edge '{{edge.from}}' -> '{{edge.to}}' reaches data, secrets or an AI service and does not say how it authenticates. Set auth on the edge."

The same page as markdown, for an agent: /catalogue/rules/edge-auth-unset.md