Introduction #
In Okta Privileged Access platform release 2026.04.0, deployed on April 07, 2026, Okta introduced Workload Identity for Automation.1
Okta’s launch blog describes the same shift as moving away from static keys and toward trusted workload attestation.2 The idea is important: automated workloads can authenticate with their native platform identity and a runtime OIDC token, instead of relying on hardcoded API keys or long-lived service account secrets.
CI/CD pipelines, deployment jobs, infrastructure automation, cloud services, and AI agents often need privileged access. They may need to connect to a Linux server over SSH, retrieve a deployment token, rotate a credential, or run a controlled maintenance command. The traditional pattern is simple: put a secret somewhere the workload can read it. It works, but it leaves a familiar question behind: what protects the secret that unlocks the secret store?
Okta Privileged Access Workloads3 changes the starting point. A workload proves what it is at runtime. Okta Privileged Access validates that proof, maps it to a workload role, evaluates policy, and issues short-lived access for the resource the workload is allowed to use.
In this article I will explain:
- what Workloads are in Okta Privileged Access
- why this matters for CI/CD, automation, and AI agents
- how workload connections, roles, policy, and the CLI fit together
- how the pattern applies to Principal SSH access, secrets, AI agents, and CI/CD such as GitHub Actions
Why Workload Identity Matters #
A workload is an automated process that needs access to infrastructure without a human sitting in front of it. Think of:
- GitHub Actions, GitLab CI, CircleCI, or Jenkins jobs
- Ansible, Terraform, Puppet, or custom automation scripts
- cloud workloads running in Google Cloud Platform or Azure
- scheduled jobs that perform operational tasks
- agentic or tool-driven automation that executes commands under guardrails
Unlike a human user, a workload cannot complete MFA, approve a push notification, or explain why it needs access. It must authenticate non-interactively. That makes the quality of its identity proof critical.
The old pattern usually looks like this:
- Store an API key, SSH private key, or service account secret in the CI/CD platform.
- Let the job read that static credential.
- Use it to access a vault, PAM tool, server, or cloud resource.
This is better than hardcoding secrets directly in scripts, but it does not fully solve the bootstrap problem. The first credential is still long-lived, sensitive, and often broadly scoped. If it leaks, an attacker may not need to compromise a human identity at all.
Workload identity replaces that static bootstrap credential with a runtime identity document. For example, GitHub Actions can issue an OIDC token for a specific workflow run. That token includes claims about the repository, branch, workflow, environment, and run context. Okta Privileged Access can validate those claims and decide whether this exact workload is trusted.4
--- config: layout: elk --- flowchart LR subgraph s2["OPA Workloads"] direction LR OIDC["CI/CD OIDC Token"] -- runtime --> OPA["Okta Privileged Access"] OPA --> Policy["Policy Evaluation"] Policy -- Short-lived Access --> Resource3["Server"] Policy -- Short-lived Access --> Resource4["Secret"] end subgraph s1["Old Pattern"] direction LR Static["Static CI/CD Secret"] --> Vault["Vault or PAM"] Vault --> Resource1["Server"] Vault --> Resource2["Secret"] Static <-. bootstrap credential risk .-> Risk["Long-lived credential"] end
The goal is not to pretend automation no longer needs secrets. It does. The goal is to remove standing credentials from the authentication path when the workload platform can provide cryptographic proof of identity.
The OPA Workloads Model #
Workloads in Okta Privileged Access are built around four practical components:
| Component | Purpose |
|---|---|
| Workload Connection | Defines which external identity provider is trusted and which JWT claims must match. |
| Workload Role | Maps verified workload attributes to a logical principal used by policy. |
| Policy | Decides which resources, servers, or secrets the workload role can access. |
| CLI execution | Lets the workload authenticate and use access non-interactively. |
This structure is important because it separates setup from governance. DevOps teams usually know the source platform and the pipeline details. Security teams own the trust boundary and policy. Okta’s setup flow reflects that separation: a DevOps admin can create and test a workload connection in Draft state, while a security admin promotes it to Active and defines authorization through workload roles and policies.5
Administrative Flow #
The setup flow is easier to understand as four phases.
1. Connect #
The DevOps admin creates a workload connection. For common platforms, Okta can provide a guided setup. For generic JWT integrations, you define the JWKS URL and the required claims yourself.
For a GitHub Actions connection, the important validation elements are typically:
- issuer
- audience
- repository or organization
- branch, tag, workflow, or environment
- token signature through the provider JWKS URL
The security principle is simple: do not trust “anything from GitHub” or “anything from this cloud.” Trust the narrowest runtime identity that matches the automation you want to authorize.
2. Govern #
The connection starts in Draft. Draft mode lets the team test JWT validation without issuing a usable access token. When the security admin activates the connection, it can issue valid Okta Privileged Access tokens. Okta notes that after activation, the DevOps admin loses admin rights to that connection, while the security admin can switch it between Active and Inactive.4
This is a healthy control. The team that builds the pipeline can prepare the integration, but the security team approves the trust boundary.
3. Map #
The security admin creates a workload role. This role groups matching workloads into a logical identity.
For example:
- connection:
github-actions-prod - role:
prod-deployer - conditions: repository is
fabio/example-app, branch ismain, workflow isdeploy.yml
Once created, the workload role becomes a principal in Okta Privileged Access policy.6
4. Execute #
At runtime, the automation calls the Okta Privileged Access CLI. The documented command is sft workload authenticate, with sft wl authenticate as the shorter form.7
OPA_TOKEN=$(sft wl authenticate \
--team "<opa-team>" \
--connection "<workload-connection-name>" \
--jwt-env "<environment-variable-containing-jwt>" \
--role-hint "<workload-role-name>")The workload presents its JWT, references the workload connection, and provides a role hint. Okta Privileged Access validates the token, matches the workload role, evaluates policy, and issues a short-lived access token if access is allowed.
That command is the bridge between the platform identity token and OPA-managed access. The next section shows the full runtime sequence.
Runtime Flow #
At runtime, the sequence is fully non-interactive:
- The platform starts the workload.
- The workload obtains a signed identity token from its native platform.
- The OPA client sends that token to Okta Privileged Access.
- Okta validates the token signature and required claims.
- Okta maps the workload to a workload role.
- Policy decides whether the workload can access the resource.
- The workload uses short-lived access to complete the task.
sequenceDiagram
participant Job as Automation Job
participant IdP as Platform Identity Provider
participant CLI as OPA Client CLI
participant OPA as Okta Privileged Access
participant Policy as Policy Engine
participant Target as Server or Secret
Job->>IdP: Request runtime OIDC token
IdP-->>Job: Signed workload identity JWT
Job->>CLI: sft wl authenticate
CLI->>OPA: Present JWT, connection, role hint
OPA->>OPA: Validate signature and claims
OPA->>Policy: Evaluate workload role access
Policy-->>OPA: Allow or deny
OPA-->>CLI: Issue short-lived token
CLI->>Target: Use authorized access
Access Patterns #
Two access patterns are especially relevant for automation and AI agents: server access and secrets.
Principal SSH Access #
With Principal SSH access, workloads can connect to managed Linux servers using a system-managed username derived from the workload role. Okta documents the wl_ prefix for these workload users. For example, prod-deployer maps to wl_prod-deployer.
The username is provisioned just in time and used with short-lived SSH credentials.8 Server logs can show the workload identity boundary, and policy changes matter: if a workload role loses access while a session is active, Okta documentation indicates the active SSH session can be terminated.
Here is a minimal CI-friendly pattern after sft wl authenticate has already exported OPA_TOKEN:
export OPA_TARGET_SERVER="prod-web-01"
export RELEASE_ID="${GITHUB_SHA:-manual-run}"
mkdir -p "${HOME}/.ssh"
chmod 700 "${HOME}/.ssh"
# Append OPA-managed SSH configuration for this runner.
sft ssh-config >> "${HOME}/.ssh/config"
chmod 600 "${HOME}/.ssh/config"
# Run a non-interactive deployment check on the target server.
sft ssh "${OPA_TARGET_SERVER}" --command "
set -euo pipefail
echo \"Connected as: \$(whoami)\"
echo \"Host: \$(hostname)\"
sudo systemctl status example-app --no-pager
echo \"Ready for release ${RELEASE_ID}\"
"Secrets #
Okta Privileged Access secrets are encrypted key-value pairs for passwords, API tokens, private keys, or other sensitive values. Resource admins create the folder structure, and security admins define policies for access.9
For automation, the useful pattern is simple: authenticate as a trusted workload first, then retrieve only the specific secret allowed by policy.
The OPA client supports commands such as:
sft secrets list
sft secrets describe --path "<folder-path>" --name "<secret-name>"
sft secrets reveal --path "<folder-path>" --name "<secret-name>"AI Agents Use Case #
In my previous articles on the Agentic Enterprise Blueprint and Okta for AI Agents access patterns, I used the three questions from the Okta’s blueprint as the backbone of AI security:
- Where are my agents?
- What can they connect to?
- What can they do?
OPA Workloads is highly relevant to the second question: What can they connect to?
An AI agent is not always a chatbot. It can be a coding agent, a remediation agent, a deployment assistant, a security operations workflow, or an MCP-enabled tool runner. If that agent can execute commands, open SSH sessions, retrieve secrets, or call infrastructure APIs, it needs the same identity discipline as any other privileged workload.
The useful mental model is:
flowchart LR
Agent["AI Agent or Tool Runner"] --> Identity["Runtime Workload Identity"]
Identity --> OPA["Okta Privileged Access"]
OPA --> Role["Workload Role"]
Role --> Policy["Access Policy"]
Policy --> Server["Allowed Servers"]
Policy --> Secret["Allowed Secrets"]
Policy -. "deny" .-> Other["Everything Else"]
This does not replace the O4AA access patterns for application-to-application delegation, user context, or API access. It complements them when the agent needs privileged infrastructure access. In that architecture, Workloads can become the PAM control point that answers: this specific agent runtime, from this trusted platform, may connect to these servers or secrets, under this policy, for this task.
That is a much better answer than giving the agent a reusable SSH key, a generic vault token, or a shared service account password.
GitHub Actions Example #
GitHub Actions is one useful example because it already supports OIDC tokens for workflows.10 The same model applies to other supported workload identity providers. This is not a full lab, just the essential shape.
First, allow the workflow to request an OIDC token:
permissions:
contents: read
id-token: writeThen request a GitHub OIDC token with the audience expected by the Okta Privileged Access workload connection:
AUDIENCE="okta-pam-workloads"
TOKEN_RESPONSE="$(curl -sSfL \
-H "Authorization: bearer ${ACTIONS_ID_TOKEN_REQUEST_TOKEN}" \
"${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=${AUDIENCE}")"
GITHUB_OIDC_TOKEN="$(echo "${TOKEN_RESPONSE}" | jq -r '.value')"
echo "::add-mask::${GITHUB_OIDC_TOKEN}"
export GITHUB_OIDC_TOKENAuthenticate the workload:
export OPA_ADDR="https://acme.pam.okta.com"
OPA_TOKEN="$(sft wl authenticate \
--team "acme" \
--connection "github-actions-prod" \
--jwt-env GITHUB_OIDC_TOKEN \
--role-hint "prod-deployer")"
echo "::add-mask::${OPA_TOKEN}"
export OPA_TOKENThen use whatever policy allows. For a quick SSH smoke test:
sft ssh "prod-web-01" --command "hostname && whoami"For secrets:
sft secrets reveal \
--path "/ci/prod/example-app" \
--name "deploy-api-token"The deployment script around these commands can change. The identity pattern should not: start from a runtime workload token, exchange it with OPA, and use only the access allowed by policy.
Design Guardrails #
Remember that a workload identity integration is privileged identity infrastructure. Treat it that way.
- Scope claims tightly: repository plus branch, workflow, tag, or environment.
- Use short token TTLs aligned to expected runtime.
- Separate DevOps operators from security activation operators.
- Use dedicated workload roles per app, environment, and access pattern.
- Treat AI agents as workload identities when they execute infrastructure actions.
- Avoid printing JWTs, OPA tokens, or revealed secrets.
- Prefer protected GitHub environments or equivalent release controls.
Do not replace one shared secret with one shared workload role. If every automation job maps to the same role, you have recreated a broad service account with a nicer authentication flow.
Conclusion #
Workload identity for automation is one of those features that feels small in the release notes but changes the architecture conversation.
Instead of asking a CI/CD pipeline, automation script, or AI agent to hold a permanent key, Okta Privileged Access Workloads lets the workload prove its identity at runtime. Okta validates the token, maps it to a workload role, applies policy, and issues short-lived access for the server or secret the workload needs.
For me, the value is not only cleaner secret handling. It is better governance for non-human access. Automation keeps moving, but access becomes easier to scope, audit, and revoke.
What is your take? Are your pipelines already using workload identity, or are static secrets still hiding in too many places?
-
Okta Privileged Access Platform release notes, version 2026.04.0, deployed April 07, 2026. ↩︎
-
Okta Blog: Okta Privileged Access now supports workload identity for automation, published April 07, 2026. ↩︎