我们创建记分卡是为了帮助开源维护者改进他们的安全最佳实践,并帮助开源消费者判断他们的依赖项是否安全。
记分卡是一种自动化工具,可评估与软件安全相关的许多重要启发式方法(“检查”),并为每个检查分配 0-10 分。您可以使用这些分数来了解需要改进的特定领域,以加强项目的安全状况。您还可以评估依赖项引入的风险,并就接受这些风险、评估替代解决方案或与维护人员合作进行改进做出明智的决定。
记分卡徽标的灵感来源:“你通过了!全是 D……还有 A!”
自动对开源项目的安全状况进行分析和信任决策。
使用这些数据主动改善世界所依赖的关键项目的安全状况。
充当现有政策的衡量工具
如果 OSS 使用者需要其依赖项的某些行为,则可以使用记分卡来衡量这些行为。在 V5 版本中,如果有支持的分析,我们将结构化结果视为实现此目的的一种方法。 OSS 使用者可能希望确保他们所依赖的存储库没有被归档(这由archived
探针覆盖),而不是依赖 X/10 的总分或 Y/10 的维护分数。 OpenSSF 采用这种方法及其自己的项目安全基线。
成为所有项目都应遵循的明确报告或要求。
记分卡并不是一种万能的解决方案。得出结果的每一步都是主观的:包括或排除哪些检查、每项检查的重要性以及如何计算分数。检查本身是启发式的;有假阳性和假阴性。
无论是出于适用性、可行性还是观点问题,记分卡结果中包含或排除的内容都会引发大量讨论。创建一个让所有人都满意的记分卡是不可能的,因为不同的受众会关心不同的行为子集。
特别是,聚合分数无法告诉您存储库正在执行或未执行的个人行为。许多检查分数会汇总为一个分数,并且有多种方法可以达到相同的分数。当我们添加新的启发式或改进现有的启发式时,这些分数会发生变化。
记分卡已在数千个项目中运行,以监控和跟踪安全指标。使用记分卡的著名项目包括:
要查看记分卡定期扫描的项目的分数,请导航至网络查看器。您还可以替换以下模板链接中的占位符文本(平台、用户/组织和存储库名称),以生成存储库的自定义记分卡链接: https://scorecard.dev/viewer/?uri=<github_or_gitlab>.com/<user_name_or_org>/<repository_name>
例如:
要查看未包含在 Web 查看器中的项目的分数,请使用记分卡 CLI。
我们每周对 100 万个最关键的开源项目进行一次记分卡扫描,根据其直接依赖关系进行判断,并将结果发布在 BigQuery 公共数据集中。
此数据可在公共 BigQuery 数据集openssf:scorecardcron.scorecard-v2
中找到。最新结果可在 BigQuery 视图openssf:scorecardcron.scorecard-v2_latest
中找到。
您可以使用 BigQuery Explorer 查询数据,方法是导航到“添加数据”>“按名称为项目加注星标”>“openssf”。例如,您可能对项目的分数随时间的变化感兴趣:
SELECT date , score FROM ` openssf.scorecardcron.scorecard-v2 ` WHERE repo . name = " github.com/ossf/scorecard " ORDER BY date ASC
您可以使用bq
工具将最新结果以 JSON 格式提取到 Google Cloud 存储:
# Get the latest PARTITION_ID
bq query --nouse_legacy_sql 'SELECT partition_id FROM
openssf.scorecardcron.INFORMATION_SCHEMA.PARTITIONS WHERE table_name="scorecard-v2"
AND partition_id!="__NULL__" ORDER BY partition_id DESC
LIMIT 1'
# Extract to GCS
bq extract --destination_format=NEWLINE_DELIMITED_JSON
'openssf:scorecardcron.scorecard-v2$<partition_id>' gs://bucket-name/filename-*.json
已检查的项目列表可在此存储库的cron/internal/data/projects.csv
文件中找到。如果您希望我们跟踪更多信息,请随时与其他人一起发送 Pull 请求。目前,此列表仅源自 GitHub 上托管的项目。我们确实计划在不久的将来扩展它们,以适应其他源控制系统上托管的项目。
在您拥有的 GitHub 项目上使用记分卡的最简单方法是使用记分卡 GitHub 操作。该操作会在任何存储库更改时运行,并发出维护人员可以在存储库的安全选项卡中查看的警报。有关更多信息,请参阅记分卡 GitHub Action 安装说明。
如需查询OSS项目预算分数,请使用REST API。
要使您的项目能够在 REST API 上使用,请在记分卡 GitHub 操作设置中设置publish_results: true
。
REST API 提供的数据已根据 CDLA Permissive 2.0 获得许可。
在记分卡 GitHub Actions 中启用publish_results: true
还允许维护人员在其存储库上显示记分卡徽章以展示他们的辛勤工作。此徽章还会针对对存储库所做的每次更改自动更新。请参阅此 OSSF 博文了解更多详细信息。
要在项目的存储库中包含徽章,只需将以下标记添加到自述文件中:
[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/{owner}/{repo}/badge)](https://scorecard.dev/viewer/?uri=github.com/{owner}/{repo})
要对不属于您的项目运行记分卡扫描,请使用命令行界面安装选项。
平台:目前,Scorecard 支持 OSX 和 Linux 平台。如果您使用的是 Windows 操作系统,您可能会遇到问题。欢迎为支持 Windows 做出贡献。
语言:您必须安装 GoLang 才能运行 Scorecard (https://golang.org/doc/install)
scorecard
可作为 Docker 容器使用:
docker pull gcr.io/openssf/scorecard:stable
要使用特定的记分卡版本(例如 v3.2.1),请运行:
docker pull gcr.io/openssf/scorecard:v3.2.1
要将记分卡作为独立安装:
访问我们的最新版本页面并下载适合您的操作系统的正确 zip 文件。
将二进制文件添加到您的GOPATH/bin
目录(如有必要,请使用go env GOPATH
来识别您的目录)。
我们在发布过程中使用 OpenSSF 的 slsa-framework/slsa-github-generator 生成 SLSA3 签名。要验证发布二进制文件:
attestation.intoto.jsonl
。slsa-verifier -artifact-path < the-zip > -provenance attestation.intoto.jsonl -source github.com/ossf/scorecard -tag < the-tag >
包管理器 | 支持的发行版 | 命令 |
---|---|---|
尼克斯 | 尼克斯操作系统 | nix-shell -p nixpkgs.scorecard |
AUR 助手 | 架构Linux | 使用 AUR 助手安装scorecard |
自制 | macOS 或 Linux | brew install scorecard |
GitHub 对未经身份验证的请求施加 API 速率限制。为了避免这些限制,您必须在运行记分卡之前验证您的请求。有两种方法可以对您的请求进行身份验证:创建 GitHub 个人访问令牌,或创建 GitHub 应用程序安装。
public_repo
范围。根据您的平台,使用以下命令在名为GITHUB_AUTH_TOKEN
、 GITHUB_TOKEN
、 GH_AUTH_TOKEN
或GH_TOKEN
的环境变量中设置令牌。 # For posix platforms, e.g. linux, mac:
export GITHUB_AUTH_TOKEN= < your access token >
# Multiple tokens can be provided separated by comma to be utilized
# in a round robin fashion.
export GITHUB_AUTH_TOKEN= < your access token 1> , < your access token 2>
# For windows:
set GITHUB_AUTH_TOKEN= < your access token >
set GITHUB_AUTH_TOKEN= < your access token 1> , < your access token 2>
或者
set
或export
)使用下面的三个环境变量。 GITHUB_APP_KEY_PATH=<path to the key file on disk>
GITHUB_APP_INSTALLATION_ID=<installation id>
GITHUB_APP_ID=<app id>
这些变量可以从 GitHub 开发者设置页面获取。
记分卡可以仅使用一个参数来运行,即目标存储库的 URL:
$ scorecard --repo=github.com/ossf-tests/scorecard-check-branch-protection-e2e
Starting [CII-Best-Practices]
Starting [Fuzzing]
Starting [Pinned-Dependencies]
Starting [CI-Tests]
Starting [Maintained]
Starting [Packaging]
Starting [SAST]
Starting [Dependency-Update-Tool]
Starting [Token-Permissions]
Starting [Security-Policy]
Starting [Signed-Releases]
Starting [Binary-Artifacts]
Starting [Branch-Protection]
Starting [Code-Review]
Starting [Contributors]
Starting [Vulnerabilities]
Finished [CI-Tests]
Finished [Maintained]
Finished [Packaging]
Finished [SAST]
Finished [Signed-Releases]
Finished [Binary-Artifacts]
Finished [Branch-Protection]
Finished [Code-Review]
Finished [Contributors]
Finished [Dependency-Update-Tool]
Finished [Token-Permissions]
Finished [Security-Policy]
Finished [Vulnerabilities]
Finished [CII-Best-Practices]
Finished [Fuzzing]
Finished [Pinned-Dependencies]
RESULTS
-------
Aggregate score: 7.9 / 10
Check scores:
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| SCORE | NAME | REASON | DOCUMENTATION/REMEDIATION |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 10 / 10 | Binary-Artifacts | no binaries found in the repo | github.com/ossf/scorecard/blob/main/docs/checks.md#binary-artifacts |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 9 / 10 | Branch-Protection | branch protection is not | github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection |
| | | maximal on development and all | |
| | | release branches | |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| ? | CI-Tests | no pull request found | github.com/ossf/scorecard/blob/main/docs/checks.md#ci-tests |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 0 / 10 | CII-Best-Practices | no badge found | github.com/ossf/scorecard/blob/main/docs/checks.md#cii-best-practices |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 10 / 10 | Code-Review | branch protection for default | github.com/ossf/scorecard/blob/main/docs/checks.md#code-review |
| | | branch is enabled | |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 0 / 10 | Contributors | 0 different companies found -- | github.com/ossf/scorecard/blob/main/docs/checks.md#contributors |
| | | score normalized to 0 | |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 0 / 10 | Dependency-Update-Tool | no update tool detected | github.com/ossf/scorecard/blob/main/docs/checks.md#dependency-update-tool |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 0 / 10 | Fuzzing | project is not fuzzed in | github.com/ossf/scorecard/blob/main/docs/checks.md#fuzzing |
| | | OSS-Fuzz | |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 1 / 10 | Maintained | 2 commit(s) found in the last | github.com/ossf/scorecard/blob/main/docs/checks.md#maintained |
| | | 90 days -- score normalized to | |
| | | 1 | |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| ? | Packaging | no published package detected | github.com/ossf/scorecard/blob/main/docs/checks.md#packaging |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 8 / 10 | Pinned-Dependencies | unpinned dependencies detected | github.com/ossf/scorecard/blob/main/docs/checks.md#pinned-dependencies |
| | | -- score normalized to 8 | |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 0 / 10 | SAST | no SAST tool detected | github.com/ossf/scorecard/blob/main/docs/checks.md#sast |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 0 / 10 | Security-Policy | security policy file not | github.com/ossf/scorecard/blob/main/docs/checks.md#security-policy |
| | | detected | |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| ? | Signed-Releases | no releases found | github.com/ossf/scorecard/blob/main/docs/checks.md#signed-releases |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 10 / 10 | Token-Permissions | tokens are read-only in GitHub | github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions |
| | | workflows | |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
| 10 / 10 | Vulnerabilities | no vulnerabilities detected | github.com/ossf/scorecard/blob/main/docs/checks.md#vulnerabilities |
| --------- | ------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
GITHUB_AUTH_TOKEN
必须设置为有效令牌
docker run -e GITHUB_AUTH_TOKEN=token gcr.io/openssf/scorecard:stable --show-details --repo=https://github.com/ossf/scorecard
要使用特定的记分卡版本(例如 v3.2.1),请运行:
docker run -e GITHUB_AUTH_TOKEN=token gcr.io/openssf/scorecard:v3.2.1 --show-details --repo=https://github.com/ossf/scorecard
有关检查失败原因的更多详细信息,请使用--show-details
选项:
./scorecard --repo=github.com/ossf-tests/scorecard-check-branch-protection-e2e --checks Branch-Protection --show-details
Starting [Pinned-Dependencies]
Finished [Pinned-Dependencies]
RESULTS
-------
|---------|------------------------|--------------------------------|--------------------------------|---------------------------------------------------------------------------|
| SCORE | NAME | REASON | DETAILS | DOCUMENTATION/REMEDIATION |
|---------|------------------------|--------------------------------|--------------------------------|---------------------------------------------------------------------------|
| 9 / 10 | Branch-Protection | branch protection is not | Info: 'force pushes' disabled | github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection |
| | | maximal on development and all | on branch 'main' Info: 'allow | |
| | | release branches | deletion' disabled on branch | |
| | | | 'main' Info: linear history | |
| | | | enabled on branch 'main' Info: | |
| | | | strict status check enabled | |
| | | | on branch 'main' Warn: status | |
| | | | checks for merging have no | |
| | | | specific status to check on | |
| | | | branch 'main' Info: number | |
| | | | of required reviewers is 2 | |
| | | | on branch 'main' Info: Stale | |
| | | | review dismissal enabled on | |
| | | | branch 'main' Info: Owner | |
| | | | review required on branch | |
| | | | 'main' Info: 'administrator' | |
| | | | PRs need reviews before being | |
| | | | merged on branch 'main' | |
|---------|------------------------|--------------------------------|--------------------------------|---------------------------------------------------------------------------|
维护者注释允许维护者添加上下文以与记分卡检查结果一起显示。当记分卡对项目安全实践的评估不完整时,注释可以为用户提供附加信息。要查看每个检查的维护者注释,请使用--show-annotations
选项。
有关可用注释或如何进行注释的更多信息,请参阅配置文档。
要在 GitLab 存储库上运行 Scorecard,您必须创建具有以下权限的 GitLab 访问令牌:
read_api
read_user
read_repository
您可以通过设置GITLAB_AUTH_TOKEN
环境变量在 GitLab 存储库上运行 Scorecard:
export GITLAB_AUTH_TOKEN=glpat-xxxx
scorecard --repo gitlab.com/ < org > / < project > / < subproject >
有关在 GitLab CI/CD 中使用记分卡的示例,请参阅此处。
虽然我们专注于 GitLab.com 支持,但 Scorecard 也适用于自托管的 GitLab 安装。如果您的平台托管在子域(例如gitlab.foo.com
),则记分卡应该可以开箱即用。如果您的平台托管在某个 slug 上(例如foo.com/bar/
),您将需要设置GL_HOST
环境变量。
export GITLAB_AUTH_TOKEN=glpat-xxxx
export GL_HOST=foo.com/bar
scorecard --repo foo.com/bar/ < org > / < project >
要使用 GitHub Enterprise 主机github.corp.com
,请使用GH_HOST
环境变量。
# Set the GitHub Enterprise host without https prefix or slash with relevant authentication token
export GH_HOST=github.corp.com
export GITHUB_AUTH_TOKEN=token
scorecard --repo=github.corp.com/org/repo
# OR without github host url
scorecard --repo=org/repo
对于--npm
、 --pypi
、 --rubygems
或--nuget
生态系统中的项目,您可以选择使用包管理器运行 Scorecard。提供包名称以对相应的 GitHub 源代码运行检查。
例如, --npm=angular
。
要仅运行特定检查,请添加--checks
参数和检查名称列表。
例如, --checks=CI-Tests,Code-Review
。
当前支持的格式是default
(text) 和json
。
这些可以用--format
标志指定。例如, --format=json
。
默认情况下,以下检查都是针对目标项目运行的:
姓名 | 描述 | 风险等级 | 需要令牌 | 亚搏体育appGitLab支持 | 笔记 |
---|---|---|---|---|---|
二进制工件 | 该项目是否没有签入的二进制文件? | 高的 | 帕特,GITHUB_TOKEN | 支持 | |
分支保护 | 该项目是否使用分支保护? | 高的 | PAT ( repo 或repo> public_repo ), GITHUB_TOKEN | 支持(见注释) | 某些设置仅受维护者 PAT 支持 |
CI 测试 | 该项目是否在 CI 中运行测试,例如 GitHub Actions、Prow? | 低的 | 帕特,GITHUB_TOKEN | 支持 | |
CII-最佳实践 | 该项目是否获得了 OpenSSF(以前称为 CII)最佳实践徽章(合格、银牌或金牌)? | 低的 | 帕特,GITHUB_TOKEN | 正在验证 | |
代码审查 | 项目实践代码合并前是否进行代码审查? | 高的 | 帕特,GITHUB_TOKEN | 正在验证 | |
贡献者 | 该项目是否有来自至少两个不同组织的贡献者? | 低的 | 帕特,GITHUB_TOKEN | 正在验证 | |
危险工作流程 | 该项目是否避免了 GitHub Action 工作流程中危险的编码模式? | 批判的 | 帕特,GITHUB_TOKEN | 不支持 | |
依赖关系更新工具 | 该项目是否使用工具来帮助更新其依赖项? | 高的 | 帕特,GITHUB_TOKEN | 不支持 | |
模糊测试 | 项目是否使用模糊测试工具,例如 OSS-Fuzz、QuickCheck 或 fast-check? | 中等的 | 帕特,GITHUB_TOKEN | 正在验证 | |
执照 | 该项目是否申报许可证? | 低的 | 帕特,GITHUB_TOKEN | 正在验证 | |
维护 | 该项目是否至少已运行 90 天并得到维护? | 高的 | 帕特,GITHUB_TOKEN | 正在验证 | |
固定依赖项 | 项目是否声明并固定依赖项? | 中等的 | 帕特,GITHUB_TOKEN | 正在验证 | |
包装 | 该项目是否从 CI/CD 构建和发布官方包,例如 GitHub Publishing ? | 中等的 | 帕特,GITHUB_TOKEN | 正在验证 | |
科学技术协会 | 该项目是否使用静态代码分析工具,例如 CodeQL、LGTM(已弃用)、SonarCloud? | 中等的 | 帕特,GITHUB_TOKEN | 不支持 | |
安全策略 | 该项目是否包含安全策略? | 中等的 | 帕特,GITHUB_TOKEN | 正在验证 | |
签名发布 | 该项目是否以加密方式签署版本? | 高的 | 帕特,GITHUB_TOKEN | 正在验证 | |
令牌权限 | 该项目是否将 GitHub 工作流令牌声明为只读? | 高的 | 帕特,GITHUB_TOKEN | 不支持 | |
漏洞 | 该项目是否存在未修复的漏洞?使用OSV服务。 | 高的 | 帕特,GITHUB_TOKEN | 正在验证 | |
网络钩子 | 存储库中定义的 Webhook 是否具有配置为验证请求来源的令牌? | 批判的 | 维护者 PAT ( admin: repo_hook 或admin> read:repo_hook doc | 实验性的 |
要查看有关每项检查、其评分标准和补救步骤的详细信息,请查看检查文档页面。
有关入门时应使用的检查指南,请参阅记分卡检查初学者指南。
登录网站或应用程序时,双因素身份验证 (2FA) 添加了额外的安全层。如果您的密码因需要第二种形式的身份验证(例如通过短信或身份验证应用程序发送代码,或触摸物理安全密钥)而受到泄露,2FA 可以保护您的帐户。
我们强烈建议您在任何可用的重要帐户上启用 2FA。 2FA 不是记分卡检查,因为 GitHub 和 GitLab 不会公开有关用户帐户的数据。可以说,这些数据应该始终保持私密性,因为没有 2FA 的帐户非常容易受到攻击。
尽管这不是官方检查,但我们敦促所有项目维护者启用 2FA,以保护他们的项目免受损害。
按照配置双因素身份验证中描述的步骤进行操作
如果可能,请使用:
最后一个选项是使用短信。请注意:使用 SMS 的 2FA 容易受到 SIM 交换攻击。
每个单独的检查都会返回 0 到 10 的分数,其中 10 代表可能的最佳分数。记分卡还产生一个总分,这是按风险加权的各个检查的基于权重的平均值。
请参阅当前记分卡检查列表,了解每项检查的风险级别。
如果您遇到看似错误的问题,请使用 GitHub 问题跟踪系统。在提交问题之前,请搜索现有问题以查看您的问题是否已被涵盖。
在贡献之前,请遵守我们的行为准则。
有关如何为项目做出贡献的指导,请参阅贡献文档。
如果您想添加支票,请参阅此处的指南。
如果您想加入记分卡社区或有想要讨论的想法,我们将在 OSSF 最佳实践工作组会议中讨论该项目。
人工制品 | 关联 |
---|---|
记分卡开发论坛 | ossf-记分卡-dev@ |
记分卡公告论坛 | ossf-记分卡-公告@ |
社区会议 VC | Zoom 会议链接 |
社区会议日历 | 适合亚太地区的双周周四下午 1:00-2:00 太平洋地区(OSSF 公共日历) 视频通话:LFX Zoom 欧洲、中东和非洲地区友好太平洋地区每 4 个周一上午 7:00-8:00(OSSF 公共日历) 视频通话:LFX Zoom |
会议记录 | 笔记 |
松弛通道 | #记分卡 |
维护者列在 CODEOWNERS 文件中。
要报告安全问题,请按照此处的说明进行操作。
适合亚太地区的双周周四下午 1:00-2:00 太平洋地区(OSSF 公共日历)
视频通话:LFX 变焦
欧洲、中东和非洲地区友好太平洋地区每 4 个周一上午 7:00-8:00(OSSF 公共日历)
视频通话:LFX 变焦
您可以在此处查看议程和会议记录。
请参阅常见问题解答,了解有关记分卡的常见问题解答。