Skip to content
cccskills
FreePublished on GitHub

configuration-users

Define and provision static accounts in a local identity store using Caddyfile entries. Set identity fields, trusted imported password hashes, bcrypt API keys, roles, and ordered authentication rules, while accounting for which existing user fields are not synchronized.

OriginalShow the original description

Configure static local accounts, required identity fields, trusted password imports, bcrypt API keys, roles, and stored challenge rules. Use for Caddyfile-owned users; online administration belongs to scripts-and-automation.

greenpau/caddy-security2,270 stars(GitHub 2,270 + cccskills 0)

Run score Not tested

See how to install

Good for

  • Adding accounts to a local identity store
  • Importing trusted password hashes
  • Assigning roles and bcrypt API keys
  • Setting stored authentication challenge rules

Files included (3)

  • SKILL.md7.6 KB
  • agents/openai.yaml245 B
  • references/password-hashing.md7.5 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Configuration Users

Purpose

Use this skill for user <username> entries inside local identity store blocks. The Caddyfile syntax is authoritative in caddyfile_identity_store.go; the provisioning behavior is authoritative in the selected go-authcrunch module, especially pkg/ids/local/user.go, pkg/ids/local/authenticator.go, and pkg/identity/database.go.

The surrounding store belongs to configuration-identity-stores; account changes do not require reloading that router unless store settings change.

Shape

local identity store localdb {
	realm local
	path assets/config/users.json

	user alice {
		name "Alice Example"
		email alice@example.com
		password {env.ALICE_PASSWORD} overwrite
		roles authp/user authp/admin
		api key kid123456789012345678901 {env.ALICE_API_KEY_BCRYPT}
	}
}

kid123456789012345678901 is intentionally 24 characters. For static user API keys, authcrunch treats the Caddyfile key id as the API key prefix and currently requires exactly 24 characters.

Fields

The current Caddyfile parser supports only these subdirectives:

  • name <full name> with one or more words; multi-word names are joined with spaces.
  • email <address>.
  • password <plaintext_or_imported_hash> [overwrite].
  • roles <role> [<role>...].
  • api key <key_id> <bcrypt_value_or_secret_reference>.
  • auth challenges <rule body>; repeat to append ordered rules.

Use overwrite when the configured password should replace the existing stored password during provisioning. Supported passwords may be plaintext, bcrypt:<cost>:<hash>, or argon2:<PHC> imports. The unchanged plaintext path creates bcrypt hashes. Static API-key payloads remain bcrypt; password-import support does not change their format. Read password imports and generation for the exact Argon2 format, generation commands, resource limits, trusted-input boundary, and Caddy qualification.

Duplicate password updates can reuse the active hash while still advancing the account's credential version. Legacy records without credential_version remain supported. See local identity compatibility for update versus reset behavior, invalidation, and Caddy tests.

Static user blocks are not a full sync mechanism. During local store configuration, authcrunch creates the user when it does not exist. When the user already exists, password ... overwrite replaces its password; configured API keys are passed to the upstream key operation, and explicit challenge rules replace its stored rules. Name, email and roles are not synchronized. Keep the configured email consistent with the existing identity.

For api key, use a stable 24-character key id and a bcrypt-formatted payload or a placeholder/secret that resolves to one. Do not generate plaintext static API key payload examples.

Stored authentication rules

For example, inside user alice, repeat rule bodies in preference order:

auth challenges u2f
auth challenges password totp if u2f not available
auth challenges password if u2f and totp not available

The shared challenge parser validates the complete list. Methods are password, totp, u2f, and mfa; adjacent methods require all, or selects the first available choice, and if ... [and ...] not available tests registered credentials. Email challenges/conditions, duplicates, empty and malformed rules fail adaptation. Keywords must be literal. See the conditional transform grammar for selection, precedence and verified AMR. A matching transform policy can replace the stored selection.

Explicit static rules are applied both when creating and when provisioning an existing user. Omitting them preserves the stored policy; removing lines does not reset it. Caddyfile rules do not enroll factors. Ensure users have the credentials required by a rule or provide a deliberate fallback.

Use profile flow management for user-owned changes or an explicit reset with an empty challenges array. security local update user replaces rules through the server API, which requires a nonempty list. The static API-key directive still has no overwrite suffix; do not invent one from the upstream struct field.

Secrets

Prefer environment placeholders or secret lookups for passwords and API keys:

password "{env.USERS_ADMIN_SECRET}" overwrite
password "secrets:users/alice:password" overwrite
api key kid123456789012345678901 "secrets:users/alice:api_key"

Make sure API key placeholders and secret lookups resolve to a value in the bcrypt:<cost>:<hash> form.

