███████╗ ██████╗ █████╗ ███╗ ██╗
██╔════╝██╔════╝██╔══██╗████╗ ██║
███████╗██║ ███████║██╔██╗ ██║
╚════██║██║ ██╔══██║██║╚██╗██║
███████║╚██████╗██║ ██║██║ ╚████║
╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═══╝
Scan 是一款面向现代 DevOps 团队的免费开源安全工具。基于集成多扫描器的设计,Scan 可以在一轮快速扫描中检测应用程序和基础设施代码中的各种安全缺陷,无需任何远程服务器。Scan 专为工作流集成而生,具备自动构建阻断、结果基线对比和 PR 总结评论等便捷功能。Scan 产品采用 Apache-2.0 许可证开源。
| 编程语言 | 工具 |
|---|---|
| ansible | ansible-lint |
| apex | pmd |
| arm | checkov |
| aws | checkov |
| bash | shellcheck |
| bom | cdxgen |
| credscan | gitleaks |
| depscan | dep-scan |
| dockerfile | checkov |
| go | gosec, staticcheck |
| groovy | find-sec-bugs |
| java | cdxgen, gradle, find-sec-bugs, pmd |
| jsp | pmd, find-sec-bugs |
| json | jq, jsondiff, jsonschema |
| kotlin | detekt, find-sec-bugs |
| scala | find-sec-bugs |
| kubernetes | checkov, kubesec, kube-score |
| nodejs | cdxgen, yarn, rush |
| php | psalm, phpstan (仅 IDE) |
| plsql | pmd |
| python | cfg-scan (1), bandit, cdxgen |
| ruby | brakeman (2), dep-scan |
| rust | cdxgen |
| serverless | checkov |
| terraform | checkov, tfsec |
| Visual Force (vf) | pmd |
| Apache Velocity (vm) | pmd |
| yaml | yamllint |
| docker/container image | dep-scan |
-o reports/source-ruby-report.json 将报告导出为 json 格式。请访问官方文档站点了解 Scan 的配置和 CI/CD 集成选项。我们还有专门的 discord 频道 用于问题讨论和技术支持。
scan 非常适合在 CI 中使用,也可作为本地开发的预提交钩子。Scan 以容器镜像 shiftleft/scan 的形式分发,同时也为支持的 Linux 发行版提供了 AppImage。
简单的一行命令如下:
sh <(curl https://slscan.sh)
上述命令实际上调用了下面的 docker run 命令。
docker run --rm -e "WORKSPACE=${PWD}" -v $PWD:/app shiftleft/scan scan --build
在 Windows 上,命令根据终端略有不同。
cmd
docker run --rm -e "WORKSPACE=%cd%" -e "GITHUB_TOKEN=%GITHUB_TOKEN%" -v "%cd%:/app:cached" shiftleft/scan scan
PowerShell 和 PowerShell Core
docker run --rm -e "WORKSPACE=$(pwd)" -e "GITHUB_TOKEN=$env:GITHUB_TOKEN" -v "$(pwd):/app:cached" shiftleft/scan scan
WSL Bash
docker run --rm -e "WORKSPACE=${PWD}" -e "GITHUB_TOKEN=${GITHUB_TOKEN}" -v "$PWD:/app:cached" shiftleft/scan scan
git-bash
docker run --rm -e "WORKSPACE=${PWD}" -e "GITHUB_TOKEN=${GITHUB_TOKEN}" -v "/$PWD:/app:cached" shiftleft/scan scan
在 git-bash 中,不要忘记在 $PWD 前加斜杠 (/)!
扫描多个项目
docker run --rm -e "WORKSPACE=${PWD}" -v $PWD:/app shiftleft/scan scan --src /app --type credscan,nodejs,python,yaml --out_dir /app/reports
扫描 Java 项目
对于基于 Java 和 JVM 语言的项目,在开发及 CI 工作流中调用 sast-scan 之前,务必先编译项目。
docker run --rm -e "WORKSPACE=${PWD}" -v ~/.m2:/.m2 -v <source path>:/app shiftleft/scan scan --src /app --type java
# 对于 gradle 项目
docker run --rm -e "WORKSPACE=${PWD}" -v ~/.gradle:/.gradle -v <source path>:/app shiftleft/scan scan --src /app --type java
自动项目检测
可以省略 --type 以启用自动检测。如果项目包含多种类型,可以传入逗号分隔的值。
现在可以使用 slscan 扫描容器镜像。推荐的方法是先使用 docker 或 podman save 命令导出容器镜像,然后使用 .tar 文件调用 scan。
docker pull shiftleft/scan-slim:latest
docker save -o scanslim.tar shiftleft/scan-slim:latest
# podman save --format oci-archive -o scanslim.tar shiftleft/scan-slim:latest
docker run --rm -e "WORKSPACE=${PWD}" -v $PWD:/app shiftleft/scan scan --src /app/scanslim.tar -o /app/reports --type docker
或者,也可以让 scan 在分析前自行拉取容器镜像。但这需要暴露你的 docker 或 podman 守护进程套接字,因此不推荐。如果你喜欢冒险,可以尝试通过向 docker run 命令传递以下参数:
-e "DOCKER_HOST=unix:/var/run/docker.sock:" -v "/var/run/docker.sock:/var/run/docker.sock"
示例:扫描容器镜像 shiftleft/scan-slim:
docker run --rm -e "WORKSPACE=$(pwd)" -e "DOCKER_HOST=unix:/var/run/docker.sock:" \
-v "/var/run/docker.sock:/var/run/docker.sock" \
-v "$(pwd):/app" shiftleft/scan scan -t docker -i shiftleft/scan-slim
示例:扫描容器镜像 redmine@sha256:a5c5f8a64a0d9a436a0a6941bc3fb156be0c89996add834fe33b66ebeed2439e:
docker run --rm -e "WORKSPACE=$(pwd)" -e "DOCKER_HOST=unix:/var/run/docker.sock:" \
-v "/var/run/docker.sock:/var/run/docker.sock" \
-v "$(pwd):/app" shiftleft/scan scan -t docker -i redmine@sha256:a5c5f8a64a0d9a436a0a6941bc3fb156be0c89996add834fe33b66ebeed2439e
使用 podman 的同样示例
podman run --rm -e "WORKSPACE=$(pwd)" -e "DOCKER_HOST=unix:/run/user/1000/podman/podman.sock:" \
-v "/run/user/1000:/run/user/1000" \
-v "$(pwd):/app" shiftleft/scan scan -t docker -i redmine@sha256:a5c5f8a64a0d9a436a0a6941bc3fb156be0c89996add834fe33b66ebeed2439e
报告将生成在 --out_dir 指定的目录中。在上面的示例中,该目录为 reports,它将是源代码根目录下的一个子目录。
一些报告会转换为名为 SARIF 的标准格式。此类报告以 .sarif 扩展名结尾。打开和查看 sarif 文件需要查看器,例如:
许多 scan 镜像已通过 CI 流水线镜像到 quay.io。只需在镜像名称前加上 quay.io/ 即可。以下是可用的镜像:
Scan 被许多组织和上千个开源项目使用。使用 Scan 的一些知名组织包括:
如果你希望将自己的组织名称列入此处,请向我们发送 PR。你也可以在社交媒体上使用标签 #slscan 来表示对 scan 的支持。