Skip to content

Commit 958dc3f

Browse files
authored
Merge pull request #389 from Yubico/feature/least-privilege-workflow-permissions
refactor: apply least privilege principle to workflow permissions
2 parents 85df5ae + 98b7bfd commit 958dc3f

File tree

6 files changed

+48
-34
lines changed

6 files changed

+48
-34
lines changed

.github/workflows/build-pull-requests.yml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,17 @@ on:
2929
- '.github/workflows/build-pull-requests.yml'
3030

3131
permissions:
32-
pull-requests: write
33-
checks: write
3432
contents: read
35-
packages: read
36-
33+
3734
jobs:
3835
run-tests:
3936
name: Run tests
37+
# Requires write permissions to publish test results and coverage reports to PR
38+
permissions:
39+
pull-requests: write # Required to comment on PRs with test results
40+
checks: write # Required to create check runs for test results
41+
contents: read
42+
packages: read
4043
uses: ./.github/workflows/test.yml
4144
with:
4245
build-coverage-report: true

.github/workflows/build.yml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,12 @@ permissions:
5454
jobs:
5555
run-tests:
5656
name: Run tests
57+
# Requires write permissions to publish test results
5758
permissions:
58-
checks: write
59+
checks: write # Required to create check runs for test results
60+
pull-requests: write # Required to comment on PRs with test results
5961
contents: read
6062
packages: read
61-
pull-requests: write
6263
uses: ./.github/workflows/test.yml
6364
with:
6465
build-coverage-report: false
@@ -67,11 +68,12 @@ jobs:
6768
name: Build artifacts
6869
runs-on: windows-2022
6970
needs: run-tests
71+
# Requires write permissions to generate artifact attestations
7072
permissions:
71-
id-token: write
73+
id-token: write # Required for OIDC token generation
74+
attestations: write # Required to attest build provenance
7275
contents: read
7376
packages: read
74-
attestations: write
7577
outputs:
7678
docs-log-id: ${{ steps.docs-log-upload.outputs.artifact-id }}
7779
docs-id: ${{ steps.docs-upload.outputs.artifact-id }}
@@ -180,8 +182,9 @@ jobs:
180182
upload-docs:
181183
name: Upload docs
182184
if: ${{ github.event.inputs.push-to-docs == 'true' }}
185+
# Requires write permission for OIDC authentication to GCP
183186
permissions:
184-
id-token: write
187+
id-token: write # Required for OIDC token generation
185188
contents: read
186189
uses: ./.github/workflows/upload-docs.yml
187190
needs: build-artifacts
@@ -191,9 +194,10 @@ jobs:
191194
runs-on: windows-2022
192195
needs: build-artifacts
193196
if: ${{ github.event.inputs.push-to-dev == 'true' }}
197+
# Requires write permission to publish NuGet packages
194198
permissions:
199+
packages: write # Required to publish to GitHub Packages
195200
contents: read
196-
packages: write
197201
steps:
198202
- name: Harden the runner (Audit all outbound calls)
199203
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0

.github/workflows/claude.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ jobs:
2121
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
2222
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
2323
runs-on: ubuntu-latest
24+
# Requires write permissions for Claude Code to interact with repository
2425
permissions:
25-
contents: write
26-
pull-requests: write
27-
issues: write
28-
id-token: write
29-
actions: read # Required for Claude to read CI results on PRs
26+
contents: write # Required for Claude to commit/push changes
27+
pull-requests: write # Required to comment on and manage PRs
28+
issues: write # Required to comment on and manage issues
29+
id-token: write # Required for OIDC token generation
30+
actions: read # Required for Claude to read CI results on PRs
3031
steps:
3132
- name: Harden the runner (Audit all outbound calls)
3233
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0

.github/workflows/codeql-analysis.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,18 @@ on:
4040
- '.github/workflows/*.yml'
4141

4242
permissions:
43-
# required for all workflows
44-
security-events: write
45-
46-
# only required for workflows in private repositories
47-
actions: read
4843
contents: read
49-
packages: read
5044

5145
jobs:
5246
analyze:
5347
name: Analyze
5448
runs-on: windows-2022
49+
# Requires write permission to upload CodeQL security scan results
50+
permissions:
51+
security-events: write # Required for CodeQL to upload scan results
52+
actions: read # Required for workflows in private repositories
53+
contents: read
54+
packages: read
5555

5656
steps:
5757
- name: Harden the runner (Audit all outbound calls)

.github/workflows/scorecard.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ jobs:
4949
with:
5050
results_file: results.sarif
5151
results_format: sarif
52-
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
53-
# - you want to enable the Branch-Protection check on a *public* repository, or
54-
# - you are installing Scorecard on a *private* repository
55-
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional.
56-
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
52+
# Fine-grained PAT token required to enable Branch-Protection check.
53+
# The token must have "Administration: Read-only" permission.
54+
# To create the PAT, follow: https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional
55+
# Add the token as a repository secret named SCORECARD_TOKEN.
56+
repo_token: ${{ secrets.SCORECARD_TOKEN }}
5757

5858
# Public repositories:
5959
# - Publish results to OpenSSF REST API for easy access by consumers

.github/workflows/test.yml

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,8 @@ on:
5959
# - '.github/workflows/test.yml'
6060

6161
permissions:
62-
pull-requests: write
6362
contents: read
64-
checks: write
65-
packages: read
66-
63+
6764
jobs:
6865
test-windows:
6966
name: Tests
@@ -119,10 +116,14 @@ jobs:
119116
name: CoverageResults
120117
path: code-coverage-results.md
121118

122-
pr-comment-coverage-results:
119+
pr-comment-coverage-results:
123120
name: "Add PR Comment: Coverage Results"
124121
runs-on: ubuntu-latest
125-
needs: build-coverage-report
122+
needs: build-coverage-report
123+
# Requires write permission to comment on PRs with coverage results
124+
permissions:
125+
pull-requests: write # Required to add/update PR comments
126+
contents: read
126127

127128
if: github.event_name == 'pull_request'
128129
steps:
@@ -142,10 +143,15 @@ jobs:
142143
recreate: true
143144
path: code-coverage-results.md
144145

145-
pr-comment-test-results:
146+
pr-comment-test-results:
146147
name: "Add PR Comment: Test Results"
147148
runs-on: ubuntu-latest
148-
needs: [test-windows, test-ubuntu, test-macos]
149+
needs: [test-windows, test-ubuntu, test-macos]
150+
# Requires write permissions to publish test results to PR
151+
permissions:
152+
checks: write # Required to create check runs for test results
153+
pull-requests: write # Required to add/update PR comments
154+
contents: read
149155

150156
if: github.event_name == 'pull_request'
151157
steps:

0 commit comments

Comments
 (0)