Authentication
Configure authentication for the Gordon registry and Admin API.
Authentication is enabled by default. Gordon will not start without a valid token_secret (or GORDON_AUTH_TOKEN_SECRET).
Pick a Mode
Token-only (recommended for CI/CD)
[auth]
secrets_backend = "pass"
token_secret = "gordon/auth/token_secret"
token_expiry = "30d"
Password + Token (interactive + CI/CD)
[auth]
secrets_backend = "pass"
username = "deploy"
password_hash = "gordon/auth/password_hash"
token_secret = "gordon/auth/token_secret"
Token auth always works. Adding username + password_hash enables interactive login.
Options
| Option | Type | Default | Description |
|---|---|---|---|
enabled |
bool | true |
Authentication toggle. false enables local-only mode (see below) |
secrets_backend |
string | "unsafe" |
Secrets backend: "pass", "sops", or "unsafe" |
token_secret |
string | - | Required. Path to JWT signing secret in secrets backend |
token_expiry |
string | "30d" |
Token validity duration (0 = never expires) |
username |
string | - | Username for password auth (optional) |
password_hash |
string | - | Path to bcrypt hash in secrets backend (optional) |
Secrets Backends
token_secret and password_hash are read through the configured backend:
| Backend | Description |
|---|---|
pass |
Unix password manager (GPG-encrypted) |
sops |
Mozilla SOPS encrypted files |
unsafe |
Plain text files (development only) |
See Secret Providers for setup details.
Environment Variable
GORDON_AUTH_TOKEN_SECRET overrides token_secret in the config. If you don’t set the env var, token_secret is loaded from the configured secrets backend (including pass).
export GORDON_AUTH_TOKEN_SECRET="your-32-character-secret-here"
gordon serve
Setup
Token-only setup
# Create token secret (random 32+ characters)
pass insert gordon/auth/token_secret
# Generate a token
gordon auth token generate --subject ci-bot --scopes push,pull --expiry 0
# Docker login with token
docker login -u ci-bot -p <token> registry.mydomain.com
Password + token setup
# Generate bcrypt hash
gordon auth password hash
# Store hash and token secret
pass insert gordon/auth/password_hash
pass insert gordon/auth/token_secret
# Docker registry access
docker login -u deploy -p <password> registry.mydomain.com
# Remote CLI login (stores a token for you)
gordon auth login --remote prod
Remote CLI Tokens
If you already have a token (token-only servers), store it directly:
gordon auth login --token <token>
# or
gordon remotes set-token prod <token>
Token Scopes
Registry scopes:
| Scope | Permission |
|---|---|
push |
Push images to registry |
pull |
Pull images from registry |
push,pull |
Both push and pull (default) |
Admin scopes (for remote CLI):
| Scope | Permission |
|---|---|
admin:*:* |
Full admin access |
admin:routes:read |
Read-only routes access |
admin:routes:write |
Routes write access |
admin:config:read |
Read-only config access |
admin:config:write |
Config write access |
admin:status:read |
Read-only status/health |
admin:secrets:read |
List secret keys |
admin:secrets:write |
Set/delete secrets |
Examples:
gordon auth token generate --subject reader --scopes pull --expiry 30d
gordon auth token generate --subject builder --scopes push --expiry 0
gordon auth token generate --subject admin --scopes "push,pull,admin:*:*" --expiry 0
Token Expiry
Durations support d, w, M, y and combinations like 1y6M or 2w3d.
gordon auth token generate --subject ci --expiry 0
gordon auth token generate --subject deploy --expiry 1y
gordon auth token generate --subject temp --expiry 30d
Instance-specific Tokens
- Tokens are signed with
token_secret - Tokens from one Gordon instance won't work on another
- Changing
token_secretinvalidates all existing tokens
Local-only Mode
Authentication is enabled by default. If you set auth.enabled=false, Gordon switches to local-only mode:
/admin/*endpoints are not registered./v2/*registry endpoints are restricted to loopback (127.0.0.1/::1).- Remote registry and remote admin access are disabled.
Use this only when Gordon is intended for local machine usage.
Internal Registry Auth
Gordon generates internal credentials when auth is enabled. These are used for loopback pulls during deploys and are regenerated on each restart.
Gordon also generates a separate service token for its own registry-domain pulls. This token is managed internally and is not exposed via configuration or CLI.
To view internal credentials (for troubleshooting):
gordon auth internal
Note: Internal credentials are stored with restrictive permissions (0600) in secure runtime directories (XDG_RUNTIME_DIR or ~/.gordon/run) and cleaned up on shutdown.