
Scan은 애플리케이션과 그 종속성에 대해 정적 분석 기반 보안 테스트를 수행하는 무료 및 오픈 소스 DevSecOps 도구입니다. CI 및 Git에 친숙합니다.
███████╗ ██████╗ █████╗ ███╗ ██╗
██╔════╝██╔════╝██╔══██╗████╗ ██║
███████╗██║ ███████║██╔██╗ ██║
╚════██║██║ ██╔══██║██║╚██╗██║
███████║╚██████╗██║ ██║██║ ╚████║
╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═══╝
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 통합 옵션에 대한 자세한 내용은 공식 문서 사이트를 방문하십시오. 또한 이슈 및 지원을 위한 전용 디스코드 채널이 있습니다.
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 및 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 언어 기반 프로젝트의 경우 dev 및 CI 워크플로우에서 sast-scan을 호출하기 전에 프로젝트를 컴파일하는 것이 중요합니다.
docker run --rm -e "WORKSPACE=${PWD}" -v ~/.m2:/.m2 -v <소스 경로>:/app shiftleft/scan scan --src /app --type java
# gradle 프로젝트의 경우
docker run --rm -e "WORKSPACE=${PWD}" -v ~/.gradle:/.gradle -v <소스 경로>:/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에 대한 지지를 표시할 수 있습니다.