일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Kopf
- gitea
- gitops
- Kubeflow
- blue/green
- tekton
- Litmus
- nginx ingress
- opensearch
- Continuous Deployment
- keda
- 오퍼레이터
- MLflow
- mlops
- Pulumi
- 카오스 엔지니어링
- Kubernetes
- Model Serving
- opentelemetry
- operator
- kubernetes operator
- knative
- argocd
- CANARY
- Kubernetes 인증
- CI/CD
- seldon core
- argo rollout
- Argo
- serving
- Today
- Total
Kubernetes 이야기
trivy를 활용한 Container Image 취약성 검사 본문
Trivy
Trivy는 컨테이너 및 아티팩트에 대한 취약성 및 잘못된 구성정보에 대한 검사 도구이다. 소프트웨어 취약점은 소프트웨어나 운영 체제에 존재하는 결함, 또는 약점이다.
OS 패키지 (Alpine, RHEL, CentOS 등) 및 언어별 패키지 (Bundler, Composer, npm, yarn 등) 의 취약점을 감지한다 .
또한 Terraform 및 Kubernetes와 같은 IaC(Infrastructure as Code) 파일을 스캔 하여 배포를 공격 위험에 노출시키는 잠재적 구성 문제를 감지한다.
설치
trivy는 설치나 사용법이 매우 간단하다. 또한 trivy를 client/server 모드로 사용할 수 있는데 이번에는 trivy를 Kubernetes위에 Server와 Client로 분리하여 설치해 보겠다.
1) Server
kind: Service
apiVersion: v1
metadata:
name: trivy-rules
labels:
app: trivy-rules
spec:
selector:
app: trivy-rules
ports:
- port: 8080
protocol: TCP
targetPort: 8080
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: trivy-rules
labels:
app: trivy-rules
spec:
replicas: 1
selector:
matchLabels:
app: trivy-rules
template:
metadata:
labels:
app: trivy-rules
spec:
containers:
- name: trivy-rules
image: aquasec/trivy:0.20.2
imagePullPolicy: Always
args:
- "server"
- "--listen"
- "0.0.0.0:8080"
ports:
- containerPort: 8080
protocol: TCP
2) Client
apiVersion: batch/v1
kind: Job
metadata:
name: image-scan
spec:
template:
spec:
containers:
- name: image-scan
image: docker.io/aquasec/trivy
command:
- trivy
args:
- client
- '--insecure'
- '--severity'
- 'HIGH,CRITICAL'
- '--exit-code'
- '1'
- '--remote'
- 'http://trivy-rules.test.svc:8080'
- 'python:3'
restartPolicy: Never
backoffLimit: 0
* Private registry의 인증이 필요한 경우에는 환경변수에 아래와 같이 추가해야 한다.
export TRIVY_USERNAME=id
export TRIVY_PASSWORD=password
# kubectl logs -f -n test image-scan-wkhpb
python:3 (debian 11.2)
======================
Total: 898 (UNKNOWN: 0, LOW: 534, MEDIUM: 195, HIGH: 144, CRITICAL: 25)
+------------------------------+------------------+----------+----------------------+---------------+----------------------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+------------------------------+------------------+----------+----------------------+---------------+----------------------------------------------------+
| apt | CVE-2011-3374 | LOW | 2.2.4 | | It was found that apt-key in apt, |
| | | | | | all versions, do not correctly... |
| | | | | | -->avd.aquasec.com/nvd/cve-2011-3374 |
+------------------------------+------------------+ +----------------------+---------------+----------------------------------------------------+
| binutils | CVE-2017-13716 | | 2.35.2-2 | | binutils: Memory leak with the C++ |
| | | | | | symbol demangler routine in libiberty |
| | | | | | -->avd.aquasec.com/nvd/cve-2017-13716 |
+ +------------------+ + +---------------+----------------------------------------------------+
| | CVE-2018-12934 | | | | binutils: Uncontrolled |
| | | | | | Resource Consumption in |
| | | | | | remember_Ktype in cplus-dem.c |
| | | | | | -->avd.aquasec.com/nvd/cve-2018-12934 |
+ +------------------+ + +---------------+----------------------------------------------------+
| | CVE-2018-18483 | | | | binutils: Integer overflow |
| | | | | | in cplus-dem.c:get_count() |
| | | | | | allows for denial of service |
| | | | | | -->avd.aquasec.com/nvd/cve-2018-18483 |
+------------------------------+------------------+ + +---------------+----------------------------------------------------+
..
# kubectl get all -n test
NAME READY STATUS RESTARTS AGE
pod/image-scan-wkhpb 0/1 Error 0 21s
pod/trivy-rules-877b567d-gnxxd 1/1 Running 0 14m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/trivy-rules ClusterIP 10.106.176.138 <none> 8080/TCP 14m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/trivy-rules 1/1 1 1 14m
NAME DESIRED CURRENT READY AGE
replicaset.apps/trivy-rules-877b567d 1 1 1 14m
NAME COMPLETIONS DURATION AGE
job.batch/image-scan 0/1 21s 21s
Job의 실행 결과를 보면 Error 로 되는것을 볼 수 있다. 이는 Job 실행 시 아래와 같이 취약성 검사 시 severity 설정에 따라 오류가 있을 때 exit-code를 "1"로 설정했기 때문이다.
- '--severity'
- 'HIGH,CRITICAL'
- '--exit-code'
- '1'
간단히 Trivy를 Client/Server 모드로 실행해 보았는데 Client는 CI/CD Pipeline에 포함하여 사용자의 container image가 서버로 배포되기 전에 취약성 검사를 진행하면 보안에 좀 더 효과적으로 대처할 수 있겠다.
다음 시간에는 Trivy를 Argo Workflow에서 사용하는 방법을 알아보겠다.
'Kubernetes > 보안' 카테고리의 다른 글
Kubernetes 에서 Vault 활용 (0) | 2022.03.14 |
---|---|
Kubernetes에서 Secret 암호화 (0) | 2022.03.13 |
Kubernetes에서 Connaisseur 를 사용하여 이미지 서명 검증하기 (0) | 2022.02.22 |
Cosign 으로 Container 이미지 서명하기 (0) | 2022.02.22 |
Kyverno ( Kubernetes Policy) (0) | 2022.02.20 |