2020-10-26 23:22:13 +03:00
# Security Scorecards
2021-01-11 21:14:06 +03:00
2021-01-07 22:40:55 +03:00
![build ](https://github.com/ossf/scorecard/workflows/build/badge.svg?branch=main )
![CodeQL ](https://github.com/ossf/scorecard/workflows/CodeQL/badge.svg?branch=main )
2020-10-09 17:47:59 +03:00
2020-11-06 20:36:23 +03:00
< img align = "right" src = "artwork/openssf_security.png" width = "200" height = "400" >
2021-02-23 18:27:36 +03:00
<!-- vim - markdown - toc GFM -->
2021-07-16 20:18:42 +03:00
* [Motivation ](#motivation )
* [Goals ](#goals )
* [Scorecard Checks ](#scorecard-checks )
* [Usage ](#usage )
* [Docker ](#docker )
* [Using repository URL ](#using-repository-url )
* [Using a Package manager ](#using-a-package-manager )
* [Running specific checks ](#running-specific-checks )
* [Authentication ](#authentication )
* [Understanding Scorecard results ](#understanding-scorecard-results )
* [Formatting Results ](#formatting-results )
* [Public Data ](#public-data )
* [Adding a Scorecard Check ](#adding-a-scorecard-check )
* [Troubleshooting ](#troubleshooting )
* [Supportability ](#supportability )
* [Contributing ](#contributing )
2021-02-23 18:27:36 +03:00
<!-- vim - markdown - toc -->
2021-06-17 07:05:46 +03:00
2020-10-16 18:08:43 +03:00
## Motivation
2020-10-09 21:28:31 +03:00
2021-06-17 07:05:46 +03:00
A short motivational video clip to inspire us: https://youtu.be/rDMMYT3vkTk "You
passed! All D's ... and an A!"
2020-10-09 20:39:00 +03:00
2020-10-16 18:08:43 +03:00
## Goals
2021-01-05 03:47:02 +03:00
2021-06-17 07:05:46 +03:00
1. Automate analysis and trust decisions on the security posture of open source
projects.
2020-10-09 20:39:00 +03:00
2021-06-17 07:05:46 +03:00
1. Use this data to proactively improve the security posture of the critical
projects the world depends on.
2020-11-12 21:26:38 +03:00
2021-06-17 07:05:46 +03:00
## Scorecard Checks
2020-11-12 21:26:38 +03:00
2021-06-17 07:05:46 +03:00
The following checks are all run against the target project by default:
2020-11-12 21:26:38 +03:00
2021-06-17 07:05:46 +03:00
Name | Description
------------------ | -----------
2021-06-29 22:02:12 +03:00
Active | Did the project get any commits in the last 90 days?
Automatic-Dependency-Update | Does the project use tools to automatically update its dependencies?
Binary-Artifacts | Is the project free of checked-in binaries?
Branch-Protection | Does the project use [Branch Protection ](https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/about-protected-branches ) ?
2021-06-17 07:05:46 +03:00
CI-Tests | Does the project run tests in CI, e.g. [GitHub Actions ](https://docs.github.com/en/free-pro-team@latest/actions ), [Prow ](https://github.com/kubernetes/test-infra/tree/master/prow )?
CII-Best-Practices | Does the project have a [CII Best Practices Badge ](https://bestpractices.coreinfrastructure.org/en )?
2021-06-29 22:02:12 +03:00
Code-Review | Does the project require code review before code is merged?
Contributors | Does the project have contributors from at least two different organizations?
2021-06-17 07:05:46 +03:00
Fuzzing | Does the project use fuzzing tools, e.g. [OSS-Fuzz ](https://github.com/google/oss-fuzz )?
2021-06-29 22:02:12 +03:00
Frozen-Deps | Does the project declare and freeze [dependencies ](https://docs.github.com/en/free-pro-team@latest/github/visualizing-repository-data-with-graphs/about-the-dependency-graph#supported-package-ecosystems )?
2021-06-17 07:05:46 +03:00
Packaging | Does the project build and publish official packages from CI/CD, e.g. [GitHub Publishing ](https://docs.github.com/en/free-pro-team@latest/actions/guides/about-packaging-with-github-actions#workflows-for-publishing-packages ) ?
2021-06-29 22:02:12 +03:00
Pull-Requests | Does the project use [Pull Requests ](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/about-pull-requests ) for all code changes?
SAST | Does the project use static code analysis tools, e.g. [CodeQL ](https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/enabling-code-scanning-for-a-repository#enabling-code-scanning-using-actions ), [SonarCloud ](https://sonarcloud.io )?
Security-Policy | Does the project contain a [security policy ](https://docs.github.com/en/free-pro-team@latest/github/managing-security-vulnerabilities/adding-a-security-policy-to-your-repository )?
Signed-Releases | Does the project cryptographically [sign releases ](https://wiki.debian.org/Creating%20signed%20GitHub%20releases )?
Signed-Tags | Does the project cryptographically sign release tags?
Token-Permissions | Does the project declare GitHub workflow tokens as [read only ](https://docs.github.com/en/actions/reference/authentication-in-a-workflow )?
2021-06-29 06:09:40 +03:00
Vulnerabilities | Does the project have unfixed vulnerabilities? Uses the [OSV service ](https://osv.dev ).
2020-11-12 21:26:38 +03:00
2021-06-29 22:02:12 +03:00
2021-06-17 07:05:46 +03:00
To see detailed information about each check and remediation steps, check out
the [checks documentation page ](checks/checks.md ).
2020-11-12 21:26:38 +03:00
2020-10-09 17:47:59 +03:00
## Usage
2021-07-16 20:18:42 +03:00
### Docker
`scorecard` is available as a Docker container:
The `GITHUB_AUTH_TOKEN` has to be set to a valid [token ](#Authentication )
``` shell
docker run -e GITHUB_AUTH_TOKEN=token gcr.io/openssf/scorecard:latest --show-details --repo=https://github.com/ossf/scorecard
```
2021-06-17 07:05:46 +03:00
### Using repository URL
The program can run using just one argument, the URL of the repo:
2020-10-09 17:47:59 +03:00
```shell
2021-07-16 20:18:42 +03:00
$ go get github.com/ossf/scorecard
$ scorecard --repo=github.com/kubernetes/kubernetes
2021-06-29 22:02:12 +03:00
Starting [Signed-Tags]
Starting [Automatic-Dependency-Update]
2020-10-16 17:54:29 +03:00
Starting [Frozen-Deps]
Starting [Fuzzing]
2020-10-16 21:22:28 +03:00
Starting [Pull-Requests]
2021-06-29 22:02:12 +03:00
Starting [Branch-Protection]
Starting [Code-Review]
2020-10-19 19:58:51 +03:00
Starting [SAST]
2021-06-29 22:02:12 +03:00
Starting [Contributors]
2020-10-17 09:48:25 +03:00
Starting [Signed-Releases]
2021-06-29 22:02:12 +03:00
Starting [Packaging]
Starting [Token-Permissions]
Starting [Security-Policy]
Starting [Active]
Starting [Binary-Artifacts]
Starting [CI-Tests]
Starting [CII-Best-Practices]
Finished [Contributors]
Finished [Signed-Releases]
Finished [Active]
Finished [Binary-Artifacts]
Finished [CI-Tests]
2020-10-19 18:09:10 +03:00
Finished [CII-Best-Practices]
2021-01-15 19:29:07 +03:00
Finished [Packaging]
2021-06-29 22:02:12 +03:00
Finished [Token-Permissions]
2021-01-15 19:29:07 +03:00
Finished [Security-Policy]
2021-06-29 22:02:12 +03:00
Finished [Automatic-Dependency-Update]
2021-01-15 19:29:07 +03:00
Finished [Frozen-Deps]
2021-06-29 22:02:12 +03:00
Finished [Fuzzing]
2021-01-15 19:29:07 +03:00
Finished [Pull-Requests]
2021-06-29 22:02:12 +03:00
Finished [Signed-Tags]
Finished [Branch-Protection]
2021-01-15 19:29:07 +03:00
Finished [Code-Review]
2021-06-29 22:02:12 +03:00
Finished [SAST]
2020-10-09 18:26:43 +03:00
RESULTS
-------
2021-06-29 22:02:12 +03:00
Repo: github.com/kubernetes/kubernetes
2020-10-19 18:09:10 +03:00
Active: Pass 10
2021-06-29 22:02:12 +03:00
Automatic-Dependency-Update: Fail 3
Binary-Artifacts: Pass 10
Branch-Protection: Fail 0
2020-10-19 18:09:10 +03:00
CI-Tests: Pass 10
CII-Best-Practices: Pass 10
Code-Review: Pass 10
Contributors: Pass 10
2021-06-29 22:02:12 +03:00
Frozen-Deps: Fail 10
2020-10-19 18:09:10 +03:00
Fuzzing: Pass 10
2021-01-15 19:29:07 +03:00
Packaging: Fail 0
2020-10-19 18:09:10 +03:00
Pull-Requests: Pass 10
2021-01-15 19:29:07 +03:00
SAST: Fail 10
2021-06-29 22:02:12 +03:00
Security-Policy: Fail 5
2020-10-19 18:09:10 +03:00
Signed-Releases: Fail 10
2021-01-15 19:29:07 +03:00
Signed-Tags: Fail 10
2021-06-29 22:02:12 +03:00
Token-Permissions: Pass 10
```
For more details why a check fails, use the `--show-details` option:
```
./scorecard --repo=github.com/kubernetes/kubernetes --checks Frozen-Deps --show-details
Starting [Frozen-Deps]
Finished [Frozen-Deps]
RESULTS
-------
Repo: github.com/kubernetes/kubernetes
Frozen-Deps: Fail 10
...
!! frozen-deps/docker - cluster/addons/fluentd-elasticsearch/es-image/Dockerfile has non-pinned dependency 'golang:1.16.5'
...
!! frozen-deps/fetch-execute - cluster/gce/util.sh is fetching and executing non-pinned program 'curl https://sdk.cloud.google.com | bash'
...
!! frozen-deps/fetch-execute - hack/jenkins/benchmark-dockerized.sh is fetching an non-pinned dependency 'GO111MODULE=on go install github.com/cespare/prettybench'
...
2020-10-09 17:47:59 +03:00
```
2021-06-17 07:05:46 +03:00
### Using a Package manager
2021-02-02 19:29:31 +03:00
2021-03-01 19:21:20 +03:00
scorecard has an option to provide either `--npm` / `--pypi` / `--rubygems`
package name and it would run the checks on the corresponding GitHub source
code.
For example:
2021-02-02 19:29:31 +03:00
2021-06-17 07:05:46 +03:00
```shell
2021-02-02 19:29:31 +03:00
./scorecard --npm=angular
Starting [Active]
Starting [Branch-Protection]
Starting [CI-Tests]
Starting [CII-Best-Practices]
Starting [Code-Review]
Starting [Contributors]
Starting [Frozen-Deps]
Starting [Fuzzing]
Starting [Packaging]
Starting [Pull-Requests]
Starting [SAST]
Starting [Security-Policy]
Starting [Signed-Releases]
Starting [Signed-Tags]
Finished [Signed-Releases]
Finished [Fuzzing]
Finished [CII-Best-Practices]
Finished [Security-Policy]
Finished [CI-Tests]
Finished [Packaging]
Finished [SAST]
Finished [Code-Review]
Finished [Branch-Protection]
Finished [Frozen-Deps]
Finished [Signed-Tags]
Finished [Active]
Finished [Pull-Requests]
Finished [Contributors]
RESULTS
-------
Active: Fail 10
Branch-Protection: Fail 0
CI-Tests: Pass 10
CII-Best-Practices: Fail 10
Code-Review: Pass 10
Contributors: Pass 10
Frozen-Deps: Fail 0
Fuzzing: Fail 10
Packaging: Fail 0
Pull-Requests: Fail 9
SAST: Fail 10
Security-Policy: Pass 10
Signed-Releases: Fail 0
Signed-Tags: Fail 10
```
2021-06-17 07:05:46 +03:00
### Running specific checks
2021-03-13 01:57:44 +03:00
2021-06-17 07:05:46 +03:00
To use a particular check(s), add the `--checks` argument with a list of check
names.
2021-03-13 01:57:44 +03:00
2021-06-17 07:05:46 +03:00
For example, `--checks=CI-Tests,Code-Review` .
2021-02-22 20:18:28 +03:00
2020-11-13 20:06:46 +03:00
### Authentication
2021-06-17 07:05:46 +03:00
Before running Scorecard, you need to, either:
- [create a GitHub access token ](https://docs.github.com/en/free-pro-team@latest/developers/apps/about-apps#personal-access-tokens )
2021-07-19 21:56:42 +03:00
and set it in an environment variable called `GITHUB_AUTH_TOKEN` , `GITHUB_TOKEN` , `GH_AUTH_TOKEN` or `GH_TOKEN` . This helps to avoid
2021-06-17 07:05:46 +03:00
the GitHub's
[api rate limits ](https://developer.github.com/v3/#rate-limiting ) with
unauthenticated requests.
2020-10-09 17:47:59 +03:00
```shell
2020-11-13 05:14:59 +03:00
# For posix platforms, e.g. linux, mac:
2020-10-16 17:54:29 +03:00
export GITHUB_AUTH_TOKEN=< your access token >
2021-07-19 21:56:42 +03:00
# Multiple tokens can be provided separated by comma to be utilized
# in a round robin fashion.
export GITHUB_AUTH_TOKEN=< your access token1 > ,< your access token2 >
2020-11-13 05:14:59 +03:00
# For windows:
set GITHUB_AUTH_TOKEN=< your access token >
2021-07-19 21:56:42 +03:00
set GITHUB_AUTH_TOKEN=< your access token1 > ,< your access token2 >
2020-10-09 17:47:59 +03:00
```
2021-06-17 07:05:46 +03:00
- create a GitHub App Installations for higher rate-limit quotas. If you have
an installed GitHub App and key file, you can use these three environment
variables, following the commands shown above for your platform.
2020-11-13 20:06:46 +03:00
```
GITHUB_APP_KEY_PATH=< path to the key file on disk >
GITHUB_APP_INSTALLATION_ID=< installation id >
GITHUB_APP_ID=< app id >
```
2021-06-17 07:05:46 +03:00
These can be obtained from the GitHub
[developer settings ](https://github.com/settings/apps ) page.
2020-10-09 17:47:59 +03:00
2021-06-17 07:05:46 +03:00
### Understanding Scorecard results
2020-10-09 17:47:59 +03:00
2021-06-17 07:05:46 +03:00
Each check returns a **Pass / Fail** decision, as well as a confidence score
between **0 and 10** . A confidence of 0 should indicate the check was unable to
achieve any real signal, and the result should be ignored. A confidence of 10
indicates the check is completely sure of the result.
2020-10-22 17:38:33 +03:00
2021-06-17 07:05:46 +03:00
### Formatting Results
2020-10-14 22:42:05 +03:00
2021-06-17 07:05:46 +03:00
There are three formats currently: `default` , `json` , and `csv` . Others may be
added in the future.
2020-10-09 17:47:59 +03:00
2021-06-17 07:05:46 +03:00
These may be specified with the `--format` flag.
2020-10-09 17:47:59 +03:00
2021-06-17 07:05:46 +03:00
## Public Data
2020-10-09 17:47:59 +03:00
2021-06-17 07:05:46 +03:00
If you're only interested in seeing a list of projects with their Scorecard
check results, we publish these results in a
[BigQuery public dataset ](https://cloud.google.com/bigquery/public-data ).
2020-11-10 05:29:37 +03:00
2021-06-17 07:05:46 +03:00
This data is available in the public BigQuery dataset
`openssf:scorecardcron.scorecard` . The latest results are available in the
BigQuery view `openssf:scorecardcron.scorecard_latest` .
2020-11-10 05:29:37 +03:00
2021-06-17 07:05:46 +03:00
You can extract the latest results to Google Cloud storage in JSON format using
the [`bq` ](https://cloud.google.com/bigquery/docs/bq-command-line-tool ) tool:
2020-11-10 05:29:37 +03:00
2021-06-17 07:05:46 +03:00
```
# Get the latest PARTITION_ID
bq query --nouse_legacy_sql 'SELECT partition_id FROM
openssf.scorecardcron.INFORMATION_SCHEMA.PARTITIONS ORDER BY partition_id DESC
LIMIT 1'
2020-11-10 05:29:37 +03:00
2021-06-17 07:05:46 +03:00
# Extract to GCS
bq extract --destination_format=NEWLINE_DELIMITED_JSON
'openssf:scorecardcron.scorecard$< partition_id > ' gs://bucket-name/filename.json
2020-11-10 05:29:37 +03:00
2021-06-17 07:05:46 +03:00
```
2020-11-10 05:29:37 +03:00
2021-06-17 07:05:46 +03:00
The list of projects that are checked is available in the
[`cron/data/projects.csv` ](https://github.com/ossf/scorecard/blob/main/cron/data/projects.csv )
file in this repository. If you would like us to track more, please feel free to
send a Pull Request with others.
2021-01-05 03:47:02 +03:00
2021-06-17 07:05:46 +03:00
**NOTE**: Currently, these lists are derived from **projects hosted on GitHub
ONLY**. We do plan to expand them in near future to account for projects hosted
on other source control systems.
## Adding a Scorecard Check
If you'd like to add a check, make sure it is something that meets the following
criteria and then create a new GitHub Issue:
- The scorecard must only be composed of automate-able, objective data. For
example, a project having 10 contributors doesn’ t necessarily mean it’ s more
secure than a project with say 50 contributors. But, having two maintainers
might be preferable to only having one - the larger bus factor and ability
to provide code reviews is objectively better.
- The scorecard criteria can be as specific as possible and not limited
general recommendations. For example, for Go, we can recommend/require
specific linters and analyzers to be run on the codebase.
- The scorecard can be populated for any open source project without any work
or interaction from maintainers.
- Maintainers must be provided with a mechanism to correct any automated
scorecard findings they feel were made in error, provide "hints" for
anything we can't detect automatically, and even dispute the applicability
of a given scorecard finding for that repository.
- Any criteria in the scorecard must be actionable. It should be possible,
with help, for any project to "check all the boxes".
- Any solution to compile a scorecard should be usable by the greater open
source community to monitor upstream security.
2020-11-05 23:27:10 +03:00
2021-06-05 00:47:45 +03:00
## Troubleshooting
2021-01-05 20:32:06 +03:00
2021-06-17 07:05:46 +03:00
- ### Bugs and Feature Requests:
If you have what looks like a bug, or you would like to make a feature
request, please use the
[Github issue tracking system. ](https://github.com/ossf/scorecard/issues )
Before you file an issue, please search existing issues to see if your issue
is already covered.
2021-06-05 00:47:45 +03:00
2021-06-17 07:05:46 +03:00
- ### Slack
2021-06-05 00:47:45 +03:00
2021-06-17 07:05:46 +03:00
For realtime discussion, you can join the
[#security_scorecards ](https://slack.openssf.org/#security_scorecards ) slack
channel. Slack requires registration, but the openssf team is open
invitation to anyone to register here. Feel free to come and ask any
questions.
2021-06-05 00:47:45 +03:00
## Supportability
2021-06-17 07:05:46 +03:00
Currently, scorecard officially supports OSX and Linux platforms. So, if you are
using a Windows OS you may find issues. Contributions towards supporting Windows
are welcome.
2021-01-05 16:45:15 +03:00
2020-11-05 23:27:10 +03:00
## Contributing
2021-06-17 07:05:46 +03:00
If you want to get involved or have ideas you'd like to chat about, we discuss
this project in the
[OSSF Best Practices Working Group ](https://github.com/ossf/wg-best-practices-os-developers )
meetings.
2021-06-05 00:47:45 +03:00
2021-06-17 07:05:46 +03:00
See the
[Community Calendar ](https://calendar.google.com/calendar?cid=czYzdm9lZmhwNWk5cGZsdGI1cTY3bmdwZXNAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ )
for the schedule and meeting invitations. The meetings happen biweekly
https://calendar.google.com/calendar/embed?src=s63voefhp5i9pfltb5q67ngpes%40group.calendar.google.com& ctz=America%2FLos_Angeles
2021-06-05 00:47:45 +03:00
2021-06-17 07:05:46 +03:00
See the [Contributing ](CONTRIBUTING.md ) documentation for guidance on how to
contribute.