Choosing an Authentication Method for Teleport: Local, OIDC, or SAML
Guide to choosing Teleport auth method: compare local, OIDC, SAML; show GitHub OIDC setup and verification steps.
05 Jul 2026, 08:04 UTC

Decision: pick an authentication backend for Teleport
Choose between Teleport’s local user database, an OIDC identity provider (e.g., GitHub, Google, Azure AD), or a SAML IdP (e.g., Okta, JumpCloud) based on security needs, operational overhead, and compliance constraints.
Constraints
- Security: require MFA and centralized user lifecycle.
- Operational overhead: prefer minimal IdP configuration and easy recovery.
- Compliance: may need audit‑ready SSO and role mapping.
Comparison of supported options
| Option | Setup complexity | Centralized MFA | User lifecycle | IdP dependency | Minimum Teleport version |
|---|---|---|---|---|---|
| Local user database | Low (static file or tctl) | No (MFA must be added per user) | Manual | None | All |
| OIDC (GitHub, Google, Azure AD) | Medium (register app, set redirect URI) | Yes (via IdP) | Automatic (just‑in‑time provisioning) | Required | 4.0 |
| SAML (Okta, JumpCloud) | Higher (XML metadata, attribute mapping) | Yes (via IdP) | Automatic (just‑in‑time) | Required | 4.3 |
Trade‑offs
Local authentication is simplest to deploy but lacks built‑in MFA and centralized user management, making it unsuitable for teams that require audit‑ready SSO. OIDC adds token‑based authentication and pushes MFA responsibility to the IdP, reducing operational effort while still requiring a correctly configured client secret and redirect URI. SAML provides the strongest enterprise SSO guarantees but introduces XML parsing complexity and may need extra attribute mapping to align with Teleport roles.
Concrete implementation: OIDC with GitHub
The following steps illustrate how to enable GitHub OIDC on a Teleport node. Replace placeholders with your own values.
- Create a GitHub OAuth app – set the
Authorization callback URLtohttps://<teleport‑host>:3080/v1/webapi/oidc/callback. Note theClient IDandClient Secret. - Edit Teleport configuration (
/etc/teleport.yaml) – add anauth_servicesection:
auth_service:
authentication:
type: oidc
oidc:
- name: github
issuer_url: "https://github.com"
client_id: "<YOUR_CLIENT_ID>"
client_secret: "<YOUR_CLIENT_SECRET>"
redirect_url: "https://<teleport‑host>:3080/v1/webapi/oidc/callback"
scopes: ["openid", "email", "profile"]
# optional: map GitHub teams to Teleport roles
# role_mapping:
# - github_organization: "my-org"
# github_team: "developers"
# teleport_role: "editor"
- Restart the Teleport service (requires root or teleport user):
sudo systemctl restart teleport
- Verify the connector is loaded – check the logs for the initialization message:
journalctl -u teleport -f | grep "auth: OIDC connector 'github' initialized"
- Check the connector definition via tctl:
tctl get auth-connector --name=github
- Log in using tsh (run from a workstation with tsh installed):
tsh login --auth=github --proxy=<teleport‑host>:3080
After a successful GitHub OAuth flow, Teleport issues a short‑lived certificate. You can verify that a Teleport user object was created and that roles are mapped:
- Inspect the Teleport user record:
tctl get users --username=<YOUR_GITHUB_LOGIN>
If the user appears with the expected roles, the OIDC integration is working.
Limitations and recovery
- OIDC support requires Teleport ≥ 4.0; SAML requires ≥ 4.3. Older versions will not recognize the
oidcorsamlblocks. - Misconfigured redirect URLs or invalid client secrets can lock out administrators. Always keep a break‑glass local user with the
adminrole (created viatctl users add) and store its credentials offline. - Role mapping relies on correct IdP claims; test with a non‑privileged GitHub account before granting admin access.
Practical verification checklist
- Teleport logs show
auth: OIDC connector 'github' initializedafter restart. tctl get auth-connector --name=githubreturns the connector with correct client ID and redirect URI.tsh login --auth=githubcompletes the OAuth flow and returns a short‑lived certificate (check withtctl status).tctl get users --username=<github‑login>displays the user and the roles you mapped.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.