Skip to content

gateplane-io/vault-plugins

Repository files navigation

GatePlane Vault/OpenBao Plugins

License: ElasticV2 Test Plugins GoReport Card

An Approval-Based,
Just-In-Time (JIT),
Privileged Access Management (PAM)
layer for Vault/OpenBao

logo-darkmode

logo-lightmode


1. 💡 Overview

❓ What is GatePlane?

GatePlane is a project made by Security Professionals for Security Professionals to make time-based, conditional access management approachable and transparent.

Gateplane implements Privileged Access Management (PAM) and Just-In-Time (JIT) access, helping tech groups and companies to give, revoke and monitor permissions across the whole organization. The ultimate goal is to solve problems people in tech organizations stumble upon frequently, such as:

  • Developer: "I need to debug production but I don't have access"
  • IT: “I get around 60 requests for sensitive access per day, and I have to manually set them up and tear them down
  • Security Officer: “I have no idea who has access to what after the last incident and the auditor comes next week
  • Security Engineer: “Setting up this PAM solution will take forever and will change everything we know about our infrastructure

It does so by using the Open-Source and battle-tested tools Vault or OpenBao as its underlying infrastructure, drawing from their Authentication, Authorization, Integrations and Structured Logging principles, avoiding to re-invent the wheel.

GatePlane Community comes free of charge and available for everyone to audit and contribute to it under the Elastic License v2.

More about GatePlane can be found in its Website (under contruction 🚧)

🎯 Key Features

  • Approval-Based Access: Access is granted only if someone else approves of it
  • Access that expires: Every granted access has an expiration date, no exceptions
  • Vast support of Integrations: Supports Kubernetes, AWS/GCP/Azure, SSH, Databases and the whole suite of Vault/OpenBao Secret Engines, as well as JIT Okta Group Membership management
  • WebUI to Request, Approve and Claim access : All available accesses are listed and can be managed through a Web Application tied with your Vault/OpenBao instance
  • Notifications: When a user requests, approves or claims access, a Slack/Discord/MSTeams/you-name-it message is sent
  • 🚧 Metrics: Measurements on the friction relief, numbers of elevated accesses needed and statistics on mean-time-to-claim

❔ Why GatePlane

GatePlane is a community-first project.

It makes Just-In-Time (JIT) Privileged Access Management (PAM) accessible to everyone through Open-Source tools and auditable code.

Our rationale is that trust on the market of PAM solutions is never really gained if auditability is not part of the equation. Also buzzword marketing, and vague promises that often lack technical ground are not in our line of work.

Our mission is enabling everyone to provide these guarantees to their organization without closed-source software, unclear security requirements, opaque components in their threat model and tying their sensitive access to SaaS systems they do not control. All this with direct and honest communication.

🔍 This Repository

This repository contains a series of Vault/OpenBao Plugins (see for: Vault/OpenBao) that enable Vault/OpenBao to act as an Access Control Plane, providing conditional access to resources.

The plugins currently included:

  • Policy Gate: Controls Access to Vault/OpenBao and its Integrations
  • Okta Group Gate: Controls Access to Okta Groups

... more plugins will come in the future ...

2. ✨ Features

🧩 Plugins in Detail

Each plugin is considered a Gate, that needs conditions in order to provide time-limited access to the requesting users. Conditions can be approvals by a number of different users and providing a reason for requesting access. Time-To-Live (TTL) is enforced depending on the type of access provided.

Policy Gate

The Policy Gate plugin can utilize all Vault/OpenBao Secret Engines (see for: Vault/OpenBao), providing a conditional access layer to all of them.

This effectively means that AWS, Kubernetes, SSH or Database access configured through Vault/OpenBao can now be provided through a request/approval flow and also be expiring through configured TTLs.

Okta Group Gate

The Okta Group Gate recreates the request/approval flow to gain expiring access to Okta Groups, for users that access Vault/OpenBao through Okta.

The plugin reaches the Okta API through API credentials stored in Vault/OpenBao and adds the user requesting access to a configured Okta Group for a configured time duration.

🚧 API documentation for each of the plugins is provided here.
Documentation on setting up the plugins is provided below.

📋 Features in Detail

The always-free Community Edition, includes all Vault/OpenBao plugins, that achieve Just-In-Time, Conditional Privileged Access.

These components are self-hostable, with source always available in this repository, and it is allowed to modify to suit your needs, under the terms of Elastic License v2.

Additionally, the GatePlane WebUI under app.gateplane.io domain can be used by setting up your Vault / OpenBao instance, using the instructions provided below.

The Team and Enterprise packages are only used through the WebUI, and are tied to services hosted by GatePlane, such as Notifications and Metrics.

Community Edition

  • Approval-Based Access: Accesses are only granted if selected users approve of it
  • Configurable number of approvers: Sensitive accesses can be protected by more than 1 approvers
  • Just-In-Time Access: All accesses granted expire through a configured TTL
  • Reason for access: Mandated or optional reason for access is embedded in the access request and audit trail
  • GatePlane WebUI under app.gateplane.io: An aggregated view, where one can create, approve and claim access requests

