Zero trust access to your AWS resources
Octelium is a free and open source, self-hosted zero trust access platform. It reaches private VPC resources across accounts and regions, RDS databases, EKS clusters, S3 buckets and Lambda function URLs through one identity model, with the AWS credential held by the Cluster rather than distributed to people and jobs.
- Free and open source
- Designed for self-hosting
- SigV4 signing at the proxy
kind: Service
metadata:
name: s3
spec:
mode: HTTP
isPublic: true
config:
upstream:
url: https://bucket.s3.eu-central-1.amazonaws.com
http:
auth:
sigv4:
accessKeyID: AKIA...
secretAccessKey:
fromSecret: s3-bucket-1
region: eu-central-1
service: s3kind: Policy
metadata:
name: s3-read-only
spec:
rules:
- effect: ALLOW
condition:
all:
of:
- match: ctx.request.http.method == "GET"
- match: '"analysts" in ctx.user.spec.groups'kind: Service
metadata:
name: rds-prod
spec:
mode: POSTGRES
port: 5432
config:
upstream:
url: postgres://db.abc.eu-central-1.rds.amazonaws.com
postgres:
user: analytics_ro
database: analytics
auth:
password:
fromSecret: rds-password
sslMode: REQUIREA unified secure access platform
Secure humans, workloads and AI agents with one model for identity, authorization, connectivity, credentials and visibility.
- Unified access platform
One architecture for client-based zero-config VPN-like access over WireGuard and QUIC tunnels and clientless access over browsers for humans and OAuth2 access for workloads.
Read more - L7-aware access control
Identity-based, application-layer aware ABAC access control with policy-as-code via CEL and OPA, applied on a per-request basis.
Read more - Secretless access
Dynamic secretless access where teams and AI agents access protected infrastructure without ever holding a credential.
Read more - Unified identity management
Teams, workloads and AI agents share the same model for identity management, access control, and auditing.
Read more - Real-time visibility and auditing
OpenTelemetry-native, real-time, application-layer-aware visibility and structured logging.
Read more - GitOps-friendly management
Octelium is administered like Kubernetes. Define your resources in YAML files, store them in a Git repository.
Read more
One architecture across accounts and regions
Each resource is protected by an identity-aware proxy that provides application-layer-aware access control, secretless access, and visibility. Which VPC, account or region an upstream sits in becomes a detail of the Service definition.
- Client-based access over WireGuard and QUIC tunnels reaches every Service through a single stable route with a stable private address and DNS name, however many VPCs are behind it.
- A Service upstream can be an address that is only reachable from the side of a connected host inside that VPC, so another account or region needs no peering change and no inbound port.
- Publicly protected resources such as S3, Lambda function URLs and the EKS API are reached clientlessly over HTTPS, for people in a browser and for workloads over standard OAuth2.
kind: Service
metadata:
name: internal-api
spec:
mode: HTTP
config:
upstream:
url: http://10.0.6.40:8080kind: Service
metadata:
name: api-us-east
spec:
mode: HTTP
config:
upstream:
url: http://10.40.2.11:8080
user: vpc-us-eastkind: Service
metadata:
name: eks-prod
spec:
mode: KUBERNETES
isPublic: true
config:
upstream:
url: https://abc.eks.amazonaws.com
kubernetes:
kubeconfig:
fromSecret: kubeconfig-eksLayer-7 aware access control with policy-as-code
Access is authorized on a per-request basis, using CEL or Open Policy Agent, against the identity behind the request and the content of the request itself rather than the security group or subnet it arrived from.
- Application-layer-aware access control that includes HTTP methods, paths, headers and serialized JSON body content, SSH users, Kubernetes verbs, resources and namespaces, and PostgreSQL and MySQL users and databases.
- Those combine with identity, group membership, device posture, session type and time in the same expression, and Policies attach to a Service, a Namespace, a User or a Group.
- Zero standing privileges. No permanent admins or superuser Users. All access is explicitly allowed by a Policy that can be tied by time and context.
kind: Policy
metadata:
name: bucket-prefix
spec:
rules:
- effect: ALLOW
condition:
all:
of:
- match: ctx.request.http.method == "GET"
- match: ctx.request.http.path.startsWith("/reports/")
- match: '"analysts" in ctx.user.spec.groups'kind: Policy
metadata:
name: eks-sre
spec:
rules:
- effect: ALLOW
condition:
all:
of:
- match: ctx.request.kubernetes.verb in ["get", "list"]
- match: ctx.request.kubernetes.namespace == "production"
- match: '"sre" in ctx.user.spec.groups'kind: Policy
metadata:
name: production
spec:
rules:
- effect: ALLOW
condition:
all:
of:
- match: ctx.user.spec.type == "HUMAN"
- match: ctx.session.status.type == "CLIENT"
- match: ctx.device.status.osType in ["MAC", "LINUX"]AWS credentials that are never distributed
Application-layer credentials are stored in the Cluster as Secrets and used to authenticate upstream once a request is authorized. For AWS that includes signing requests with Signature Version 4 on the caller's behalf.
- SigV4 signing covers S3 buckets, Lambda function URLs and other AWS APIs, with the region and service name set on the Service, so no IAM access key is handed to a person or a job.
- RDS PostgreSQL and MySQL passwords, EKS kubeconfigs, client certificates and bearer tokens, SSH keys and HTTP API keys are all held the same way.
- The upstream account and credential can be selected dynamically per request, so a staging bucket and a production bucket sit behind one Service URL and one Policy set.
kind: Service
metadata:
name: my-lambda
spec:
mode: HTTP
isPublic: true
config:
upstream:
url: https://abc.lambda-url.eu-central-1.on.aws
http:
auth:
sigv4:
accessKeyID: AKIA...
secretAccessKey:
fromSecret: lambda-1
region: eu-central-1
service: lambdakind: Service
metadata:
name: rds-prod
spec:
mode: POSTGRES
port: 5432
config:
upstream:
url: postgres://db.abc.eu-central-1.rds.amazonaws.com
postgres:
user: analytics_ro
database: analytics
auth:
password:
fromSecret: rds-passwordkind: Service
metadata:
name: s3
spec:
mode: HTTP
isPublic: true
config:
upstream:
url: https://staging.s3.eu-central-1.amazonaws.com
dynamicConfig:
configs:
- name: prod
upstream:
url: https://prod.s3.eu-central-1.amazonaws.com
http:
auth:
sigv4:
accessKeyID: AKIA...
secretAccessKey:
fromSecret: s3-prod
region: eu-central-1
service: s3
rules:
- condition:
match: '"sre" in ctx.user.spec.groups'
configName: prodA unified identity model for humans and workloads
Human and workload Users share the same identity management, authentication, access control and visibility model. An ETL job reaching a bucket is authorized and audited exactly as an engineer would be.
- Workloads authenticate with authentication tokens, with the OAuth2 client credentials flow, or secretlessly with federated OIDC assertions from GitHub Actions, cloud providers and Kubernetes clusters.
- An EKS cluster that publishes an OpenID Connect issuer can authenticate its own workloads to the Cluster, so no long-lived credential has to be stored alongside the job.
- People authenticate through any OpenID Connect or SAML 2.0 identity provider, with native FIDO2 and WebAuthn passkeys, TOTP and TPM 2.0 authenticators available on top of it.
- Cordium, built on Octelium, provides isolated sandboxes for agents and developers, where processes reach authorized Services through the Workspace identity with no secrets inside the sandbox.
kind: IdentityProvider
metadata:
name: github-actions
spec:
oidcIdentityToken:
issuerURL: https://token.actions.githubusercontent.com
audience: https://example.comkind: IdentityProvider
metadata:
name: eks-prod
spec:
oidcIdentityToken:
issuerURL: https://oidc.eks.eu-central-1.amazonaws.com
audience: https://example.comkind: User
metadata:
name: etl-job
spec:
type: WORKLOAD
groups:
- dataReal-time visibility at the application layer
OpenTelemetry-ready, application-layer aware, structured auditing and visibility emitted to your OpenTelemetry OTLP receivers, where they can be exported to your log management and SIEM tools.
- Application-layer detail includes HTTP requests and responses, database queries, Kubernetes verbs and resources, SSH session recordings, and MCP and LLM operations.
- Because the request is attributed to an Octelium User rather than to a shared IAM identity, an audit shows which person or job made a call rather than which key was used.
- Logs are exported over OpenTelemetry OTLP in real-time to SIEM providers you already operate.
A scalable platform that also deploys your workloads
A Cluster runs on Kubernetes and uses it to scale its own data plane, place Service proxies across Gateways, and run containerized applications that the Cluster itself deploys.
- Seamlessly deploy, scale and serve containerized applications as Service upstreams.
- The Cluster is managed declaratively. Resources are defined in YAML, kept in a Git repository, and applied with a single octeliumctl apply that reproduces the entire Cluster state.
- Management is centralized over the Cluster's gRPC APIs, so the Cluster is fully programmable and no configuration change requires SSH access to an instance.
$ octeliumctl apply ./cluster
Secret: s3-bucket-1 Updated
Secret: rds-password Updated
IdentityProvider: eks-prod Created
Policy: s3-read-only Created
Group: analysts Created
Group: sre Updated
Service: s3.aws Created
Service: my-lambda.aws Created
Service: rds-prod.db Created
Namespace: aws Created
Cluster Core resources successfully applied
7 resources created
3 resources updated
ClusterConfig updatedWhat a team reaches in an AWS account, and how
Access to AWS is rarely one problem. These are the kinds of resource that come up, next to the mechanism in an Octelium Cluster that reaches each one.
- 01
Private resources inside a VPC
An internal service, an EC2 instance or an internal load balancer becomes a Service with a stable private name, reached over the tunnel. Nothing is exposed publicly and no bastion has to be kept running for people to hop through.
Read more - 02
Resources in another VPC or region
A Service upstream can be an address that is only reachable from the side of a connected host inside that VPC, which serves it over its own outbound tunnel. Accounts, regions and peering arrangements stop being something the person connecting has to know about.
Read more - 03
RDS PostgreSQL and MySQL
The database password is held as a Secret and injected after authorization, and the Service can force the upstream database user and database regardless of what the client asks for. Queries are recorded with the identity that ran them.
Read more - 04
S3 buckets
The HTTP mode signs requests upstream with AWS Signature Version 4 using an access key held in the Cluster, so a team or a workload reads a bucket over an ordinary HTTPS client without holding an IAM key.
Read more - 05
Lambda function URLs
The same SigV4 mechanism covers Lambda function URLs, with the service field set to lambda, so an invocation is authorized per request against identity and the HTTP request itself.
Read more - 06
EKS clusters
The Kubernetes mode holds the kubeconfig, client certificate or bearer token and authorizes each API request by verb, resource, namespace, API group and name, so nobody needs a kubeconfig of their own.
Read more - 07
Other AWS APIs
SigV4 signing takes the region and service name as configuration, so the same pattern extends to other AWS APIs that a team or an application needs to call without an IAM identity of its own.
Read more - 08
Workloads that run inside AWS
An EKS cluster or a CI system that publishes an OpenID Connect issuer can authenticate its own workloads to the Cluster with federated assertions, so no long-lived credential has to be stored alongside the job.
Read more
IAM still decides what the Cluster's own credential may do. What changes is that the credential stays in one place, and the decision about who may use it is made per request against an identity you already manage.
The same platform capabilities ship with every deployment, whichever way you use it.
Frequently asked
- Does this replace IAM?
- No. IAM still governs what the credential held by the Cluster is allowed to do inside AWS. What changes is who holds that credential: it stays in the Cluster and is used to sign or authenticate the upstream request after Octelium has authenticated and authorized the caller, so individual people and jobs do not each need an IAM identity and a key on disk.
- How does secretless access to S3 and Lambda work?
- The HTTP mode supports AWS Signature Version 4 as an upstream authentication method. An access key ID, a secret access key held as a Secret, a region and a service name are configured on the Service, and the proxy signs each authorized request upstream. Callers use an ordinary HTTPS client and their own Octelium credential.
- Can it reach resources in several accounts and regions?
- Yes. A Service upstream can be an address that is only reachable from the side of a connected host inside that network, which serves it over its own outbound tunnel, so a VPC in another account or region needs no peering, no transit gateway change and no inbound port. Each resource is still reached through a single stable route on the client.
- Does the Cluster have to run inside AWS?
- No. An Octelium Cluster runs on any Kubernetes, managed or on-premise, including EKS. The quick installer provisions a complete single-node Cluster, including Kubernetes itself, on one fresh Linux VM with 2 vCPUs, 2 GB of RAM and a domain you own, which is enough for evaluation.
- How do workloads inside AWS authenticate?
- Workload Users can authenticate with authentication tokens, the OAuth2 client credentials flow, or secretlessly with federated OpenID Connect assertions issued by the platform hosting them, including an EKS cluster that publishes an OIDC issuer and CI systems such as GitHub Actions. No special SDK or client is required.
- Is Octelium free and open source?
- Yes. Octelium is free and open source and is designed for single-tenant self-hosting. There is no proprietary cloud-based control plane, and it is not a limited edition of a separate paid product. An enterprise package is available for organizations that need capabilities such as a web console, SCIM provisioning and secret encryption at rest, and it is free for personal, homelab and evaluation use.
Related solutions
Zero trust database access
Secretless PostgreSQL and MySQL access with per-request authorization and application-layer auditing.
Read moreZero trust Kubernetes access
Per-verb Kubernetes authorization with the kubeconfig held by the Cluster rather than handed to a User.
Read moreZero trust SaaS and API access
Secretless access to protected public resources, so a team reaches a SaaS API without holding its key.
Read moreDeploy Octelium on your own infrastructure in minutes
Free and open source. Self-hosted. No vendor lock-in.