Help us shape the future of Go! Take the 2026 Go Developer Survey

epithet

module
v0.43.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 27, 2026 License: Apache-2.0, Apache-2.0

README

Epithet makes SSH certificates easy

Epithet is an SSH certificate authority that replaces static authorized_keys with short-lived certificates (2-10 minutes) and authentication over OIDC. It creates on-demand SSH agents for each outbound connection, enabling real-time policy enforcement with standard OpenSSH.

Community

Very small right now, but we have a mailing list!

Installation

macOS

Install with Homebrew on Apple Silicon or Intel Macs:

brew install epithet-ssh/tap/epithet
FreeBSD

Packages are available for FreeBSD 15 on amd64. Run the following as root to install the repository signing key and configure the signed package repository:

install -d -m 0755 /usr/local/etc/pkg/keys /usr/local/etc/pkg/repos
fetch -o /usr/local/etc/pkg/keys/epithet.pub https://pkg.epithet.dev/keys/epithet.pub
chmod 0644 /usr/local/etc/pkg/keys/epithet.pub
cat > /usr/local/etc/pkg/repos/Epithet.conf <<'EOF'
Epithet: {
    url: "https://pkg.epithet.dev/${ABI}/latest",
    signature_type: "pubkey",
    pubkey: "/usr/local/etc/pkg/keys/epithet.pub",
    enabled: yes
}
EOF
pkg update -r Epithet
pkg install -r Epithet epithet

Keep the literal ${ABI} in the repository URL. The package includes server rc.d scripts, disabled by default; installation does not start a server.

Debian Linux

Packages are available for amd64. Run the following as root to install the repository and then epithet. This is client/agent only for now, no service definitions.

install -d -m 0755 /etc/apt/keyrings
curl -fsS https://pkg.epithet.dev/keys/epithet-debian.asc \
  -o /etc/apt/keyrings/epithet-debian.asc
chmod 0644 /etc/apt/keyrings/epithet-debian.asc

cat > /etc/apt/sources.list.d/epithet.sources <<'EOF'
Types: deb
URIs: https://pkg.epithet.dev/debian
Suites: ./
Architectures: amd64
Signed-By: /etc/apt/keyrings/epithet-debian.asc
EOF

apt-get update && apt-get install -y epithet
Arch Linux

Packages are available for x86_64. Import and trust the repository signing key:

curl -fsS --proto '=https' https://pkg.epithet.dev/keys/epithet-arch.asc | sudo pacman-key --add -
sudo pacman-key --lsign-key EDF8AFF765FBCD24AE3E2D0B1146870201C33C51

Add the following to /etc/pacman.conf, keeping the literal $arch:

[epithet]
SigLevel = Required
Server = https://pkg.epithet.dev/arch/$arch

Then update the system and install Epithet:

sudo pacman -Syu epithet
From source
git clone https://github.com/epithet-ssh/epithet.git
cd epithet
make

Add the resulting epithet binary to your PATH.

Quick start

1. Install Epithet.

2. Start the agent:

epithet agent --ca https://your-ca.example.com/

The agent discovers its OIDC issuer and client ID from the CA's Link header on the root response — nothing to configure locally.

3. Tag the hosts this profile should handle, then include the generated config (~/.ssh/config):

Host *.example.com
    Tag epithet