Secret-backed values follow the manager contract and runtime field contract.

Review Checklist

Check generated local user entries against these code-backed constraints:

  • The entry is inside local identity store <name> { ... }, not an LDAP store.
  • The username is present and compatible with the local database policy; the default policy requires length 3-50.
  • New users have a password compatible with the local database policy; the default policy requires length 8-128. The default bcrypt creation path also rejects plaintext longer than 72 bytes; the policy's upper bound does not override that algorithm limit. Trusted imported hashes use their own format validation because the underlying plaintext length is unavailable.
  • email is a single valid address. Although its presence is not checked by the Caddyfile parser, new-user provisioning requires it; an existing user's configured username and email must identify the same stored account.
  • roles has at least one role when used.
  • Repeated auth challenges rules form one validated, ordered policy.
  • password overwrite has only the literal overwrite as its second argument.
  • api key has exactly key, a 24-character key id, and one payload value.
  • Static API key payloads are bcrypt-formatted or resolve to bcrypt-formatted values.

Fixtures

Use these examples:

  • caddyfile_identity_store.go for accepted Caddyfile subdirectives.
  • caddyfile_identity_store_test.go for local store parser coverage.
  • testcase_authenticate_with_argon2 for quoted imports, adapt-time environment expansion, runtime placeholders, bcrypt and plaintext compatibility.
  • TestPasswordImportAdaptAndResolve, TestPasswordImportProvisioningRejectsMalformed and TestCaddyPasswordArgon2E2E for preservation, redacted rejection and actual executable TLS login, restart, overwrite and public self-service boundaries.
  • testcase_authenticate_with_challenges for adaptation and resolution.
  • TestCaddyAuthenticationChallengesE2E for stored policy creation, replacement, omission, native login and profile policy management through Caddy.
  • testdata/caddyfile_adapt/testcase_security_authentication_portal.Caddyfile.

testcase_security_with_secrets contains the static API-key lookup form. TestIdentityStoreSecretsFixture checks its local-user block independently of the optional external module, and the challenge E2E provisions a bcrypt API key through the Caddyfile and exercises native login and policy rejection.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Build or troubleshoot HTTP clients for an authentication portal’s JSON login, token refresh, Documents, profile, and admin APIs. The skill explains request and response contracts, browser and native transports, and public signing-key discovery so clients can interact with the configured portal correctly.

  • Implement a JSON login client for a portal
  • Troubleshoot browser or native token refresh
  • Call profile, Documents, or admin endpoints
greenpau/caddy-security2.3KUpdated Oct 28, 2026

Investigate caddy-security deployment and runtime failures using configuration, logs, version details, and HTTP evidence. The skill helps identify a focused correction or document an unresolved issue with a useful handoff, while keeping observed facts separate from hypotheses and redacting secrets.

  • Diagnosing login, callback, or authorization failures
  • Finding a minimal correction for a Caddy configuration
  • Preparing a redacted break-fix issue report
greenpau/caddy-security2.3KUpdated Oct 28, 2026

Use these conventions to implement or review caddy-security Go code, Caddy modules, Caddyfile parsers, and HTTP integrations. Keep app boundaries and lifecycle behavior clear, delegate authentication logic to go-authcrunch, and handle errors and logs safely.

  • Reviewing a Caddyfile parser change
  • Adding a Caddy module or HTTP handler
  • Checking app lifecycle and cleanup behavior
greenpau/caddy-security2.3KUpdated Oct 28, 2026

configuration

FreeSummary

Build or review caddy-security Caddyfiles by starting with the security app and wiring authenticate or authorize routes to named portals and policies. Use its domain map to find focused guidance for the requested login, provider, storage, or integration setup.

  • Drafting a complete caddy-security Caddyfile
  • Wiring portal authentication into routes
  • Connecting authorization policies to protected paths
greenpau/caddy-security2.3KUpdated Oct 28, 2026

Configure Caddy authentication portals and connect them to protected routes. Select login backends, set trusted login and logout redirect rules, and wire portal behavior such as refresh and Documents storage while relying on focused skills for specialized settings.

  • Create a portal and connect it to protected routes
  • Choose which identity stores and providers can log in
  • Set trusted login and logout redirect destinations
greenpau/caddy-security2.3KUpdated Oct 28, 2026

Set authentication portal cookie names, prefixes, domains, paths, and browser attributes, including refresh-cookie overrides. The guidance explains naming precedence, validation, and how authorization policies must explicitly discover matching token cookies.

  • Giving portal cookies a shared prefix
  • Overriding one cookie name
  • Setting cookie paths and domains
greenpau/caddy-security2.3KUpdated Oct 28, 2026

See all skills by greenpau

Report a problem with this skill