Team and Enterprise Edition

  • Notification Service: Get notified for each access request, approval, claim or revokation on your organization's messaging app

  • Metrics Service: Identify friction points, most used accesses and critical activity windows

  • Dedicated WebUI domain: Access a pre-configured GatePlane WebUI under a custom domain (e.g: <myorg>.app.gateplane.io), allowing for security configurations (e.g: mTLS), Vault/OpenBao login integrations (e.g: Okta login, Userpass, etc) and Access Claim Integrations.

  • Support: Get support on designing your infrastructure access management with GatePlane

  • Zero-Knowledge: GatePlane infrastructure does only get non-sensitive metadata to provide the above features.

Your organization's access control NEVER depends on or is shared with GatePlane infrastructure

3. 💻 Installation / Getting Started

🧰 Prerequisites

A self-hosted Vault (community or enterprise) or an OpenBao instance is needed to set up the GatePlane Plugins. Install options are available in each respective documentation (see for Vault/OpenBao) for host and containerized deployments, both for single node and high-available setups.

Additionally, a plugin directory needs to be set under Vault/OpenBao configuration's plugin_directory directive (see for: Vault/OpenBao).

🚀 How to Install

Downloading and Verifying the Plugins

To register a plugin, it needs to be compiled and located in the Vault/OpenBao plugin directory.

The latest binaries can be downloaded from the Github Releases Page. As SHA256 checksums are needed by Vault/OpenBao to register plugins, the checksums.txt file can also be downloaded for quick reference. Additionally, the plugin version SemVer should be noted, as always provided in the Release description (e.g: v0.1.0-base0.1.0).

Finally, the builds can be verified using the slsa-verifier project's verify-artifact command.

Registering to Plugin Catalog - Manually

As Vault/OpenBao documentation points out (see for Vault/OpenBao), a vault register command should be issued to allow plugins to be enabled.

Note: vault will be used in the examples as the CLI tool, which is interchangeable with bao. If using OpenBao, an alias can be set to use copy-paste from this document, like: alias vault='bao'

Registering the gateplane-policy-gate plugin.

vault plugin register -sha256=<SHA256 found in the 'checksums.txt'> \
    -version="<SemVer found in the Github Release>" \
    auth \  # All GatePlane plugins are of type "auth"
    gateplane-policy-gate

Registering to Plugin Catalog - With GatePlane Terraform modules

GatePlane provides helper Terraform modules, that can be used in Infrastructure-as-Code environments.

This helps keeping version handling at check, while also avoiding manual tinkering with high privilege tokens (like ones allowing plugin registration).

In this case, the GatePlane Setup Terraform module can be used.

module "gateplane_setup" {
  source = "github.com/gateplane-io/terraform-gateplane-setup?ref=0.2.0"

  policy_gate_plugin = {
    filename = "gateplane-policy-gate"  // The name of the binary for Policy Gate
    version  = "v0.1.0-base0.1.0"       // The version provided in Github Release Page
    sha256   = "01ba4..."               // The SHA256 checksum found in the 'checksums.txt'
  }

  okta_group_gate_plugin = {
    filename = "gateplane-okta-group-gate"  // The name of the binary for Okta Group Gate
    version  = "v0.1.0-base0.1.0"           // The version provided in Github Release Page
    sha256   = "4355a..."                   // The SHA256 checksum found in the 'checksums.txt'
  }

  plugin_directory = "/etc/vault/plugins"   // The value provided in the 'plugin_directory' configuration key
}
This module can also be used to set Vault/OpenBao instance's CORS headers to app.gateplane.io, through the domains parameter.

Enabling a Gate - Manually

