
Trivy 스캐닝을 위한 GitLab CI 구성 요소
GitLab CI를 위한 Trivy 컴포넌트입니다. Trivy는 컨테이너 이미지, 파일시스템, 리포지토리, Kubernetes 클러스터, SBOM, 라이선스 규정 준수를 포괄하는 올인원 보안 스캐너입니다. 이 템플릿들을 파이프라인에 직접 연결하면 거의 셸 스크립팅 없이 반복 가능한 스캔, GitLab 네이티브 보고서 및 이식 가능한 아티팩트를 얻을 수 있습니다.
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/main@latest
stages:
- test
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/main@latest
inputs:
job_name: "security:remote"
TRIVY_SCAN_REMOTE_IMAGE: "registry.gitlab.com/group/app:latest"
severity: "CRITICAL,HIGH,MEDIUM"
exit_on_vulnerability: true
stages:
- test
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/main@latest
inputs:
job_name: "security:local"
TRIVY_SCAN_LOCAL_IMAGES: "dist/"
TRIVY_SCANNERS: "vuln,secret"
exit_on_vulnerability: false
stages:
- test
아래 각 템플릿은 컴포넌트 사양에 정의된 대로 사용 가능한 입력 및 기본값을 나열하고, 그 뒤에 최소 작업 예제를 제공합니다.
templates/main.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/main@latest
inputs:
job_name: "trivy:basic"
TRIVY_SCAN_REMOTE_IMAGE: "nginx:latest"
templates/target_container.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_container@latest
inputs:
job_name: "trivy:containers"
TRIVY_SCAN_REMOTE_IMAGE: "registry.gitlab.com/group/service:latest"
TRIVY_SCANNERS: "vuln,secret"
exit_on_vulnerability: true
templates/target_filesystem.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_filesystem@latest
inputs:
TRIVY_FS_PATH: "services/api"
TRIVY_SCANNERS: "vuln,misconfig,secret"
templates/target_rootfs.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_rootfs@latest
inputs:
TRIVY_ROOTFS_PATH: "/mnt/root"
TRIVY_SCANNERS: "vuln"
templates/target_repository.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_repository@latest
inputs:
TRIVY_REPO_TARGET: "https://github.com/aquasecurity/trivy"
TRIVY_REPO_BRANCH: "main"
templates/target_vm.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_vm@latest
inputs:
TRIVY_VM_TARGET: "ami-0123456789abcdef0"
TRIVY_AWS_REGION: "us-east-1"
templates/target_kubernetes.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_kubernetes@latest
inputs:
TRIVY_K8S_OBJECT: "namespace/prod"
TRIVY_K8S_REPORT: "summary"
templates/scanner_iac_config.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/scanner_iac_config@latest
inputs:
TRIVY_CONFIG_PATH: "examples/iac/terraform"
severity: "CRITICAL,HIGH,MEDIUM"
templates/scanner_license.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/scanner_license@latest
inputs:
TRIVY_SCAN_LOCAL_IMAGES: "test.tar"
TRIVY_LICENSE_FULL: true
templates/sbom_generate_image.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_generate_image@latest
inputs:
TRIVY_SBOM_INPUT: "test.tar"
TRIVY_SBOM_FILENAME: "ci-image-sbom.cdx.json"
templates/sbom_generate_repo.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_generate_repo@latest
inputs:
TRIVY_REPO_TARGET: "."
TRIVY_SBOM_FORMAT: "spdx-json"
templates/sbom_generate_kbom.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_generate_kbom@latest
inputs:
TRIVY_K8S_TARGET: "namespace/default"
scan_kbom: true
templates/sbom_scan_file.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_scan_file@latest
inputs:
TRIVY_SBOM_PATH: "artifacts/trivy/ci-image-sbom.cdx.json"
TRIVY_SCANNERS: "vuln,license"
templates/sbom_scan_rekor.yml예제
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_scan_rekor@latest
inputs:
TRIVY_SCAN_REMOTE_IMAGE: "registry.gitlab.com/group/app@sha256:..."
TRIVY_REKOR_URL: "https://rekor.sigstore.dev"
| 입력 | 설명 | 기본값 |
|---|
job_name | CI 작업 이름 | "trivy scanning" |
stage | 파이프라인 단계 | "test" |
image | Trivy를 실행하는 컨테이너 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_NEEDED_STAGE | Trivy 실행 전에 완료되어야 하는 단계 | "build" |
TRIVY_SCAN_REMOTE_IMAGE | 스캔할 원격 이미지 | "" |
TRIVY_SCAN_LOCAL_IMAGES | tar/OCI 입력 경로 (비어 있으면 . 검색) | "" |
TRIVY_SCANNERS | 쉼표로 구분된 스캐너 | "vuln,secret,misconfig" |
severity | 포함할 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 문제 발견 시 작업 실패 처리 | true |
TRIVY_EXTRA_ARGS | 추가 CLI 플래그 | "" |
allow_failure | 파이프라인 실패 없이 작업 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | CI 작업 이름 | "trivy:scan:containers" |
stage | 파이프라인 단계 | "test" |
image | Trivy 컨테이너 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SCAN_REMOTE_IMAGE | 원격 이미지 참조 | "" |
TRIVY_SCAN_LOCAL_IMAGES | 로컬 스캔을 위한 디렉터리/tar | "" |
TRIVY_SCANNERS | 활성화된 스캐너 | "vuln,secret,misconfig" |
TRIVY_IMAGE_SRC | 이미지 소스 백엔드 (remote/docker/...) | "" |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 심각도 일치 시 실패 | true |
TRIVY_IGNORE_UNFIXED | 수정 사항이 없는 문제 무시 | true |
TRIVY_PKG_TYPES | 패키지 유형 | "os,library" |
TRIVY_VULN_TYPE | pkg 유형의 사용 중단된 별칭 | "" |
TRIVY_TIMEOUT | 명령 시간 초과 | "10m" |
TRIVY_EXTRA_ARGS | 추가 CLI 인수 | "" |
TRIVY_DB_REPOSITORY | 사용자 정의 DB 미러 | "" |
TRIVY_JAVA_DB_REPOSITORY | 사용자 정의 Java DB 미러 | "" |
TRIVY_SKIP_FILES | 파일 글로브 제외 패턴 | "" |
TRIVY_SKIP_DIRS | 디렉터리 제외 패턴 | "" |
allow_failure | 파이프라인 실패 없이 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | CI 작업 이름 | "trivy:scan:filesystem" |
stage | 파이프라인 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_FS_PATH | 스캔할 파일 또는 디렉터리 | "." |
TRIVY_SCANNERS | 활성화된 스캐너 | "vuln,secret" |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 심각도 일치 시 실패 | true |
TRIVY_IGNORE_UNFIXED | 수정되지 않은 문제 무시 | true |
TRIVY_PKG_TYPES | 패키지 유형 | "os,library" |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
TRIVY_SKIP_FILES | 건너뛸 파일 글로브 | "" |
TRIVY_SKIP_DIRS | 건너뛸 디렉터리 | "" |
TRIVY_EXTRA_ARGS | 추가 CLI 인수 | "" |
TRIVY_REPORT_BASENAME | 아티팩트 기본 이름 | "filesystem-scan" |
allow_failure | 작업 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:scan:rootfs" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_ROOTFS_PATH | 루트 파일시스템 경로 | "/" |
TRIVY_SCANNERS | 스캐너 | "vuln,secret" |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 발견 시 작업 실패 | true |
TRIVY_IGNORE_UNFIXED | 수정되지 않은 문제 무시 | true |
TRIVY_PKG_TYPES | 패키지 유형 | "os,library" |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
TRIVY_SKIP_FILES | 건너뛸 파일 | "" |
TRIVY_SKIP_DIRS | 건너뛸 디렉터리 | "" |
TRIVY_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_REPORT_BASENAME | 아티팩트 기본 이름 | "rootfs-scan" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:scan:repo" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_REPO_TARGET | 로컬 경로 또는 Git URL | "." |
TRIVY_REPO_BRANCH | 원격 브랜치 | "" |
TRIVY_REPO_COMMIT | 커밋 해시 | "" |
TRIVY_REPO_TAG | 태그 이름 | "" |
TRIVY_SCANNERS | 스캐너 | "vuln,secret" |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 발견 시 작업 실패 | true |
TRIVY_IGNORE_UNFIXED | 수정되지 않은 문제 무시 | true |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
TRIVY_SKIP_FILES | 건너뛸 파일 | "" |
TRIVY_SKIP_DIRS | 건너뛸 디렉터리 | "" |
TRIVY_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_REPORT_BASENAME | 아티팩트 기본 이름 | "repo-scan" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:scan:vm" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_VM_TARGET | 로컬 경로 또는 ami:/ebs: 식별자 | "" |
TRIVY_AWS_REGION | AMI/EBS 스캔을 위한 AWS 리전 | "" |
TRIVY_SCANNERS | 스캐너 | "vuln" |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 발견 시 작업 실패 | true |
TRIVY_IGNORE_UNFIXED | 수정되지 않은 문제 무시 | true |
TRIVY_TIMEOUT | 시간 초과 | "20m" |
TRIVY_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_REPORT_BASENAME | 아티팩트 기본 이름 | "vm-scan" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:scan:k8s" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_K8S_OBJECT | 범위 (cluster, namespace/foo 등) | "" |
TRIVY_K8S_REPORT | 보고서 상세 수준 (summary/all) | "summary" |
TRIVY_K8S_KUBECONFIG | 사용자 정의 kubeconfig 경로 | "" |
TRIVY_K8S_INCLUDE_NAMESPACES | 포함할 네임스페이스 | "" |
TRIVY_K8S_EXCLUDE_NAMESPACES | 제외할 네임스페이스 | "" |
TRIVY_K8S_INCLUDE_KINDS | 포함할 종류 | "" |
TRIVY_K8S_EXCLUDE_KINDS | 제외할 종류 | "" |
TRIVY_K8S_SKIP_IMAGES | 워크로드 이미지 스캔 건너뛰기 | false |
TRIVY_K8S_DISABLE_NODE_COLLECTOR | 노드 수집기 비활성화 | false |
TRIVY_SCANNERS | 스캐너 | "vuln,misconfig,secret" |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 발견 시 작업 실패 | true |
TRIVY_IGNORE_UNFIXED | 수정되지 않은 문제 무시 | true |
TRIVY_TIMEOUT | 시간 초과 | "15m" |
TRIVY_K8S_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_REPORT_BASENAME | 아티팩트 기본 이름 | "k8s-scan" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:scan:iac" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_CONFIG_PATH | IaC 디렉터리 | "." |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 발견 시 실패 | true |
TRIVY_CONFIG_REPORT | 보고서 상세 수준 | "all" |
TRIVY_CONFIG_INCLUDE_NON_FAILURES | 통과도 포함 | false |
TRIVY_MISCONFIG_SCANNERS | 잘못된 구성 스캐너 목록 | "azure-arm,cloudformation,dockerfile,helm,kubernetes,terraform" |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
TRIVY_SKIP_FILES | 건너뛸 파일 | "" |
TRIVY_SKIP_DIRS | 건너뛸 디렉터리 | "" |
TRIVY_CONFIG_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_REPORT_BASENAME | 아티팩트 기본 이름 | "iac-scan" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:scan:license" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SCAN_REMOTE_IMAGE | 원격 이미지 참조 | "" |
TRIVY_SCAN_LOCAL_IMAGES | 로컬 tar/OCI 또는 파일시스템 경로 | "" |
TRIVY_SCANNERS | 스캐너 목록 | "license" |
severity | 심각도 | "CRITICAL" |
exit_on_vulnerability | 심각도 일치 시 실패 | true |
TRIVY_LICENSE_FULL | --license-full 활성화 | false |
TRIVY_LICENSE_CONFIDENCE | 신뢰도 임계값 | "0.9" |
TRIVY_LICENSE_IGNORED | 무시할 라이선스 | "" |
TRIVY_PKG_TYPES | 패키지 유형 | "os,library" |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
TRIVY_EXTRA_ARGS | 추가 인수 | "" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:sbom:image" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SBOM_IMAGE | 원격 이미지 참조 | "" |
TRIVY_SBOM_INPUT | 로컬 OCI/tar 입력 | "" |
TRIVY_SBOM_FORMAT | SBOM 형식 | "cyclonedx" |
TRIVY_SBOM_FILENAME | 출력 파일 이름 | "image-sbom.cdx.json" |
TRIVY_SBOM_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:sbom:repo" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_REPO_TARGET | 경로 또는 원격 Git URL | "." |
TRIVY_REPO_BRANCH | 브랜치 | "" |
TRIVY_REPO_COMMIT | 커밋 해시 | "" |
TRIVY_REPO_TAG | 태그 | "" |
TRIVY_SBOM_FORMAT | 형식 | "cyclonedx" |
TRIVY_SBOM_FILENAME | 출력 파일 이름 | "repo-sbom.cdx.json" |
TRIVY_REPO_SCANNERS | SBOM 생성 중 사용할 스캐너 | "vuln,secret" |
TRIVY_REPO_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:sbom:kbom" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_K8S_TARGET | trivy k8s 대상 (cluster, namespace/...) | "cluster" |
TRIVY_K8S_CONTEXT | Kubeconfig 컨텍스트 | "" |
TRIVY_K8S_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_SBOM_FILENAME | KBOM 파일 이름 | "kbom.cdx.json" |
TRIVY_TIMEOUT | 시간 초과 | "15m" |
scan_kbom | 생성된 KBOM에 취약점 스캔 실행 | true |
TRIVY_SBOM_SCANNERS | KBOM 스캔용 스캐너 | "vuln" |
severity | KBOM 스캔 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 발견 시 실패 | true |
TRIVY_SBOM_SCAN_EXTRA_ARGS | KBOM 스캔 추가 인수 | "" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:scan:sbom" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SBOM_PATH | SBOM 파일 경로 | "artifacts/trivy/image-sbom.cdx.json" |
TRIVY_SBOM_REPORT_BASENAME | 출력 기본 이름 | "sbom-scan" |
TRIVY_SCANNERS | 실행할 스캐너 | "vuln,license" |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 발견 시 실패 | true |
TRIVY_SBOM_SCAN_EXTRA_ARGS | 추가 인수 | "" |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
allow_failure | 실패 허용 | false |
| 입력 | 설명 | 기본값 |
|---|
job_name | 작업 이름 | "trivy:scan:rekor" |
stage | 단계 | "test" |
image | Trivy 이미지 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SCAN_REMOTE_IMAGE | 증명된 원격 이미지 | "" |
TRIVY_REKOR_URL | Rekor API 엔드포인트 | "" |
TRIVY_SCANNERS | 스캐너 | "vuln" |
severity | 심각도 | "CRITICAL,HIGH" |
exit_on_vulnerability | 발견 시 실패 | true |
TRIVY_IGNORE_UNFIXED | 수정되지 않은 문제 무시 | true |
TRIVY_TIMEOUT | 시간 초과 | "10m" |
TRIVY_EXTRA_ARGS | 추가 인수 | "" |
allow_failure | 실패 허용 | false |