Give CI jobs access to private infrastructure without giving them the whole network.
Authenticate the job with OIDC, apply a policy, and reach only the destinations it allows.
SkiMasque Connect for GitHub Actions
The Action exchanges GitHub OIDC for a renewable credential. Transparent mode routes configured private TCP/UDP and split DNS on dedicated Ubuntu runners. Explicit proxy mode sets HTTP, HTTPS and SOCKS variables for tools that support them. Policy applies to traffic through the gateway; public traffic outside configured routes keeps its normal path.
permissions: id-token: write # the job mints its own OIDC token contents: read steps: - uses: skimasque-dev/connect@v2 with: proxy: gateway.skimasque.com:443 audience: https://gateway.skimasque.com mode: proxy application: terraform - run: terraform apply -auto-approve # egresses through the gateway
The problem
A deployment job may need to reach:
- database
- private API
- Kubernetes API
- internal service
- cloud control endpoint
The traditional answer is often a VPN or VPC route from the CI runner into the private network.
Traditional access
- CI jobpotential
- VPNpotential
- Whole networkpotential
- Everything on it
SkiMasque
- CI jobproves identitycontrol plane
- Identitycheckedcontrol plane
- Policyactive
- Sessionexpires ACTIVEactive
- One destinationdb.prod:5432
SkiMasque makes the access specific to the job.
GitHub Actions flow
- GitHub Actionsacme/widgetOIDCcontrol plane
- Identitypolicycontrol plane
- Policy ACCESS GRANTED
- Session20 minactive
- Gatewayactive
- Databasedb.prod:5432
Example
A Terraform deployment requests:
- WHO
- acme/infrastructure · deploy-production · main
- WHAT
- terraform
- WHERE
- db.prod:5432
- LIMITS
- 20 minutes · 100 Mbps
Result:
Agent sessions close at expiry; CI credentials renew while the job runs.
Pull requests vs production
Feature branch
- WHO
- feature/*
- WHAT
- —
- WHERE
- staging-api:443
- LIMITS
- —
Main
- WHO
- main
- WHAT
- —
- WHERE
- staging-api:443 · db.prod:5432
- LIMITS
- —
Production workflow
- WHO
- deploy-production
- WHAT
- —
- WHERE
- db.prod:5432 · api.prod:443
- LIMITS
- —
These are illustrative policies, not automatic permissions. Configure repository, branch and workflow matches to grant each job the access it needs.
Lifecycle of a CI session
- JOB STARTOIDCcontrol plane
- IDENTITYpolicycontrol plane
- SESSION CREATED ACTIVEactive
- DEPLOYMENT
- JOB COMPLETEpotential
- SESSION EXPIRED EXPIRED
CI/CD integrations
Supported today:
- GitHub Actions
- generic OIDC
- GitLab CI
- Buildkite
Use proxy mode for proxy-aware tools. For psql and other raw-socket tools, configure transparent routes and private DNS, with IP/CIDR policy and a gateway that can reach those networks. Use compatible Action/client releases.
Additional integrations under consideration:
- CircleCI
- Jenkins
- other workload identity providers