In this example, the Policy Gate plugin will be used to protect a Vault/OpenBao path, such as aws/prod/object-writer, which can be an AWS Secrets Engine (see for Vault/OpenBao), providing AWS Credentials of an IAM User that can do s3:PutObject actions to critical S3 buckets (e.g: the company's website).

In that case, a Vault/OpenBao policy must exist (e.g: aws-prod-object-writer) that allows access to this path, as follows:

aws-prod-object-writer.hcl

path "aws/prod/object-writer" {
    capabilities = ["read"]
}

To create expiring Vault/OpenBao tokens of this policy, based on approvals, a Gate must be created using the Policy Gate plugin:

vault enable gateplane-policy-gate -path auth/gateplane/aws-prod-object-writer
Note: The auth/gateplane/aws-prod-object-writer path is used for clarity. Any auth/-prefixed path can be used.

Then, configuring this Gate to grant access to the aws-prod-object-writer policy requires accessing the /config endpoint:

vault write auth/gateplane/aws-prod-object-writer/config \
    policies=aws-prod-object-writer \  # multiple policies can be protected at once - separated by comma
    required_approvals=1 \             # additional options can be provided
    require_reason=true

With that, the /request, /approve and /claim endpoints of auth/gateplane/aws-prod-object-writer will be usable as in the Usage Example.

Enabling a Gate - With GatePlane Terraform modules

The Policy Gate Terraform module simplifies the above task, also creating helper policies that allow access to /request, /approve and /claim endpoints, ready to be assigned to Vault/OpenBao Entities.

module "gateplane_aws-prod-object-writer" {
  depends_on = [module.gateplane_setup] // the module registering the plugins
  source     = "github.com/gateplane-io/terraform-gateplane-policy-gate?ref=0.1.0"

  name            = "aws-prod-object-writer"    // The name to be used in the endpoint and policies
  path_prefix     = "gateplane"                 // The path prefix
  endpoint_prefix = ""                          // A prefix for the endpoint

  // The Vault/OpenBao path to protect can be used directly
  protected_path_map = {
    "auth/gateplane/aws-prod-object-writer" = ["read"]
  }

  // The configuration provided to /config
  plugin_options = {
    "required_approvals" : 1,
    "require_reason": true,
  }
}

output "policies" {
    description = "These policies can be used to access the created Gate"
    value = [
        # Grants access to 'claim' and 'create' access requests
        module.gateplane_aws-prod-object-writer.policy_names["requestor"],
        # Grants access to 'list' and 'approve' access requests
        module.gateplane_aws-prod-object-writer.policy_names["approver"],
    ]
}
This module also adds capabilities to the requestor and approver policies so they can be used with GatePlane WebUI, through the enable_ui parameter.

▶️ Usage Example

Requesting Access

Vault/OpenBao Entities writing to the auth/gateplane/aws-prod-object-writer/request will create an access request:

$ VAULT_TOKEN="<requestor-token>" \
    vault write auth/gateplane/aws-prod-object-writer/request \
        reason="I want to get in"  # Reason is configured as mandatory for this gate
Key           Value
---           -----
exp           2025-07-01T10:46:52.418873353Z
iat           2025-07-01T09:46:52.418873353Z
overwrite     false     # Whether a request by this entity has been already created
reason        I want to get in
request_id    5ec53023-d998-6b3d-f58f-49976f3b1af7 # The Entity ID of the Requestor
status        pending   # status can be: pending / approved / active / expired

By design, each Requestor can have exactly one request against a Gate.

Approving Access

Then the Approver can approve using the RequestID:

$ VAULT_TOKEN="<approver-token>" \
    vault write auth/gateplane/aws-prod-object-writer/approve \
        request_id="5ec53023-d998-6b3d-f58f-49976f3b1af7"
Key           Value
---           -----
access_approved true
exp             2025-07-01T10:20:00.326612898Z
iat             2025-07-01T09:50:00.326612898Z
message         access approved
approval_id     5ec53023-d998-6b3d-f58f-49976f3b1af7:dbd64311-28e8-7e28-b1ac-1e5c9aa490e7:+
The Approver gets to know the RequestID either by an out-of-band communication, a LIST to the /request endpoint or the Notification Feature

Claiming Access

The Requestor is notified for the approval by polling the /request endpoint:

$ VAULT_TOKEN="<requestor-token>" \
    vault read auth/gateplane/aws-prod-object-writer/request
Key           Value
---           -----
exp           2025-07-01T10:46:52.418873353Z
grant_code    b4608697-73d5-447d-84e2-e244c78b3165  # Generated once the request is approved
iat           2025-07-01T09:46:52.418873353Z
reason        I want to get in
request_id    5ec53023-d998-6b3d-f58f-49976f3b1af7
status        approved # The state changes to approved

Using the grant_code against the /claim endpoint finally grants the Vault/OpenBao token:

$ VAULT_TOKEN="" \  # see the note
    vault write auth/gateplane/aws-prod-object-writer/claim \
     grant_code="b4608697-73d5-447d-84e2-e244c78b3165"
Key               Value
---               -----
token             s.raPGTZdARXdY0KvHcWSpp5wWZIHNT
token_renewable   false
# Some fields are omitted
policies          ["aws-prod-object-writer"]
Endpoints that issue Vault/OpenBao tokens (like the Policy Gate's /claim endpoint) reject authenticated requests: hashicorp/vault#6074.

🛠️ How to Build and Test

Building

Building the plugin binaries requires Git, Golang 1.24, GoReleaser and GNU make.

With the above requirements, building can be as easy as:

git clone https://github.com/gateplane-io/vault-plugins
cd vault-plugins
make build-plugin
Note: the plugins are built under dist/ and their version is set to v0.0.0-dev. This version string must be provided to Vault/OpenBao to register the plugins to the Plugin Catalog.

Testing

Testing the plugins additionally requires Python 3.12, pip, Terraform/OpenTofu and Docker Compose.

With the above requirements, testing goes like:

pip install -r test/requirements-dev.txt
make load-infra
make export-resources
make test-infra

4. 💬 Contact

🚧 Contributing

⚖️ License

This project is licensed under the Elastic License v2.

This means:

  • ✅ You can use, fork, and modify it for yourself or within your company.
  • ✅ You can submit Pull Requests and redistribute modified versions (with the license attached).
  • ❌ You may not sell it, offer it as a paid product, or use it in a hosted service (e.g: SaaS).
  • ❌ You may not re-license it under a different license.

In short: You can use and extend the code freely, privately or inside your business - just don’t build a business around it without our permission. This FAQ by Elastic greatly summarizes things.

See the ./LICENSES/Elastic-2.0.txt file for full details.