docker scout cves 명령어를 사용하여 취약점 찾는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker scout cves 명령어를 효과적으로 사용하여 Docker 이미지 및 관련 아티팩트 내의 취약점을 식별하는 방법을 배우게 됩니다. 먼저 취약한 이미지를 가져와 Trivy 와 같은 보안 스캐너를 활용하여 잠재적인 문제를 찾는 방법을 시연하면서 Docker 이미지 내의 취약점을 직접 분석하는 것으로 시작합니다.

그 다음, docker save tarball 및 OCI 디렉토리에서 취약점을 분석하는 방법을 탐구하여 다양한 형식에서 docker scout cves 명령의 유연성을 보여줍니다. 마지막으로, 추가 처리를 위해 취약점 보고서를 SARIF JSON 파일로 내보내는 방법과 수정 노력을 우선시하기 위해 관련 EPSS 점수와 함께 취약점을 표시하는 방법을 배우게 됩니다.

Docker 이미지의 취약점 분석

이 단계에서는 Trivy 를 사용하여 Docker 이미지의 취약점을 분석하는 방법을 배우게 됩니다. Trivy 는 포괄적이고 다재다능한 보안 스캐너입니다. 운영 체제 패키지 (Alpine, RHEL, CentOS, Debian, Ubuntu 등) 및 애플리케이션 종속성 (Bundler, Composer, npm, yarn 등) 의 취약점을 감지할 수 있습니다. 또한 Trivy 는 컨테이너 이미지, 파일 시스템 및 Git 저장소와 같은 다양한 스캔 대상을 지원합니다.

먼저, 분석에 사용할 취약한 Docker 이미지를 가져와 보겠습니다. 일부 취약점이 있는 것으로 알려진 library/ubuntu:18.04 이미지를 사용합니다.

docker pull library/ubuntu:18.04

이미지가 가져와지고 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다.

18.04: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

이제 이미지가 있으므로 Trivy 를 설치해야 합니다. Trivy 는 LabEx 환경에 미리 설치되어 있지 않으므로 다운로드하여 설치합니다. 공식 GitHub 저장소에서 최신 릴리스를 다운로드합니다.

wget https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb

이 명령은 Trivy Debian 패키지를 다운로드합니다. 다음과 유사한 출력을 볼 수 있습니다.

--2023-10-27 08:00:00--  https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb
Resolving github.com (github.com)... 140.82.113.4
Connecting to github.com (github.com)|140.82.113.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/140000000/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=... [following]
--2023-10-27 08:00:00--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/140000000/...
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 50000000 (48M) [application/octet-stream]
Saving to: ‘trivy_0.50.1_Linux-64bit.deb’

trivy_0.50.1_Linux-64bit.deb 100%[=================================================>]  47.68M  --.-MB/s    in 0.5s

2023-10-27 08:00:01 (95.3 MB/s) - ‘trivy_0.50.1_Linux-64bit.deb’ saved [50000000/50000000]

이제 dpkg를 사용하여 다운로드한 패키지를 설치합니다.

sudo dpkg -i trivy_0.50.1_Linux-64bit.deb

설치 프로세스를 나타내는 출력을 볼 수 있습니다.

Selecting previously unselected package trivy.
(Reading database ... 100000 files and directories currently installed.)
Preparing to unpack trivy_0.50.1_Linux-64bit.deb ...
Unpacking trivy (0.50.1) ...
Setting up trivy (0.50.1) ...

Trivy 가 설치되었으므로 이제 library/ubuntu:18.04 Docker 이미지의 취약점을 스캔할 수 있습니다.

trivy image library/ubuntu:18.04

Trivy 가 이미지 스캔을 시작합니다. 취약점 데이터베이스를 다운로드하고 이미지 레이어를 분석하는 데 잠시 시간이 걸릴 수 있습니다. 진행 상황을 보여주는 출력을 볼 수 있으며, 그 다음에는 발견된 취약점에 대한 자세한 보고서가 표시됩니다.

2023-10-27T08:00:05.000+0000    INFO    Need to update DB
2023-10-27T08:00:05.000+0000    INFO    Downloading DB...
...
2023-10-27T08:00:10.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:00:10.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
library/ubuntu:18.04 (ubuntu 18.04)
===================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

