docker scout compare 명령을 사용하여 이미지 차이점 분석 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker scout compare 명령을 효과적으로 사용하여 두 Docker 이미지 간의 차이점을 분석하는 방법을 배우게 됩니다. 이 과정은 서로 다른 버전 또는 빌드 간의 취약점, 패키지 및 기타 이미지 구성 요소의 변경 사항을 이해하는 데 매우 중요합니다.

실습을 통해 기본 설정을 사용하여 이미지를 비교하고, 기본 이미지 취약점을 무시하고, 심각도 및 패키지 유형별로 결과를 필터링하고, 비교 결과의 마크다운 (markdown) 보고서를 생성하는 방법을 탐구할 것입니다. 이 랩을 마치면 docker scout compare를 사용하여 컨테이너 이미지 보안 및 구성에 대한 귀중한 통찰력을 얻는 데 능숙해질 것입니다.

기본 설정으로 두 이미지 비교

이 단계에서는 취약점 스캔 도구를 사용하여 두 Docker 이미지를 비교하는 방법을 배우게 됩니다. 이미지를 비교하는 것은 보안 위험을 식별하고 컨테이너 이미지의 서로 다른 버전 또는 빌드 간의 차이점을 이해하는 데 매우 중요합니다. 이 목적으로 trivy라는 도구를 사용합니다. trivy는 컨테이너 및 기타 아티팩트에 대한 간단하고 포괄적인 취약점 스캐너입니다.

먼저, trivy를 설치해 보겠습니다. trivy는 LabEx 환경에 미리 설치되어 있지 않으므로 다운로드하여 설치해야 합니다.

sudo apt-get update
sudo apt-get install -y wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) stable main" | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install -y trivy

위의 명령은 먼저 패키지 목록을 업데이트한 다음 새 저장소를 추가하는 데 필요한 종속성을 설치합니다. 그 후, trivy 저장소의 공개 키를 다운로드하여 시스템의 신뢰할 수 있는 키에 추가합니다. 마지막으로, trivy 저장소를 소스 목록에 추가하고, 패키지 목록을 다시 업데이트한 다음 trivy를 설치합니다.

이제 trivy가 설치되었으므로 비교하려는 Docker 이미지를 가져와 보겠습니다. ubuntu 이미지의 두 가지 다른 버전인 ubuntu:20.04ubuntu:22.04를 비교합니다.

docker pull ubuntu:20.04
docker pull ubuntu:22.04

이 명령은 Docker Hub 에서 지정된 ubuntu 이미지 버전을 가져옵니다. 이미지 다운로드 진행 상황과 이미지 가져오기가 성공했음을 나타내는 출력을 볼 수 있습니다.

이제 trivy를 사용하여 이 두 이미지를 비교할 수 있습니다. 두 이미지를 비교하는 기본 명령은 trivy image --diff-image [image1] [image2]입니다.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04

이 명령은 ubuntu:20.04ubuntu:22.04를 모두 분석하고 두 이미지 간에 발견된 취약점의 차이점을 보고합니다. 출력에는 한 이미지에는 있지만 다른 이미지에는 없는 취약점 또는 심각도가 다른 취약점이 표시됩니다. 이를 통해 이미지 버전을 업그레이드하거나 변경하는 것이 보안 상태에 어떤 영향을 미칠 수 있는지 이해하는 데 도움이 됩니다.

출력에는 심각도 (UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL) 별로 분류된 취약점이 나열됩니다. 첫 번째 이미지 (ubuntu:20.04의 경우) 에 비해 두 번째 이미지 (ubuntu:22.04의 경우) 에 추가된 취약점과 제거된 취약점을 보여줍니다.

이미지 비교 및 기본 이미지 취약점 무시

이전 단계에서는 두 개의 ubuntu 이미지를 비교하고 취약점의 차이점을 확인했습니다. 때로는 이미지를 비교할 때 기본 이미지에서 상속된 취약점보다는 애플리케이션 코드 또는 종속성으로 인해 발생하는 취약점에 관심이 있을 수 있습니다. trivy를 사용하면 지정된 기본 이미지에 있는 취약점을 무시할 수 있습니다.

