image-factory 1.7.0 (2026-09-07)
Welcome to the v1.7.0 release of image-factory!
Please try out the release binaries and report any issues at
https://github.com/siderolabs/image-factory/issues.
API Tokens
Download tokens and node tokens are now one self-issued API token with atomic, resource-first capabilities.
The catalog is image:read, source:pull, schematic:create, schematic:read, report:read, token:issue, token:read and token:revoke. One code-defined route map validates every scope and authorizes every request; there are no deployment-defined meanings or compatibility aliases for the unreleased intermediate names.
Generated image downloads, PXE assets and generated installer OCI pulls share image:read. Proxied upstream OCI images use the distinct source:pull capability. Schematic creation, schematic reading, report reading, token issuance, token listing and token revocation are independent permissions.
Executable capabilities and delegation are separate. The JWT scope claim controls what the credential may do, while issuable_scopes is an explicit ceiling on what it may grant. Child capabilities and child delegation ceilings must both be subsets of the parent's ceiling. Unknown values fail closed, and no wildcard silently acquires future capabilities.
Each token also carries a stored claim. A stored token is recorded per identity, listed, checked on every use and revocable. An ephemeral token is a signed string and nothing else. Either kind may be used from ?token= on scoped GET and HEAD operations; token-management credentials are refused in query strings because those are copied into access logs.
Lifetime follows storage rather than capability. Stored tokens default to one year and remain revocable. Ephemeral tokens default to five minutes and may live up to eight hours. The CLI bootstrap credential has its own authentication.tokens.ttl.bootstrap policy.
POST /tokens, GET /tokens and POST /tokens/:id/revoke are the only token endpoints. The /node-tokens and /download-token routes are gone; use {"scopes":["image:read"]} and add "stored":false for a short-lived URL credential.
Breaking changes:
- Node and download tokens issued by earlier versions are rejected and must be reissued.
- The intermediate
download,pull,schematic,tokenandadminscope values are rejected. POST /tokensacceptsstoredandissuable_scopes; token records report both executable and issuable scopes.- Token TTL configuration is grouped under
authentication.tokens.ttl.stored,.ephemeraland.bootstrap. pkg/client'sTokenCreatetakes astoredargument;DownloadTokenpassesfalseand otherwise keeps its behavior.authentication.downloadTokenKeyPath,authentication.downloadTokenTTLandenterprise.nodeTokensmove toauthentication.tokens; stale keys fail startup.authentication.tokens.keyPathsis ordered: the first private key signs new tokens, while every later key or certificate is verification-only. This supports two-phase key rotation without immediately invalidating existing tokens.
See the authentication docs for the complete model and upgrade steps.
Bootstrap Credentials
Cross-subject provisioning uses a CLI-only bootstrap credential rather than an admin scope. It carries token:issue, token:read and token:revoke for its own operations, an explicit snapshot of the current public catalog in issuable_scopes, and the independent any_subject claim.
No HTTP request can create this credential. The Enterprise-only command is:
image-factory admin-token --config /etc/image-factory/config.yaml --subject org_abc123
The command writes the token to stdout and diagnostics to stderr. --ttl uses authentication.tokens.ttl.bootstrap, and authentication.tokens.keyPaths must contain an active private key so the credential is signed by the key running replicas trust.
The bootstrap credential is never recorded, so expiry or removal of its signing key from keyPaths retires it. It cannot propagate any_subject, cannot create a successor bootstrap credential, and cannot be used through ?token=. Keep it offline and give it the shortest practical lifetime.
POST /tokens normally issues to the caller identity. A bootstrap credential may supply subject to provision another identity; listing and revocation remain per-identity.
Contributors
- Andrey Smirnov
- Mateusz Urbanek
- Noel Georgi
- Maja Bojarska
- Dmitrii Sharshakov
- Ivan Demchuk
- Mateusz Urbanek
- Oscar Wieman
- Sacha Weatherstone
- Utku Ozdemir
Changes
15 commits
5da8c30release(v1.7.0): prepare release513036cfix: cache unauthenticated iPXE scripts, dedupe cache signing5fec48btest: characterize HTTP frontend behavior4520b38fix(enterprise): evaluate VEX against Talos kernela27dfe6feat: enforce public API with OpenAPI773ba3cfix(ui): gate token create modal on the in-flight POST2e149c8fix(auth0): drop Bearer challenge from 401 response9f82ddefix: rename registryClientRefreshInterval to refreshIntervalf4f79dbfeat(enterprise): repo-per-org token storage, url-safe stored tokensf4e4d01feat(enterprise): expose actor profiles for token creation UI8a77753feat(enterprise): replace scope enum with route-defined capability scopes4d9710ffeat(enterprise): add CLI-only admin token scope4286666feat(enterprise): unify download and node tokens as scoped API tokens4becd5drelease(v1.6.1): prepare releasee5ff748fix: pull in Talos for the SBC/GRUB/EFI fix
Changes from siderolabs/go-debug
Changes from siderolabs/go-vex
2 commits
Changes from siderolabs/pkgs
5 commits
Changes from siderolabs/talos
52 commits
09681e895fix: correct the bug with overlay assets in ESP being dropped9abd05af4release(v1.14.0): prepare releaseff772d64fchore: mark release as stable5424dac73test: relax OOM test conditions9f6719422fix: normalize image reference when passing to image verification flow6ce58d308fix: name diskSelector in UnattendedInstallConfig validation errorsaf4e11b50test: isolate base OCI spec test in BGP CLOS runsff56b6d66chore: update tools and pkgs8c8b9b45ffix: filter the output in talosctl9777a1bb4feat: talos containers run with imagegccontrollerdd566c9c7fix: container mount rshared propagation2f8931768refactor: don't skip container tests in short mode2f0fdd11efix: ctr machinedaccss allowed roles64aef9053feat: containers can connect to machinedce2148aa0feat: impl. container mount controller9105c5e1efeat: talos containers support for talosctl36fd44677feat: impl. container runtime controllerafc09d418refactor: make runner.runner context-nativeeff936cf0feat: impl ContainerInstanceController95abc8bfffix: filter out passed metadata in API proxying10c4f1a8bfix: treat desired roles empty as error in Talos API access807b692a1fix: allow CSI volumes to be mounted with an SELinux context6249f3f4etest: skip filemap heap test under race detector87a031b7ftest: libvirtd extensionse8b376365fix: validate received kubeconfigabce4c937fix: use os.Root in the talosctl extract path1deae73ddfix: escape output in the talosctl dashboard5b153233cchore: speed up unit-tests3715ce908fix: add checks for meta key in the API path138958053feat: update COSI to 1.16.3bdc7f3053fix: preserve shared libs symlinks7366edc90chore: reduce verbosity of the grype scanc027a947ffix: exclude scheduler config from apiserver config version544fc52cbfeat: add host extension pre-shutdown hooks1d911581dfix: route creation churning every 100msbaca68d0dfix: drop dead legacy registries init from worker generationdec9dc3dcchore: bump sigstore/rekor to v1.5.4dc9e7fea9chore: add SPD5118 driver to squashfsae4d8228efix: keep the time sync boot timeout across a syncer restart755900fccfix: preserve special modes when extracting files6c927a0fffix: hostns etc mount3cdd0e748feat: bump kubernetes to 1.37.003c567929refactor: log filter stays enabled on enter pressb690b7ad5fix: write the uploaded etcd snapshot atomically25a366162chore: update multipath notes866db94f1fix: drop gRPC client keepalive aggressive settings in the tracker74e88bd57feat: support host extension servicese828fe80afix: skip selinux label for read-only/detached/external mounts1be6787a5fix: capture packets correctly on VLANsd16d765f7docs: update CRI customization example1b31e1213fix: use os.Root in the untar path91a6af032fix: enable additional SELinux permissions for Cilium
Dependency Changes
- github.com/getkin/kin-openapi v0.146.0 new
- github.com/siderolabs/go-debug v0.6.2 -> v0.6.3
- github.com/siderolabs/go-vex v0.1.2 -> v0.1.4
- github.com/siderolabs/pkgs v1.14.0-10-g13c7afc -> v1.14.0-15-g2f03590
- github.com/siderolabs/talos 322de8bf2974 -> 09681e895fe6
- github.com/siderolabs/talos/pkg/machinery 322de8bf2974 -> 09681e895fe6
- github.com/stretchr/testify v1.11.1 -> v1.12.1
- golang.org/x/crypto v0.55.0 -> v0.56.0
Previous release can be found at v1.6.0