ffalcinelli/pinner
GitHub: ffalcinelli/pinner
Pinner 是一款 Rust 编写的 CLI 工具,通过将 CI/CD 工作流中的可变标签锁定为不可变 commit SHA 或镜像 digest 来保障供应链安全。
Stars: 0 | Forks: 0
# Pinner 🧪
[](https://github.com/ffalcinelli/pinner/actions/workflows/ci.yml)
[](https://codecov.io/gh/ffalcinelli/pinner)
[](https://www.rust-lang.org)
[](https://opensource.org/licenses/MIT)
[](https://github.com/ffalcinelli/pinner/releases)
[](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, 上游代理, 可视化界面, 安全库, 文档结构分析, 网络流量审计, 通知系统