CI Egress Allowlist¶
This page documents the network endpoints CI jobs are allowed to
reach when step-security/harden-runner is operating in block
mode. Managed under
#878.
Status¶
All 76 jobs across the 28 workflow files in .github/workflows/ are
currently in audit mode — harden-runner is the first step in
every job and records outbound network calls to the
step-security telemetry dashboard but
does not block them.
The next iteration (tracked as a follow-up under #878) flips each
group to block once the audit-mode runs confirm the allowlist is
complete. Switching one job at a time keeps blast radius small:
a missing endpoint on a block-mode job fails the run loud and the
list below gets updated.
Allowlist (by domain)¶
This is the union of endpoints the entire workflow surface needs.
When flipping a specific job to block mode, narrow this list to
the endpoints that particular job actually touches.
GitHub itself (universally required)¶
| Endpoint | Used by | Why |
|---|---|---|
github.com:443 |
every job | git clone, gh CLI |
api.github.com:443 |
every job | gh CLI, issue/PR API |
objects.githubusercontent.com:443 |
every job | release-asset downloads, LFS objects |
*.actions.githubusercontent.com:443 |
every job | runner ↔ orchestrator |
pkg.actions.githubusercontent.com:443 |
every job | action-cache CDN |
results-receiver.actions.githubusercontent.com:443 |
every job | workflow telemetry |
codeload.github.com:443 |
jobs that git clone tagged refs |
tarball downloads for some actions |
uploads.github.com:443 |
jobs that upload artifacts | actions/upload-artifact |
raw.githubusercontent.com:443 |
the install-script jobs | curl-pull of unversioned content |
Package managers (apt, brew, cargo, npm, luarocks)¶
| Endpoint | Used by | Why |
|---|---|---|
azure.archive.ubuntu.com:443 |
ubuntu jobs running apt-get |
apt mirror |
archive.ubuntu.com:80 |
ubuntu jobs running apt-get |
apt mirror |
security.ubuntu.com:80 |
ubuntu jobs running apt-get |
security updates |
keyserver.ubuntu.com:443 |
jobs that add repo signing keys | GPG keyserver |
formulae.brew.sh:443 |
macOS jobs running brew |
Homebrew formula index |
ghcr.io:443 + *.docker.io:443 |
docker / container jobs | image pulls |
registry.npmjs.org:443 |
npm-publish.yml + the pre-commit npm hook | npm metadata + publish |
registry-1.docker.io:443 |
docker jobs | image manifests |
crates.io:443 + static.crates.io:443 |
cargo-install jobs | crate downloads |
index.crates.io:443 |
cargo-install jobs | crate index |
luarocks.org:443 + *.luarocks.org:443 |
reusable-lua-lint.yml | luacheck install |
Project-specific installers (chezmoi / mise / starship / stylua / typos / etc.)¶
| Endpoint | Used by | Why |
|---|---|---|
get.chezmoi.io:443 |
setup-chezmoi composite (fallback path) |
chezmoi installer |
mise.run:443 |
setup-mise composite |
mise installer |
releases.starship.rs:443 |
mise-managed install of starship | starship binary |
Security / SBOM / scanning¶
| Endpoint | Used by | Why |
|---|---|---|
api.osv.dev:443 |
grype / scorecard | OSV vuln database |
vulners.com:443 |
grype | vulnerability metadata |
toolbox-data.anchore.io:443 |
anchore/sbom-action | SBOM tooling |
api.deps.dev:443 |
future deps.dev integration (#877) | package metadata |
api.securityscorecards.dev:443 |
scorecard.yml | publish_results upload |
*.codeql.github.com:443 |
codeql.yml | CodeQL bundle download |
Job-level egress notes (legitimate broad-egress jobs)¶
A few jobs need wider network access than the standard allowlist covers. Each carries an inline comment near the harden-runner step explaining the deviation so reviewers can audit at a glance.
update-deps.yml — broad GitHub API egress¶
Polls multiple github.com/<repo>/releases/latest endpoints to find
new tool versions. Allowlist needs to include api.github.com:443
and the raw-content domain for sed-replacing version strings.
devcontainer-prebuild.yml — registry push¶
Pushes to ghcr.io:443 with the packages: write token. The egress
allowlist for that job is the standard set plus ghcr.io writes.
nightly.yml — Beta/Nightly Tools Test job¶
This job deliberately runs curl ... | tar -xJf - against the
shellcheck release. Justified because the job is continue-on-error: true
and is opt-in (manual or scheduled). Future hardening: download the
release asset, verify a known hash, then exec — same shape as
tools/ci/install-chezmoi-verified.sh.
Updating this page¶
Whenever a job is flipped to block mode:
- Run the audit-mode workflow at least once after every recent workflow change to make sure the harden-runner telemetry reflects reality.
- Visit the step-security dashboard filtered to the repo + job + last 7 days.
- Add any endpoints the dashboard reports that aren't already in this page's tables.
- Edit the job to set
egress-policy: blockand add the per-joballowed-endpoints:block listing only what that specific job needs (not the whole union). - Land the change, watch the first run; if anything fails the run loud, add the missing endpoint and retry.
References¶
step-security/harden-runner— https://github.com/step-security/harden-runnerdocs/security/SCORECARD.md— Token-Permissions check ties to harden-runner adoption.- Issue #878.