securing-github-actions-workflows

本技能涵盖加固 GitHub Actions 工作流以防范供应链攻击、凭据盗窃和权限提升。 内容包括将 action 固定到 SHA 摘要、最小化 GITHUB_TOKEN 权限、防止机密泄露、 防止工作流表达式中的脚本注入,以及为工作流变更实施必要的审阅者机制。

9 stars

Best use case

securing-github-actions-workflows is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

本技能涵盖加固 GitHub Actions 工作流以防范供应链攻击、凭据盗窃和权限提升。 内容包括将 action 固定到 SHA 摘要、最小化 GITHUB_TOKEN 权限、防止机密泄露、 防止工作流表达式中的脚本注入,以及为工作流变更实施必要的审阅者机制。

Teams using securing-github-actions-workflows should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/securing-github-actions-workflows/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/securing-github-actions-workflows/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/securing-github-actions-workflows/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How securing-github-actions-workflows Compares

Feature / Agentsecuring-github-actions-workflowsStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

本技能涵盖加固 GitHub Actions 工作流以防范供应链攻击、凭据盗窃和权限提升。 内容包括将 action 固定到 SHA 摘要、最小化 GITHUB_TOKEN 权限、防止机密泄露、 防止工作流表达式中的脚本注入,以及为工作流变更实施必要的审阅者机制。

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 加固 GitHub Actions 工作流

## 使用场景

- 当 GitHub Actions 是 CI/CD 平台且工作流需要针对供应链攻击进行加固时
- 当工作流处理机密、部署到生产环境或具有提升的权限时
- 当需要防止通过不受信任的 PR 标题、分支名称或提交信息进行脚本注入时
- 当需要工作流修改的审计跟踪和审批门禁时
- 当第三方 action 通过可变版本标签带来供应链风险时

**不适用于**加固其他 CI/CD 平台(参见特定平台加固指南)、应用程序漏洞扫描(使用 SAST/DAST)或代码中的机密检测(使用 Gitleaks)。

## 前置条件

- 已启用 GitHub Actions 的 GitHub 仓库
- GitHub 组织管理员访问权限(用于组织级设置)
- 了解 GitHub Actions 工作流语法和事件

## 操作流程

### 步骤 1:将 Action 固定到 SHA 摘要

```yaml
# 不安全:可变标签可能被攻击者覆盖
- uses: actions/checkout@v4

# 安全:固定到不可变的 SHA 摘要
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11  # v4.1.1

# 使用 Dependabot 自动更新固定的 SHA
# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    commit-message:
      prefix: "ci"
```

### 步骤 2:最小化 GITHUB_TOKEN 权限

```yaml
# 在工作流级别设置严格的默认权限
name: CI Pipeline
permissions: {}  # 从零权限开始

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read  # 仅授予所需权限
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11

  deploy:
    runs-on: ubuntu-latest
    needs: build
    if: github.ref == 'refs/heads/main'
    permissions:
      contents: read
      deployments: write
      id-token: write  # 用于基于 OIDC 的云认证
    steps:
      - name: Deploy
        run: echo "deploying"
```

### 步骤 3:防止脚本注入

```yaml
# 存在漏洞:run 步骤中包含用户控制的输入
- run: echo "PR title is ${{ github.event.pull_request.title }}"

# 安全:使用环境变量(由 shell 正确转义)
- name: Process PR
  env:
    PR_TITLE: ${{ github.event.pull_request.title }}
    PR_BODY: ${{ github.event.pull_request.body }}
  run: |
    echo "PR title is ${PR_TITLE}"
    echo "PR body is ${PR_BODY}"

# 安全:使用 actions/github-script 处理复杂操作
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
  with:
    script: |
      const title = context.payload.pull_request.title;
      console.log(`PR title: ${title}`);
```

### 步骤 4:安全处理 Fork Pull Request

```yaml
# 危险:pull_request_target 以基础仓库权限运行
# on: pull_request_target  # 除非绝对必要,否则避免使用

# 安全:pull_request 在 fork 上下文中以有限权限运行
on:
  pull_request:
    branches: [main]

# 如果必须使用 pull_request_target,切勿检出 PR 代码:
on:
  pull_request_target:
    types: [labeled]

jobs:
  safe-job:
    if: contains(github.event.pull_request.labels.*.name, 'safe-to-test')
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      # 切勿执行:带 ref: ${{ github.event.pull_request.head.sha }} 的 actions/checkout
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
        # 这会检出基础分支,而非 PR 分支
```