출력은 심각도별 (UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL) 로 분류된 총 취약점에 대한 요약을 제공합니다. 그런 다음, 영향을 받는 패키지, 취약점 ID(예: CVE-YYYY-XXXX), 심각도 수준, 설치된 패키지 버전 및 사용 가능한 경우 수정된 버전과 같은 세부 정보와 함께 각 취약점을 나열합니다. 이 보고서는 Docker 이미지의 보안 상태를 이해하고 수정이 필요한 영역을 식별하는 데 도움이 됩니다.

docker save tarball 에서 취약점 분석

이 단계에서는 tarball 파일로 저장된 Docker 이미지에서 취약점을 분석하는 방법을 배우게 됩니다. 이는 Docker 레지스트리나 로컬 Docker 데몬에서 직접 사용할 수 없는 이미지를 스캔해야 하지만 이미지를 파일로 저장한 경우에 유용합니다.

먼저, 이전 단계에서 가져온 library/ubuntu:18.04 Docker 이미지를 tarball 파일로 저장해야 합니다. 이를 위해 docker save 명령을 사용할 수 있습니다.

docker save library/ubuntu:18.04 -o ubuntu_18.04.tar

이 명령은 library/ubuntu:18.04 이미지를 현재 디렉토리 (~/project) 의 ubuntu_18.04.tar라는 파일에 저장합니다. -o 플래그는 출력 파일을 지정합니다.

이미지 레이어가 저장되고 있음을 나타내는 출력을 볼 수 있습니다.

The image 'library/ubuntu:18.04' is being saved to a tar file.
...

이제 이미지를 tarball 로 저장했으므로 Trivy 를 사용하여 이 파일을 스캔할 수 있습니다. 다시 trivy image 명령을 사용하지만 이번에는 tarball 파일을 대상으로 지정합니다.

trivy image --input ubuntu_18.04.tar

--input 플래그는 Trivy 에게 레지스트리에서 가져오거나 이름으로 로컬 이미지를 스캔하는 대신 tarball 파일에서 이미지를 스캔하도록 지시합니다. Trivy 는 ubuntu_18.04.tar 파일에서 이미지 데이터를 읽고 로컬 이미지를 직접 스캔하는 것과 유사하게 취약점 분석을 수행합니다.

이전 단계와 마찬가지로 Trivy 가 tarball 에서 이미지를 로드한 다음 취약점 스캔 프로세스 및 보고서를 표시하는 출력을 볼 수 있습니다.

2023-10-27T08:05:00.000+0000    INFO    Loading image from ubuntu_18.04.tar...
2023-10-27T08:05:05.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:05:05.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
ubuntu_18.04.tar (ubuntu 18.04)
==============================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

이는 docker save로 생성된 tarball 을 스캔하여 Docker 데몬에 로드되지 않은 경우에도 Trivy 가 Docker 이미지를 분석할 수 있음을 보여줍니다. 이는 이미지가 파일로 전송되는 워크플로우에 취약점 스캔을 통합하는 유연한 방법입니다.

OCI 디렉토리에서 취약점 분석

이 단계에서는 OCI(Open Container Initiative) 레이아웃 형식으로 저장된 이미지에서 취약점을 분석하는 방법을 살펴봅니다. OCI 이미지 형식 사양은 컨테이너 이미지를 패키징하기 위한 표준을 정의합니다. Skopeo 및 Buildah 와 같은 도구를 사용하여 이 형식의 이미지를 생성하고 관리할 수 있습니다. Trivy 는 OCI 디렉토리에 저장된 이미지를 직접 스캔할 수 있습니다.

먼저, library/ubuntu:18.04 Docker 이미지에서 OCI 디렉토리를 생성해야 합니다. 이를 위해 skopeo 명령줄 유틸리티를 사용합니다. skopeo는 미리 설치되어 있지 않으므로 설치해야 합니다.

sudo apt update
sudo apt install -y skopeo

이렇게 하면 패키지 목록이 업데이트되고 skopeo가 설치됩니다. 설치 프로세스를 보여주는 출력을 볼 수 있습니다.

Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
...
Setting up skopeo (1.2.3-3) ...

