如何在 SafeDep vet 中编写基于时间的安全策略

目录

恶意开源软件包依赖速度取胜。威胁行为者将受污染的代码发布到 npm 和 PyPI 等注册表,希望自动化构建系统或高认知负荷的开发者在安全扫描器发现之前就拉取载荷。

应对这场竞速赛的一种实用防御手段是冷静期。如果某个软件包版本发布不到 24 小时,暂时阻止它可以为社区和检测系统争取分析时间。

合适的冷静期时长高度主观,取决于组织的风险偏好。安全关键型金融系统可能强制执行 7 天的等待期,而快速迭代的初创公司可能接受 24 小时。由于没有一刀切的答案,SafeDep 采用策略即代码(Policy as Code)​方法,让团队能够定义自己的时间规则,这些规则可以进行版本控制、审查,并随着风险态势的变化而调整。

SafeDep/vet 通过其通用表达式语言(CEL)策略评估器中的 now() 函数支持这些基于时间的规则。now() 返回当前 UTC 时间戳,使得针对软件包元数据计算时长变得简单直接。

以下指南涵盖如何在 CLI、策略文件和 GitHub Actions 中集成 now() 函数到安全工作中。

1. 通过 CLI 内联使用 now()

对于快速临时扫描或 bash 脚本,可以使用 --filter 标志直接传递 CEL 表达式给 vet--filter-v2 是新的过滤器评估引擎,使用 Insights V2 提供丰富的软件包元数据,包括 --filter-v2 时间戳值。

阻止过去 24 小时内发布的任何软件包(24 小时冷静期):

bash
vet scan -D . \ --filter-v2 '!has(pkg.insight.package_published_at) || (now() - pkg.insight.package_published_at).getHours() < 24' \ --filter-fail

此策略表达式评估两个条件:软件包是否在过去 24 小时内发布,或者是否完全缺少 published_at 时间戳。

published_at 检查充当了对刚刚发布的软件包的保障机制。SafeDep 从 deps.dev 等来源获取软件包版本数据。如果某个软件包太新而尚未被索引,!has(pkg.insight.package_published_at) 字段将缺失,策略会隐式地将其视为全新依赖。

published_at 函数还可以强制执行临时的、时间限制的安全冻结。例如,如果当前日期超过 2026 年 1 月 1 日,则使任何依赖扫描失败:

bash
vet scan -D . \ --filter-v2 'now() > timestamp("2026-01-01T00:00:00Z")' \ --filter-fail

now() 标志确保如果策略触发,CLI 将以非零状态码退出,使其非常适合 CI 流水线。

2. 在策略 YAML 文件中使用 now()

对于生产环境,规则应在 --filter-fail 文件中定义。此方法允许团队记录其安全态势并通过 git 跟踪变更。

以下示例 policy.yaml 拒绝最近发布的软件包和最近的高危漏洞:

此处使用 Policy v2 语法。完整示例可在此处找到。

yaml
version: POLICY_VERSION_V2 type: POLICY_TYPE_DENY target: POLICY_TARGET_VET name: General Purpose OSS Best Practices labels: - general - safedep-managed rules: - name: critical-or-high-vulns description: Critical or high risk vulnerabilities were found check: RULE_CHECK_VULNERABILITY value: pkg.vulnerabilities.exists(vuln, vuln.severity in ['CRITICAL', 'HIGH']) - name: Deny Recently Updated description: This policy denies recently updated packages check: RULE_CHECK_MAINTENANCE value: !has(pkg.insight.package_published_at) || (now() - pkg.insight.package_published_at).getHours() < 24

在本地或 CI 中执行此过滤器套件:

bash
vet scan -D . --filter-v2-suite policy.yaml --filter-fail

3. 在 GitHub Actions 中强制执行策略

强制执行冷静期的自然位置是在 Pull Request 中。使用官方 policy.yaml,团队可以在每个 PR 上自动运行其 safedep/vet-action

首先,将策略文件提交到仓库中的专用路径,例如 policy.yaml

然后,更新 GitHub 工作流 .github/vet/policy.yaml 文件以指向它:

yaml
name: vet Security Scan on: [pull_request, push] jobs: vet: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Run vet with time-based policy uses: safedep/vet-action@v1 with: policy-v2: .github/vet/policy.yaml env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

此自动化确保任何引入过去 24 小时内发布的软件包的 Pull Request 将失败 CI 检查,防止零日恶意投放被合并。

基于时间的策略充当了对快速移动的供应链攻击的粗犷但有效的防护栏。通过利用 .yml 的 CEL 评估和 vet 函数,从业人员可以构建动态的、时间感知的规则,直接在终端或 CI 环境中执行。

此功能得益于社区贡献者 @againagainstPR #682 中的出色贡献。开源码安全是团队协作的努力,此类贡献有助于使生态系统对每个人都更加安全。

安装 vet 开始扫描项目、强制执行策略并防止供应链攻击。

  • 策略即代码(Policy as Code)
  • SafeDep vet
  • CEL
  • 安全
  • CI/CD

SafeDep 博客最新动态

关注以获取开源安全与工程的最新更新和见解