### 步骤 5:保护机密和环境变量

```yaml
jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production  # 需要审批
    steps:
      - name: 使用机密进行部署
        env:
          # 机密在日志中自动屏蔽
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
        run: |
          # 切勿打印机密
          # echo "$DEPLOY_KEY"  # 错误做法
          deploy-tool --key-file <(echo "$DEPLOY_KEY")

      - name: 审计机密访问
        run: |
          # 记录机密使用情况而不暴露内容
          echo "::notice::已为生产部署访问部署密钥"
```

### 步骤 6:实施工作流变更控制

```yaml
# 要求 CODEOWNERS 审批工作流变更
# .github/CODEOWNERS
.github/workflows/ @security-team @platform-team
.github/actions/ @security-team @platform-team

# 组织设置:
# 1. 设置 > Actions > 常规 > Fork PR 策略
#    - 首次贡献者需要审批
#    - 所有外部协作者需要审批
# 2. 设置 > Actions > 常规 > 工作流权限
#    - 读取仓库内容和包的权限
#    - 不允许 GitHub Actions 创建和审批 PR
```

## 关键概念

| 术语 | 定义 |
|------|------|
| SHA 固定 | 通过不可变的提交 SHA 而非可变版本标签引用 GitHub Action |
| 脚本注入 | 不受信任的输入(PR 标题、分支名称)被插入到 shell 命令中的攻击 |
| GITHUB_TOKEN | 自动生成的令牌,权限范围限于当前仓库,可配置 |
| pull_request_target | 危险的事件触发器,在 fork PR 上以基础仓库的完整权限运行 |
| 环境保护 | GitHub 功能,要求在访问环境的作业运行前进行人工审批 |
| CODEOWNERS | 定义特定路径(包括工作流文件)所需审阅者的文件 |
| OIDC 联合 | 使用 GitHub 的 OIDC 令牌向云提供商认证,无需存储长期凭据 |

## 工具与系统

- **Dependabot**:自动化依赖更新器,保持固定的 action SHA 处于最新状态
- **StepSecurity Harden Runner**:监控并限制工作流出站网络调用的 GitHub Action
- **actionlint**:检测安全问题的 GitHub Actions 工作流文件代码检查器
- **allstar**:OpenSSF 的 GitHub App,对仓库强制执行安全策略
- **scorecard**:评估供应链安全实践(包括 CI/CD)的 OpenSSF 工具

## 常见场景

### 场景:防范受攻陷的第三方 Action 供应链攻击

**背景**:一个广泛使用的 GitHub Action 被攻陷,其 v3 标签被更新为包含凭据盗窃代码。使用 `@v3` 的仓库自动拉取恶意版本。

**方法**:
1. 立即在所有仓库中将所有 action 固定到 SHA 摘要
2. 为 github-actions 生态系统配置 Dependabot 以管理 SHA 更新
3. 限制 GITHUB_TOKEN 权限,使即便受攻陷的 action 也只有最小访问权限
4. 添加 StepSecurity harden-runner 以检测异常的出站网络调用
5. 审查所有第三方 action,并将不必要的替换为内联脚本
6. 要求对 `.github/workflows/` 的任何变更进行 CODEOWNERS 审批

**注意事项**:不使用 Dependabot 的 SHA 固定意味着错过 action 的合法安全更新。过于严格的权限可能破坏合法工作流。使用 `pull_request_target` 进行基于标签的门控,如果工作流检出 PR 代码仍会暴露机密。

## 输出格式

```
GitHub Actions 安全审计
================================
仓库:org/web-application
日期:2026-02-23

工作流分析:
  工作流总数:8
  Action 引用总数:34

SHA 固定:
  [失败] 12/34 个 action 使用可变标签而非 SHA 摘要
  - .github/workflows/ci.yml: actions/setup-node@v4
  - .github/workflows/deploy.yml: aws-actions/configure-aws-credentials@v4

权限:
  [失败] 3/8 个工作流没有明确权限定义(继承默认值)
  [警告] 1/8 个工作流请求 write-all 权限

脚本注入:
  [失败] 2 个工作流步骤直接插入用户输入
  - .github/workflows/pr-check.yml:23: ${{ github.event.pull_request.title }}

机密:
  [通过] 工作流日志中没有暴露机密
  [通过] 所有生产部署使用环境保护

评分:6/10(修复 5 个高危发现)
```

Related Skills

securing-serverless-functions

9
from killvxk/cybersecurity-skills-zh