이제 skopeo가 설치되었으므로 Docker 이미지를 OCI 디렉토리로 복사할 수 있습니다. ~/project 디렉토리에 ubuntu_oci라는 디렉토리를 생성하고 skopeo copy를 사용하여 이미지를 복사합니다.

mkdir ubuntu_oci
skopeo copy docker-daemon:library/ubuntu:18.04 oci:ubuntu_oci:18.04

skopeo copy 명령은 서로 다른 저장 위치와 형식 간에 이미지를 전송하는 데 사용됩니다.

  • docker-daemon:library/ubuntu:18.04는 소스 이미지, 즉 로컬 Docker 데몬에 있는 library/ubuntu:18.04를 지정합니다.
  • oci:ubuntu_oci:18.04는 대상 형식 및 위치를 지정합니다. oci:는 OCI 형식을 나타내고, ubuntu_oci는 OCI 이미지가 저장될 디렉토리이며, 18.04는 해당 OCI 디렉토리 내의 이미지에 대한 태그입니다.

복사 프로세스를 나타내는 출력을 볼 수 있습니다.

Getting image source signatures
Copying blob sha256:...
...
Copying config sha256:...
Writing manifest to image destination
Storing signatures

이제 OCI 이미지 데이터를 포함하는 ubuntu_oci라는 디렉토리가 있어야 합니다. 이 디렉토리의 내용을 나열하여 OCI 레이아웃 파일을 볼 수 있습니다.

ls ubuntu_oci

oci-layout, index.jsonblobs와 같은 파일과 디렉토리를 볼 수 있습니다.

blobs  index.json  oci-layout

마지막으로, Trivy 를 사용하여 이 OCI 디렉토리에서 취약점을 스캔할 수 있습니다. trivy image 명령을 사용하고 OCI 디렉토리 경로를 지정합니다.

trivy image oci:ubuntu_oci:18.04

Trivy 는 oci: 접두사를 인식하고 ubuntu_oci 디렉토리에 있는 18.04 태그가 있는 이미지를 스캔합니다. Docker 이미지를 직접 스캔하는 것과 유사하게 이미지 레이어를 분석하고 발견된 취약점을 보고합니다.

Trivy 가 OCI 이미지를 스캔한 다음 취약점 보고서를 표시하는 출력을 볼 수 있습니다.

2023-10-27T08:10:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:10:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
oci:ubuntu_oci:18.04 (ubuntu 18.04)
==================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

이는 Trivy 가 OCI 형식으로 저장된 이미지를 스캔할 수 있음을 보여주며, 컨테이너 이미지를 관리하고 스캔하는 방법에 대한 유연성을 제공합니다.

취약점 보고서를 SARIF JSON 파일로 내보내기

이 단계에서는 Trivy 에서 생성된 취약점 보고서를 SARIF JSON 파일로 내보내는 방법을 배우게 됩니다. SARIF(Static Analysis Results Interchange Format) 는 정적 분석 도구의 출력을 위한 표준 형식입니다. SARIF 형식으로 보고서를 내보내면 CI/CD 파이프라인 또는 보안 대시보드와 같은 다른 도구 및 워크플로우에 취약점 스캔 결과를 더 쉽게 통합할 수 있습니다.

다시 library/ubuntu:18.04 Docker 이미지를 스캔하지만 이번에는 Trivy 의 형식 옵션을 사용하여 결과를 SARIF 형식으로 출력하고 파일에 저장합니다.

trivy image --format sarif --output report.sarif library/ubuntu:18.04

이 명령을 자세히 살펴보겠습니다.

  • trivy image library/ubuntu:18.04: 이는 지정된 Docker 이미지를 스캔하는 표준 명령입니다.
  • --format sarif: 이 플래그는 Trivy 에게 출력을 SARIF JSON 으로 형식화하도록 지시합니다.
  • --output report.sarif: 이 플래그는 출력을 현재 디렉토리 (~/project) 의 report.sarif라는 파일로 리디렉션합니다.

Trivy 는 스캔을 수행하고 결과를 지정된 파일에 저장합니다. 콘솔에는 진행 정보만 표시되고 자세한 보고서는 표시되지 않습니다.

2023-10-27T08:15:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:15:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...

명령이 완료되면 ~/project 디렉토리에 report.sarif라는 파일이 있어야 합니다. ls 명령을 사용하여 해당 파일의 존재를 확인할 수 있습니다.