이를 시연하기 위해 먼저 ubuntu:20.04를 기본 이미지로 사용하고 간단한 파일을 추가하는 간단한 Dockerfile 을 만들어 보겠습니다.

프로젝트 디렉토리로 이동합니다.

cd ~/project

nano를 사용하여 Dockerfile이라는 파일을 만듭니다.

nano Dockerfile

다음 내용을 Dockerfile에 붙여넣습니다.

FROM ubuntu:20.04
RUN echo "This is a test file" >/app/test.txt

파일을 저장하고 nano를 종료합니다 (Ctrl+X, Y, Enter).

이 Dockerfile 은 매우 간단합니다. ubuntu:20.04 이미지에서 시작하여 /app 디렉토리 내에 test.txt라는 파일을 만드는 명령을 실행합니다.

이제 이 Dockerfile 에서 Docker 이미지를 빌드해 보겠습니다. my-ubuntu-app:latest로 태그를 지정합니다.

docker build -t my-ubuntu-app:latest .

docker build 명령은 Dockerfile 에서 이미지를 빌드합니다. -t my-ubuntu-app:latest 플래그는 이미지에 my-ubuntu-app라는 이름과 latest 태그를 지정합니다. 마지막의 .은 Dockerfile 이 현재 디렉토리에 있음을 지정합니다. 빌드 프로세스와 이미지의 성공적인 생성을 나타내는 출력을 볼 수 있습니다.

이제 두 개의 이미지가 있습니다: ubuntu:20.04(기본 이미지) 와 my-ubuntu-app:latest(기본 이미지 위에 빌드된 이미지). my-ubuntu-app:latestubuntu:20.04와 비교하고 ubuntu:20.04에 이미 있는 취약점을 무시할 수 있습니다. 이렇게 하면 Dockerfile의 변경 사항으로 인해 발생한 취약점만 표시됩니다.

trivy image 명령과 함께 --ignore-base 플래그를 사용하여 이를 수행합니다.

trivy image --ignore-base --diff-image ubuntu:20.04 my-ubuntu-app:latest

이 명령은 my-ubuntu-app:latestubuntu:20.04와 비교하지만 my-ubuntu-app:latest에 있고 ubuntu:20.04에는 없는 취약점만 보고합니다. Dockerfile 이 간단한 파일만 추가하고 새 패키지를 설치하지 않았으므로 이전 단계의 출력에 비해 새로운 취약점이 거의 또는 전혀 보고되지 않아야 합니다. 이는 --ignore-base가 애플리케이션 계층의 보안 영향에 집중하는 데 어떻게 도움이 되는지 보여줍니다.

이미지 비교 및 심각도 및 패키지 유형별 필터링

이전 단계에서는 기본적인 이미지 비교를 수행했습니다. 그러나 특히 취약점이 많은 이미지의 경우 출력 결과가 때때로 매우 상세할 수 있습니다. trivy를 사용하면 심각도 수준 및 패키지 유형에 따라 결과를 필터링할 수 있으므로 가장 중요한 문제 또는 특정 유형의 취약점에 집중할 수 있습니다.

ubuntu:20.04ubuntu:22.04를 다시 비교해 보겠지만, 이번에는 결과를 필터링하여 HIGH 또는 CRITICAL 심각도의 취약점만 표시합니다. 이는 가장 심각한 취약점을 우선적으로 수정하려는 경우에 유용합니다.

보고할 최소 심각도 수준을 지정하려면 --severity 플래그를 사용합니다. 쉼표로 구분된 심각도 수준 목록을 제공할 수 있습니다.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --severity HIGH,CRITICAL

이 명령은 두 개의 ubuntu 이미지를 비교하고 두 이미지 중 하나에서 HIGH 또는 CRITICAL로 분류된 취약점만 표시합니다. 출력 결과가 기본 비교보다 훨씬 짧다는 것을 알 수 있는데, 이는 심각도 수준이 낮은 취약점 (UNKNOWN, LOW, MEDIUM) 을 제외하기 때문입니다.

심각도별 필터링 외에도 취약점이 발견된 패키지 유형별로 필터링할 수도 있습니다. trivy는 운영 체제 패키지 (예: apt, yum 등을 통해 설치된 패키지) 및 애플리케이션 종속성 (예: 코드에서 사용되는 라이브러리) 의 취약점을 스캔할 수 있습니다.

이미지를 다시 비교해 보겠지만, 이번에는 운영 체제 패키지의 취약점만 살펴보겠습니다. 이를 위해 --vuln-type 플래그를 사용합니다.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --vuln-type os

이 명령은 두 이미지를 비교하고 운영 체제 패키지에서 발견된 취약점만 보고합니다. 이는 이미지의 기본 운영 체제 계층의 보안에 주로 관심이 있는 경우에 유용합니다.

이러한 필터를 결합할 수도 있습니다. 예를 들어, 운영 체제 패키지에서 HIGH 또는 CRITICAL 취약점만 보려면 다음을 수행합니다.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --severity HIGH,CRITICAL --vuln-type os

이 명령은 이미지의 운영 체제 계층 내에서 가장 심각한 취약점에 대한 보다 집중적인 보기를 제공합니다. 필터링은 출력을 관리하고 보안 노력을 효과적으로 우선시하는 데 도움이 됩니다.

이미지 비교 및 Markdown 보고서 생성

이전 단계에서는 터미널에서 직접 취약점 비교 결과를 확인했습니다. 이는 빠른 확인에는 유용하지만, 보고, 문서화 또는 추가 분석을 위해 결과를 구조화된 형식으로 저장해야 하는 경우가 많습니다. trivy는 Markdown 을 포함한 다양한 출력 형식을 지원합니다.

Markdown 보고서를 생성하는 것은 Markdown 이 읽기 쉽고 HTML 또는 PDF 와 같은 다른 형식으로 쉽게 변환할 수 있는 경량 마크업 언어이기 때문에 유용합니다.

이미지 비교의 Markdown 보고서를 생성하려면 --format 플래그를 사용하고 markdown을 지정합니다. 또한 > 연산자를 사용하여 출력을 파일로 리디렉션합니다.

ubuntu:20.04ubuntu:22.04를 다시 비교하고 출력을 ~/project 디렉토리의 comparison_report.md라는 Markdown 파일에 저장해 보겠습니다.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --format markdown > ~/project/comparison_report.md

이 명령은 첫 번째 단계와 동일한 비교를 수행하지만 출력을 Markdown 으로 형식화하고 지정된 파일에 저장합니다. 이번에는 터미널에서 출력을 직접 볼 수 없습니다.

명령이 완료된 후 cat 또는 nano를 사용하여 생성된 Markdown 파일을 볼 수 있습니다.

cat ~/project/comparison_report.md

이 명령은 터미널에 comparison_report.md 파일의 내용을 표시합니다. 제목, 목록 및 표를 포함하여 Markdown 구문을 사용하여 형식화된 취약점 비교 결과를 볼 수 있습니다.

nano로 파일을 열어 텍스트 편집기에서 볼 수도 있습니다.

nano ~/project/comparison_report_markdown.md

파일을 본 후에는 nano를 종료하는 것을 잊지 마십시오 (Ctrl+X).

Markdown 과 같은 다양한 형식으로 보고서를 생성하면 취약점 정보를 다른 사람과 쉽게 공유하거나 기존 보고 워크플로우에 통합할 수 있습니다. 이는 개발 및 배포 파이프라인에 보안 스캔을 통합하는 데 중요한 단계입니다.

요약

이 랩에서는 trivy 도구를 사용하여 두 개의 Docker 이미지를 비교하는 방법을 배웠습니다. 먼저 trivy 저장소를 추가하고 apt를 사용하여 패키지를 설치하는 과정을 포함하는 LabEx 환경에서 trivy를 설치하는 것으로 시작했습니다. 설치 후 Docker Hub 에서 ubuntu:20.04ubuntu:22.04의 두 가지 다른 버전의 ubuntu 이미지를 가져왔습니다. 마지막으로, 이러한 두 이미지를 비교하고 취약점 및 패키지의 차이점을 분석하기 위해 기본 trivy image --diff-image 명령을 실행했습니다.