Checkout No Persist Credentials
github-actions.checkout-no-persist-credentials
Flags actions/checkout steps that don't set persist-credentials: false.
The default (true) stores GITHUB_TOKEN in .git/config, which leaks if the
checkout directory is uploaded as an artifact (ArtiPACKED attacks, 2024).
Jobs whose risk has been accepted can be exempted with exempt_jobs.
Compatible Integrations
This guardrail works with the following integrations. Click to see how to use Checkout No Persist Credentials with each collector.
Enable This Guardrail
Add the parent policy to your lunar-config.yml to enable this guardrail.
policies:
- uses: github://earthly/lunar-lib/policies/github-actions@v1.0.5
include: [checkout-no-persist-credentials]
# with: ...
How This Guardrail Works
This guardrail is part of the GitHub Actions Security Guardrails policy. It evaluates data collected by integrations and produces a pass/fail check with actionable feedback.
When enabled, this check runs automatically on every PR and in AI coding workflows, providing real-time enforcement of your engineering standards.
Learn How Lunar Works →Configuration Options
These inputs can be configured in your lunar-config.yml to customize
how the parent policy (and this guardrail) behaves.
| Input | Required | Default | Description |
|---|---|---|---|
exempt_jobs
|
Required | — | Workflow jobs exempt from `checkout-no-persist-credentials`, for a risk that has been reviewed and accepted. Entries are `<workflow-file>:<job-id>`, separated by newlines or commas: ```yaml with: exempt_jobs: | # accepted TICKET-123 — repo-scoped 1h token, no artifact upload .github/workflows/publish.yaml:push ``` The workflow matches the collected path or its bare filename; the job id is the key under `jobs:`. `#` comments are ignored, so the rationale can sit next to the entry it explains. An exemption never turns a finding into a pass. Findings that are not exempt still fail; the check resolves to `skip`, naming each exempted job, only when every finding it made was exempted. An entry that cannot be parsed fails the check without exempting anything. An entry naming a workflow the component has but a job it does not define is reported as stale. An entry whose workflow file the component does not have at all is ignored — one policy entry is normally shared by every component in its scope. |
GitHub Actions Security Guardrails
This guardrail is part of the GitHub Actions Security Guardrails policy, which includes 6 guardrails for security and compliance.
Ready to Automate Your Standards?
See how Lunar can turn your AGENTS.md, engineering wiki, compliance docs, or postmortem action items into automated guardrails with our 200+ built-in guardrails.