Defakto Security · Authentication Profile

Defakto Security Authentication

Authentication

Defakto Security declares 5 security scheme(s) across its OpenAPI definitions.

SecurityIdentityNon-Human IdentityWorkload IdentitySPIFFEAuthenticationZero TrustSecrets ManagementKubernetesCI/CDCloud SecuritygRPCMachine IdentityAgentic AI
Methods: Schemes: 5 OAuth flows: API key in:

Security Schemes

signature
oidc-token-exchange
oauth2
openIdConnect
none

Source

Authentication Profile

defakto-security-authentication.yml Raw ↑
generated: '2026-08-12'
method: searched
source: https://d.defakto.security/iam/service-accounts.md
docs:
- https://d.defakto.security/iam/service-accounts.md
- https://d.defakto.security/iam/roles.md
- https://d.defakto.security/iam/wif-issuers.md
- https://d.defakto.security/iam/enterprise-sso.md
- https://d.defakto.security/cli/spirlctl/login-logout.md
- https://d.defakto.security/mint/configuration/token-exchange.md
note: >-
  Defakto is an identity company, and its own API reflects that: there is no API key anywhere
  in the product. Every caller — human or machine — authenticates into a short-lived session,
  and the two machine paths are an Ed25519 challenge-signing key pair or Workload Identity
  Federation against an external OIDC issuer, which stores no long-lived secret at all.
  Authorization is role-based (five hierarchical org roles plus one realm-scoped role), not
  OAuth-scope-based, so there is no scopes/ artifact for this provider — the roles table is
  the permission surface. Derived from the Go SDK's auth packages
  (spirlsdk/auth/{oauth2,serviceaccount}) and the published IAM documentation.
transport:
  protocol: gRPC over HTTP/2
  tls: required
  port: 443
  hosts:
  - https://api.defakto.security
  - https://api.spirl.com
schemes:
- id: service-account-key
  type: signature
  algorithm: Ed25519
  applies_to: machine
  description: >-
    A service account holds one or more Ed25519 public/private key pairs. The caller keeps
    the private key and uses it to sign an authentication challenge from the control plane;
    a session is returned in exchange. The private key is never transmitted.
  credentials:
    key_id_prefix: sak-
    private_key_format: PEM
  rotation: >-
    Multiple keys per service account are explicitly supported to enable zero-downtime
    rotation — deploy and verify the new key, then disable and delete the previous one.
  sdk_package: spirlsdk/auth/serviceaccount
  cli: 'spirlctl login --service-account-key-id sak-<id> --private-key-file <path>'
  docs: https://d.defakto.security/iam/service-accounts.md
- id: workload-identity-federation
  type: oidc-token-exchange
  applies_to: machine
  description: >-
    A WIF Configuration binds a service account to an external OIDC identity provider and
    declares which JWT claims must match. A pipeline presents a short-lived platform-issued
    OIDC token (Terraform Cloud, GitHub Actions, GitLab, Jenkins) and receives a standard
    service account session with that account's role and realm assignments. No long-lived
    secret is stored anywhere.
  requires:
    wif_issuer: >-
      An organization-wide record registering the external OIDC provider and holding its key
      material. Created by org administrators or owners; any org member may create a WIF
      Configuration on a service account they own referencing an existing issuer.
  auditing: >-
    WIF sessions are recorded in audit logs with the OIDC issuer, the matched claims, and the
    session ID; subsequent calls in the session carry the same session ID, so all activity
    traces back to the originating token exchange.
  docs: https://d.defakto.security/iam/wif-issuers.md
- id: interactive-oauth
  type: oauth2
  applies_to: human
  description: >-
    Browser-based OAuth login used by spirlctl and the web console. Default IdP is Google;
    organizations can be selected explicitly with --org. A headless device-style flow is
    available for SSH sessions and CI by printing a URL and accepting a pasted code.
  session_storage: ~/.spirl/config.json
  sdk_package: spirlsdk/auth/oauth2
  cli_variants:
  - spirlctl login
  - spirlctl login --org <org>
  - spirlctl login --hint <email>
  - spirlctl login --headless
  - spirlctl whoami
  - spirlctl logout
  docs: https://d.defakto.security/cli/spirlctl/login-logout.md
- id: enterprise-sso
  type: openIdConnect
  applies_to: human
  description: OIDC-based single sign-on for organizations, configured per org.
  docs: https://d.defakto.security/iam/enterprise-sso.md
- id: none
  type: none
  applies_to: internal
  description: >-
    The SDK ships an explicit no-auth transport (spirlsdk/auth/none.go) for unauthenticated
    calls. Present in the client library; not a public access path.
  sdk_package: spirlsdk/auth/none
issued_credentials:
  note: >-
    Distinct from authenticating TO Defakto: these are what the platform MINTS for customer
    workloads. They are the product, and they are what a workload subsequently presents to
    AWS, Azure, GCP, OpenAI or Anthropic.
  types:
  - id: x509-svid
    standard: SPIFFE X.509-SVID
    description: X.509 certificate bound to a SPIFFE ID; used for mTLS between workloads.
  - id: jwt-svid
    standard: SPIFFE JWT-SVID
    description: >-
      Signed JWT bound to a SPIFFE ID with a configurable audience; the credential exchanged
      for AWS/Azure/GCP/OpenAI/Anthropic access via workload identity federation.
  - id: wit-svid
    standard: Workload Identity Token (WIT)
    description: >-
      Proof-of-possession bound workload token. Requires its own signing key to be enabled
      and provisioned before use.
    docs: https://d.defakto.security/mint/configuration/svid-issuance/wit-svid.md
token_exchange:
  endpoint: /oauth/token
  served_by: Trust Domain Server (customer-deployed; no single public host)
  description: >-
    Exchanges a credential a workload already holds for a different one. Two documented
    flows: delegation (exchange a user's token for a delegated JWT-SVID) and OAuth access
    tokens (exchange a JWT-SVID for an OAuth access token). The OAuth issuer is configurable
    per trust domain via --oauth-issuer / --builtin-oauth-issuer as of spirlctl 0.35.0.
  docs: https://d.defakto.security/mint/configuration/token-exchange.md
authorization:
  model: rbac
  scope_model: none
  note: >-
    No OAuth scopes. Permissions are attached to hierarchical roles, each inheriting the
    previous. A realm-scoped role layers on top of an organization role.
  org_roles:
  - name: Auditor
    rank: 1
    summary: Read-only across users, trust domains, clusters, realms, federation, config.
  - name: Operator
    rank: 2
    summary: Auditor plus create/modify clusters, cluster versions, CI/CD profiles, refresh federation links, update cluster config.
  - name: Manager
    rank: 3
    summary: Operator plus trust domain key lifecycle and deployment key set management.
  - name: Administrator
    rank: 4
    summary: Manager plus trust domain create/register/update/delete, realm lifecycle, role assignment, WIF issuer lifecycle, developer identity policy, org/trust-domain config.
  - name: Owner
    rank: 5
    summary: Administrator plus user invitation, role change and user deletion.
  realm_roles:
  - name: Realm Admin
    scope: realm
    summary: >-
      Delegated cluster CRUD and cluster-version registration within assigned realms only.
      Cannot reach other realms, create or delete realms, modify realm role assignments, or
      elevate its own privileges. Always layered on an existing org role.
  constraints:
  - Service accounts cannot hold the Owner role.
  - Users can only create service accounts with a role equal to or lower than their own.
  - Service accounts cannot create service accounts.
  - Non-admin roles can update or delete only service accounts they created.
  docs: https://d.defakto.security/iam/roles.md