
Scanは、アプリケーションとその依存関係に対して静的解析ベースのセキュリティテストを実行するための、無料かつオープンソースのDevSecOpsツールです。CIおよびGitに対応しています。
███████╗ ██████╗ █████╗ ███╗ ██╗
██╔════╝██╔════╝██╔══██╗████╗ ██║
███████╗██║ ███████║██╔██╗ ██║
╚════██║██║ ██╔══██║██║╚██╗██║
███████║╚██████╗██║ ██║██║ ╚████║
╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═══╝
Scan は、最新のDevOpsチーム向けの無料のオープンソースセキュリティツールです。統合されたマルチスキャナー設計により、Scanはアプリケーションやインフラストラクチャコードにおけるさまざまな種類のセキュリティ上の欠陥を、_リモートサーバー_を必要とせずに1回の高速スキャンで検出できます。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 only) |
| 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での使用や、ローカル開発のためのpre-commitフックとしても最適です。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 and 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
# For gradle project
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ファイルを開いて表示するには、以下のようなビューアが必要です:
多くのスキャンイメージはCIパイプラインを通じてquay.ioにミラーリングされています。イメージ名の前にquay.io/を付けるだけです。以下は利用可能なミラーです。
Scanは多くの組織や数千のオープンソースプロジェクトで使用されています。Scanを使用している注目すべき組織には以下のものがあります:
あなたの組織名をここに含めるためにPRを送ってください。また、ソーシャルメディアでハッシュタグ#slscanを使用してScanへのサポートを示すこともできます。