本技能涵盖 AWS Lambda、Azure Functions 和 Google Cloud Functions 等无服务器计算平台的安全加固,涉及最小权限 IAM 角色、依赖漏洞扫描、密钥管理集成、输入验证、函数 URL 认证以及运行时监控,以防范注入攻击、凭证窃取和供应链攻击。

securing-remote-access-to-ot-environment

9
from killvxk/cybersecurity-skills-zh

本技能涵盖为操作员、工程师和供应商实施OT/ICS环境的安全远程访问,同时防止可能危害工业运营的未授权访问。涉及跳板服务器架构、多因素认证、会话记录、特权访问管理、供应商远程访问控制,以及符合IEC 62443和NERC CIP-005远程访问要求。

securing-kubernetes-on-cloud

9
from killvxk/cybersecurity-skills-zh

本技能涵盖通过实施 Pod 安全标准(Pod Security Standards)、网络策略、工作负载身份、RBAC 权限控制、镜像准入控制和运行时安全监控,对 EKS、AKS 和 GKE 上的托管 Kubernetes 集群进行加固。涉及云平台特定安全功能,包括 EKS 的 IRSA、GKE 的工作负载身份(Workload Identity)以及 AKS 的托管身份(Managed Identity)。

securing-historian-server-in-ot-environment

9
from killvxk/cybersecurity-skills-zh

本技能涵盖在OT环境中加固和保护过程历史数据服务器(OSIsoft PI、Honeywell PHD、GE Proficy、AVEVA Historian)。涉及跨Purdue模型各层级的网络部署、历史数据服务器接口的访问控制、通过数据二极管或PI-to-PI连接器在DMZ中进行数据复制、历史数据查询中的SQL注入防护,以及用于安全分析、法规报告和过程优化的过程数据完整性保护。

securing-helm-chart-deployments

9
from killvxk/cybersecurity-skills-zh

通过验证 Chart 完整性、扫描模板中的错误配置并在 Kubernetes 发布中强制执行安全上下文,保护 Helm Chart 部署安全。

securing-container-registry-with-harbor

9
from killvxk/cybersecurity-skills-zh

Harbor 是一个开源容器镜像仓库,提供安全功能包括漏洞扫描(集成 Trivy)、镜像签名(Notary/Cosign)、RBAC、内容信任策略(Content Trust)、复制和审计日志。配置这些功能以强制执行镜像来源验证、防止有漏洞镜像部署并维护仓库访问控制。

securing-container-registry-images

9
from killvxk/cybersecurity-skills-zh

通过使用 Trivy 和 Grype 实施漏洞扫描、使用 Cosign 和 Sigstore 强制执行镜像签名、配置镜像仓库访问控制,以及构建阻止部署未扫描或未签名镜像的 CI/CD 流水线,来保护容器仓库(Container Registry)中的镜像安全。

securing-aws-iam-permissions

9
from killvxk/cybersecurity-skills-zh

本技能引导从业者加固 AWS 身份和访问管理(Identity and Access Management)配置,在云账户中强制执行最小权限(Least Privilege)访问。涵盖 IAM 策略范围界定、权限边界(Permission Boundary)、Access Analyzer 集成和凭据轮换策略,以降低受损身份的影响范围。

securing-api-gateway-with-aws-waf

9
from killvxk/cybersecurity-skills-zh

通过配置 OWASP Top 10 防护托管规则组(Managed Rule Group)、创建自定义速率限制规则、实施机器人(Bot)控制、设置 IP 信誉过滤以及监控 WAF 指标,使用 AWS WAF 保护 API Gateway 端点。

integrating-sast-into-github-actions-pipeline

9
from killvxk/cybersecurity-skills-zh

本技能涵盖将静态应用安全测试(SAST)工具 CodeQL 和 Semgrep 集成到 GitHub Actions CI/CD 管道中。 内容包括配置对 pull request 和推送的自动代码扫描、调整规则以减少误报、将 SARIF 结果上传到 GitHub Advanced Security,以及建立在检测到高严重性漏洞时阻止合并的质量门禁。

implementing-github-advanced-security-for-code-scanning

9
from killvxk/cybersecurity-skills-zh

配置 GitHub Advanced Security 与 CodeQL,在企业级别对仓库执行自动化静态分析和漏洞检测。

triaging-vulnerabilities-with-ssvc-framework

9
from killvxk/cybersecurity-skills-zh

使用 CISA 的利益相关方特定漏洞分类(SSVC)决策树框架对漏洞进行分类和优先排序,产出可操作的修复优先级:Track、Track*、Attend 或 Act。