※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.버전 확인

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


7.Trivy 점검 스크립트 실행 결과 확인
1) 생성되는 파일 목록
| 구분 | 파일명 | 설명 | 비고 |
| 1 | {네임스페이스}_deployments.txt | 각 네임스페이스 별 deploy 확인 결과 | List (txt) |
| 2 | {네임스페이스}_pods.txt | 각 네임스페이스 별 pod 확인 결과 | List (txt) |
| 3 | {네임스페이스}_{pod 명}.json | 1, 2번에서 확인된 이미지를 기반으로 Trviy 점검 결과 | Json |

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


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


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


'기초 공부 > 시스템' 카테고리의 다른 글
| [Kubernetes] Kubernetes 설치 (ubuntu 22.04/Containerd/Flannel) (0) | 2024.02.15 |
|---|---|
| [Kubernetes] 1.쿠버네티스 설치_fail (1) | 2023.11.15 |
| [Docker] Docker 기본 명령어 (Docker? 도커?) (0) | 2023.06.15 |
| [Docker] Docker 설치 (feat.Rocky Linux 9.1) (0) | 2023.06.09 |
| [Linux] Rocky Linux 9.1 설치 (feat.DNF) (0) | 2023.05.02 |