Include ~/.epithet/run/*/ssh-config.conf   # must come after Tag lines

4. SSH as normal:

ssh server.example.com

First connection authenticates through your browser (~2-5 seconds). In an SSH session, Epithet automatically uses the OIDC device flow instead. Subsequent connections reuse the refreshed token.

To scope the agent to a shell or another command, pass that command to the agent. It starts only after the broker is ready, and the agent exits when the command exits:

epithet agent zsh

The child uses the same generated ~/.ssh/config setup shown above. Use --login-method browser or --login-method device to override automatic login-method selection.

How it works

When you run ssh server.example.com, OpenSSH's Match tagged triggers epithet match for hosts you've tagged in your own ssh config. epithet match asks the broker for a certificate. The broker authenticates in-process via OIDC, requests a signed certificate from the CA (which checks policy in real time), and spins up a per-connection SSH agent with the short-lived certificate. See architecture for detailed sequence diagrams.

Components:

  • Agent (epithet agent): Daemon managing OIDC authentication state and certificate lifecycle. Creates per-connection SSH agents.
  • CA (epithet ca): Authenticates users, reads facts, evaluates Writ, and signs SSH certificates.
  • Directory / Inventory (epithet directory, epithet inventory): Independently replaceable user and host fact services. Backends own storage, mutation invariants, and audit.
  • Control (epithet control): Control plan, handles administration, SCIM provisioning, and host enrollment.

Documentation

Requires OpenSSH 9.4+ on the client (for Tag/Match tagged; see below).

License

Apache 2.0

Directories

Path Synopsis
cmd
epithet command
examples
internal
servicehttp
Package servicehttp owns signed HTTP exchanges for service clients.
Package servicehttp owns signed HTTP exchanges for service clients.
pkg
breakerpool
Package breakerpool provides a generic circuit breaker pool with priority-based failover.
Package breakerpool provides a generic circuit breaker pool with priority-based failover.
ca
facts
Package facts defines provider and administration protocols and their public clients.
Package facts defines provider and administration protocols and their public clients.
facts/control
Package control authenticates public requests and authorizes administrative operations, then invokes the private provider protocols.
Package control authenticates public requests and authorizes administrative operations, then invokes the private provider protocols.
facts/directory
Package directory owns managed identities, administration, and the user and group facts supplied to authorization.
Package directory owns managed identities, administration, and the user and group facts supplied to authorization.
facts/directory/scim
Package scim adapts SCIM provisioning to the directory storage contract.
Package scim adapts SCIM provisioning to the directory storage contract.
facts/directory/sqlitestore
Package sqlitestore implements the managed directory using embedded SQLite.
Package sqlitestore implements the managed directory using embedded SQLite.
facts/directory/storetest
Package storetest tests the public directory storage and lookup contracts.
Package storetest tests the public directory storage and lookup contracts.
facts/inventory
Package inventory owns managed host facts, enrollment, patterns, and storage.
Package inventory owns managed host facts, enrollment, patterns, and storage.
facts/inventory/sqlitestore
Package sqlitestore implements managed inventory using embedded SQLite.
Package sqlitestore implements managed inventory using embedded SQLite.
facts/inventory/storetest
Package storetest provides the inventory backend contract suite.
Package storetest provides the inventory backend contract suite.
facts/server
Package server serves built-in directory and inventory facts and their private management APIs.
Package server serves built-in directory and inventory facts and their private management APIs.
facts/storage
Package storage owns the database settings shared by the built-in fact stores.
Package storage owns the database settings shared by the built-in fact stores.
hostpattern
Package hostpattern implements the hostname-pattern language shared by inventory resolution and Writ host selectors.
Package hostpattern implements the hostname-pattern language shared by inventory resolution and Writ host selectors.
oidc
Package oidc owns OIDC login, token verification, and Epithet identity mapping.
Package oidc owns OIDC login, token verification, and Epithet identity mapping.
principal
Package principal implements Epithet's deterministic SSH certificate principal schemes.
Package principal implements Epithet's deterministic SSH certificate principal schemes.
serviceauth
Package serviceauth signs and verifies request-bound service credentials.
Package serviceauth signs and verifies request-bound service credentials.
tlsconfig
Package tlsconfig provides shared TLS configuration for HTTP clients.
Package tlsconfig provides shared TLS configuration for HTTP clients.
wire
Package wire contains shared certificate, discovery, host, and evaluation types.
Package wire contains shared certificate, discovery, host, and evaluation types.
writ
Package writ compiles policy source into validated IL.
Package writ compiles policy source into validated IL.
writ/diag
Package diag holds source positions and diagnostics for the writ policy language.
Package diag holds source positions and diagnostics for the writ policy language.
writ/eval
Package eval is SPEC §8 as a pure function: order-independent evaluation of a compiled policy against one (user, host, account) request.
Package eval is SPEC §8 as a pure function: order-independent evaluation of a compiled policy against one (user, host, account) request.
writ/il
Package il is writ's intermediate language: the compiled rule format per SPEC §10–11.
Package il is writ's intermediate language: the compiled rule format per SPEC §10–11.
writ/object
Package object defines the provider-independent objects consumed by Writ.
Package object defines the provider-independent objects consumed by Writ.
writpolicy
Package writpolicy evaluates supplied user and host facts against a compiled Writ policy, with registries of requirement handlers, flag sources, and notify targets.
Package writpolicy evaluates supplied user and host facts against a compiled Writ policy, with registries of requirement handlers, flag sources, and notify targets.
test
catest
Package catest supplies controllable evaluators for CA boundary tests.
Package catest supplies controllable evaluators for CA boundary tests.
controltest
Package controltest runs the real public control service and private backends.
Package controltest runs the real public control service and private backends.
oidctest
Package oidctest provides a minimal in-process OIDC provider for tests.
Package oidctest provides a minimal in-process OIDC provider for tests.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL