본문 바로가기

기초 공부/시스템

[kubernetes] Trivy를 이용한 이미지 점검

※kubernetes를 이용한 서비스 구축 간, CVE 점검을 SAST 방식으로 수행하기 위한 정보 글

※해당 방식은 수작업으로 진행되는 과정을 자동화하기 위한 do-it 개념의 Code이기에 수정 및 개선이 필요함

 

1.Trivy 다운로드

 

https://aquasecurity.github.io/trivy/v0.54/

 

Overview - Trivy

Trivy Documentation 👋 Welcome to Trivy Documentation! To help you get around, please notice the different sections at the top global menu: You are currently in the Getting Started section where you can find general information and help with first steps.

aquasecurity.github.io

 

2.Trivy 설치

#버전 확인 후 Trivy 다운로드 (Ubuntu)
wget https://github.com/aquasecurity/trivy/releases/download/v0.54.1/trivy_0.54.1_Linux-64bit.deb
#다운로드된 Trivy 설치
sudo dpkg -i trivy_0.54.1_Linux-64bit.deb
#설치된 Trivy 버전 확인
trivy --version

 

 

3.버전 확인

trivy --version

 

4.Trivy 점검 스크립트 조건 설정

1) Trivy를 수행하는 시스템은, Kubernetes에 접근할 수 있는 권한 필요

2) kubectl 기반의 명령어 수행

3) Trivy 설치

4) 운용 중인 Pod의 컨테이너 이미지의 저장 위치에 접근할 수 있는 권한 필요

 

5.Trivy 점검 스크립트 작성

#!/bin/bash

# Step 1: 모든 네임스페이스를 가져와 루프 시작
for NAMESPACE in $(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}'); do
    
    # Step 2: 네임스페이스별로 Deployments 정보 추출 및 저장
    DEPLOYMENTS_FILE="${NAMESPACE}_deployments.txt"
    if ! kubectl get deploy -n $NAMESPACE -o jsonpath='{range .items[*]}{"NAME:"}{.metadata.name}{" IMAGES:"}{.spec.template.spec.containers[*].image}{"\n"}{end}' > $DEPLOYMENTS_FILE; then
        echo "Error: Failed to execute kubectl command for deployments in namespace $NAMESPACE."
        continue
    fi

    echo "Deployments information for namespace $NAMESPACE saved to $DEPLOYMENTS_FILE"

    # Step 3: 네임스페이스별로 Pods 정보 추출 및 저장
    PODS_FILE="${NAMESPACE}_pods.txt"
    if ! kubectl get pods -n $NAMESPACE -o jsonpath='{range .items[*]}{"NAME:"}{.metadata.name}{" IMAGES:"}{.spec.containers[*].image}{"\n"}{end}' > $PODS_FILE; then
        echo "Error: Failed to execute kubectl command for pods in namespace $NAMESPACE."
        continue
    fi

    echo "Pods information for namespace $NAMESPACE saved to $PODS_FILE"

    # Step 4: 네임스페이스별로 Deployments 이미지를 Trivy로 스캔
    while IFS= read -r line; do
        NAME=$(echo $line | awk -F' IMAGES:' '{print $1}' | awk -F'NAME:' '{print $2}')
        IMAGE=$(echo $line | awk -F' IMAGES:' '{print $2}')
        OUTPUT_FILE="${NAMESPACE}_${NAME}.json"

        echo "Scanning image: $IMAGE for deployment: $NAME in namespace: $NAMESPACE"
        if ! trivy image $IMAGE --format json > $OUTPUT_FILE; then
            echo "Error: Failed to scan image $IMAGE for deployment $NAME in namespace $NAMESPACE."
            continue
        fi
    done < "$DEPLOYMENTS_FILE"

    # Step 5: 네임스페이스별로 Pods 이미지를 Trivy로 스캔
    while IFS= read -r line; do
        NAME=$(echo $line | awk -F' IMAGES:' '{print $1}' | awk -F'NAME:' '{print $2}')
        IMAGE=$(echo $line | awk -F' IMAGES:' '{print $2}')
        OUTPUT_FILE="${NAMESPACE}_${NAME}.json"

        echo "Scanning image: $IMAGE for pod: $NAME in namespace: $NAMESPACE"
        if ! trivy image $IMAGE --format json > $OUTPUT_FILE; then
            echo "Error: Failed to scan image $IMAGE for pod $NAME in namespace $NAMESPACE."
            continue
        fi
    done < "$PODS_FILE"

done

 

6.Trivy 점검 스크립트 실행

1) Trivy 점검 스크립트 실행 권한 적용 및 실행

#Trivy 점검 스크립트에 실행 권한 부여
sudo chmod +x Trivy_v0.4
#실행 권한이 부여된 Trivy 점검 스크립트 실행
./Trivy_v0.4.sh

Trivy_v0.4 점검 스크립트 실행 권한 부여

 

Trviy 점검 스크립트 실행 하면 (-ing)

 

7.Trivy 점검 스크립트 실행 결과 확인

1) 생성되는 파일 목록

구분 파일명 설명 비고
1 {네임스페이스}_deployments.txt 각 네임스페이스 별 deploy 확인 결과 List (txt)
2 {네임스페이스}_pods.txt 각 네임스페이스 별 pod 확인 결과 List (txt)
3 {네임스페이스}_{pod 명}.json 1, 2번에서 확인된 이미지를 기반으로 Trviy 점검 결과 Json

 

Trivy 점검 스크립트 결과로 생성되는 파일 목록

 

 

2) Deploy로 확인되는 이미지 목록 ({네임스페이스명}_Deployments.txt)

각 네임스페이스 별 Deploy 분류

 

deploy 설정/미설정에 따른 이미지 경로 확인

 

3) Pod로 확인되는 이미지 목록 ({네임스페이스명}_pods.txt)

각 네임스페이스 별 Pod 분류
default 네임스페이스 내 pod 이미지 경로 확인

8.Json 결과 확인

 - Python을 이용하여 Json 데이터를 파싱하고, Excel 파일을 생성하는 Code를 사전에 작성하여 이용

Python을 이용한 Json 데이터 파싱 및 Excel 파일 생성
생성된 Excel 파일 내 CVE 목록 확인