ls report.sarif

파일이 생성되었음을 확인하는 파일 이름이 출력되는 것을 볼 수 있습니다.

report.sarif

cat 또는 less와 같은 명령줄 도구를 사용하여 SARIF 파일의 내용을 볼 수도 있습니다. 내용은 SARIF 사양에 따라 JSON 형식입니다.

cat report.sarif

발견된 취약점 수에 따라 상당히 길 수 있는 JSON 출력을 볼 수 있습니다.

{
  "version": "2.1.0",
  "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Trivy",
          "version": "0.50.1",
          ...
        }
      },
      "results": [
        {
          "ruleId": "CVE-YYYY-XXXX",
          "level": "error",
          "message": {
            "text": "apt: CVE-YYYY-XXXX (HIGH)"
          },
          ...
        },
        ...
      ]
    }
  ]
}

SARIF 형식으로 보고서를 내보내는 것은 자동화된 보안 워크플로우에 취약점 스캔을 통합하고 SARIF 표준을 이해하는 도구를 활용하는 강력한 방법입니다.

EPSS 점수를 포함한 취약점 표시

이 단계에서는 Trivy 를 사용하여 취약점과 해당 EPSS(Exploit Prediction Scoring System) 점수를 함께 표시하는 방법을 배우게 됩니다. EPSS 는 실제 환경에서 취약점이 악용될 가능성을 추정하기 위한 데이터 기반 노력입니다. 취약점 보고서에 EPSS 점수를 포함하면 적극적으로 악용될 가능성이 더 높은 취약점에 집중하여 해결 노력을 우선순위화하는 데 도움이 될 수 있습니다.

Trivy 는 사용 가능한 경우 취약점에 대한 EPSS 점수를 가져와 표시할 수 있습니다. 이렇게 하려면 --vuln-type os,library 플래그를 사용하여 운영 체제 및 라이브러리 취약점을 모두 스캔하도록 해야 하며, Trivy 는 특정 CVE 에 대한 데이터가 있는 경우 자동으로 출력에 EPSS 점수를 포함합니다.

library/ubuntu:18.04 Docker 이미지를 다시 스캔해 보겠습니다. 이번에는 OS 및 라이브러리 취약점 유형을 명시적으로 요청합니다.

trivy image --vuln-type os,library library/ubuntu:18.04

--vuln-type os,library 플래그는 스캔할 취약점 유형을 지정합니다. 기본적으로 Trivy 는 이러한 유형을 자주 스캔하지만 플래그를 명시적으로 포함하면 보장됩니다. Trivy 가 EPSS 데이터가 있는 취약점 (CVE ID 로 식별됨) 을 발견하면 보고서에 EPSS 점수를 포함합니다.

Trivy 는 이전과 마찬가지로 스캔을 수행합니다. 출력은 초기 스캔과 유사하지만 일부 취약점에 대한 EPSS 점수에 대한 추가 열이 표시됩니다.

2023-10-27T08:20:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:20:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
library/ubuntu:18.04 (ubuntu 18.04)
===================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┬───────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │ EPSS  │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┼───────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │ 0.95  │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │ ...   │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┴───────┘

출력 테이블에서 새로운 EPSS 열을 확인하십시오. 이 열의 값은 해당 취약점에 대한 EPSS 점수를 나타내며 0 에서 1 까지의 범위를 갖습니다. EPSS 점수가 높을수록 다음 30 일 이내에 취약점이 악용될 가능성이 더 높습니다. 이 정보는 EPSS 점수가 높은 취약점에 집중하여 먼저 해결할 취약점의 우선순위를 지정하는 데 유용합니다.

취약점 분석에 EPSS 점수를 포함하면 심각도 수준을 넘어 위험 및 해결에 대한 더 많은 정보를 바탕으로 의사 결정을 내릴 수 있습니다.

요약

이 랩에서는 다재다능한 보안 스캐너인 Trivy 를 사용하여 Docker 이미지의 취약점을 분석하는 방법을 배웠습니다. 취약한 Ubuntu 이미지를 가져와 Trivy 를 설치하여 분석을 수행했습니다. 이 초기 단계에서는 라이브 Docker 이미지에서 보안 취약점을 스캔하는 기본적인 프로세스에 중점을 두었습니다.