ffalcinelli/pinner

GitHub: ffalcinelli/pinner

Pinner 是一款 Rust 编写的 CLI 工具,通过将 CI/CD 工作流中的可变标签锁定为不可变 commit SHA 或镜像 digest 来保障供应链安全。

Stars: 0 | Forks: 0

# Pinner 🧪 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/f2585a88c2114616.svg)](https://github.com/ffalcinelli/pinner/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/ffalcinelli/pinner/graph/badge.svg)](https://codecov.io/gh/ffalcinelli/pinner) [![Rust](https://img.shields.io/badge/rust-1.80%2B-orange.svg)](https://www.rust-lang.org) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![GitHub release](https://img.shields.io/github/v/release/ffalcinelli/pinner)](https://github.com/ffalcinelli/pinner/releases) [![Docs.rs](https://docs.rs/pinner/badge.svg)](https://docs.rs/pinner) 一款高性能的 Rust CLI 实用工具,用于**对您的 CI/CD 依赖进行哈希锁定(hash-pin)**。通过将易变、可变的标签(如 `@v2`)转换为不可变的加密 commit SHA(如 `@df4cb1c...`)来保护您的供应链安全。 [**🚀 入门指南**](https://ffalcinelli.github.io/pinner/getting-started.html) ## 为什么要进行锁定?🔒 在 GitHub Actions 或其他 CI/CD 提供商中使用像 `@v2` 或 `@main` 这样的可变标签会带来安全风险。如果攻击者获得了依赖项仓库的访问权限,他们就可以将该标签移动到恶意 commit,从而导致您的基础设施遭受供应链攻击。 哈希锁定可确保您每次运行的**正是**您已审计过的代码。Pinner 会自动执行此过程,同时通过将原始标签作为注释附加在后方,来保持工作流的易读性。 ## 功能 ✨ - **精准替换**:使用 `tree-sitter` 进行精确的 YAML 解析,完美保留注释、缩进和格式。 - **多平台支持**:支持 GitHub、GitLab、Bitbucket 和 Forgejo/Gitea。 - **保留标签**:自动将原始标签作为注释附加(例如 `@ # v2`)。 - **容器锁定**:自动将 Docker 镜像锁定为其不可变的 digest(例如 `image: alpine@sha256:...`)。 - **灵活升级**:提供多种策略以保持您的 actions 处于最新状态(Major、Minor、Latest)。 - **适配 CI**:包含一个 `verify` 模式,以确保您的 PR 中的所有 actions 保持锁定状态。 ## 安装 🛠️ ### 一行命令安装(推荐) **macOS/Linux:** ``` curl -LsSf https://raw.githubusercontent.com/ffalcinelli/pinner/main/install.sh | sh ``` **Windows:** ``` powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/ffalcinelli/pinner/main/install.ps1 | iex" ``` ### 从源码安装 ``` cargo install pinner ``` ## 用法 🚀 ### 1. 锁定所有 actions 扫描工作流并将所有标签转换为锁定的哈希值。 ``` pinner pin ``` *输入:* `- uses: actions/checkout@v3` *输出:* `- uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3` ### 2. 升级至最新版本 根据策略将已锁定的 actions 更新至最新版本。 ``` # 默认:升级到最新可用版本 pinner upgrade ``` ``` # 仅在当前主版本内升级(例如:v2.1.0 -> v2.4.5) pinner upgrade --upgrade-strategy major ``` ### 3. 验证锁定 确保工作流中的所有 actions 都已锁定。非常适合 CI pipeline。 ``` pinner verify ``` ## 配置 ⚙️ 可以通过您仓库根目录下的 `.pinner.toml` 文件来配置 Pinner。 ``` # 在 pinning/upgrading 期间要忽略的 action 列表 ignore_actions = ["my-org/private-action"] # 并发 API 请求数量(默认:10) concurrency = 5 # 自定义 API URL(用于 Enterprise 实例) github_url = "https://github.mycompany.com/api/v3" gitlab_url = "https://gitlab.mycompany.com/api/v4" ``` ## 支持的平台 🌐 Pinner 支持多种 CI/CD 和 git 托管平台: | 平台 | 命令 | 用于 Token 的环境变量 | |-------|---------|-------------------| | GitHub | `pinner pin` | `GITHUB_TOKEN` | | GitLab | `pinner pin` | `GITLAB_TOKEN` | | Bitbucket | `pinner pin` | `BITBUCKET_TOKEN` | | Forgejo/Gitea | `pinner pin` | `FORGEJO_TOKEN` | ## CI/CD 集成 🤖 将此内容添加到您的工作流中,以确保所有 actions 保持锁定状态: ``` jobs: verify-pinning: runs-on: ubuntu-latest steps: - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v4 - name: Install Pinner run: curl -LsSf https://raw.githubusercontent.com/ffalcinelli/pinner/main/install.sh | sh - name: Verify Pinning run: pinner verify ``` ## 名称由来 ⚗️ **Pinner** 这个名称的灵感来源于有机化学中的 **Pinner 反应**。该反应由 Adolf Pinner 发现,涉及在酸催化下将活泼的腈转化为高度稳定的 Pinner 盐。 正如 Pinner 反应将易挥发化合物转化为稳定、固定的盐一样,此 CLI 工具也将“浮动”的标签转化为安全、不可变且固定的 commit SHA。 ## 许可证 📄 MIT 许可证。详情请参阅 [LICENSE](LICENSE)。
标签:DevSecOps, Python安全, Rust, YAML, 上游代理, 可视化界面, 安全库, 文档结构分析, 网络流量审计, 通知系统