Kubernetes 이야기

trivy를 활용한 Container Image 취약성 검사 본문

Kubernetes/보안

trivy를 활용한 Container Image 취약성 검사

kmaster 2022. 3. 6. 11:05
반응형

Trivy

 

Trivy는 컨테이너 및 아티팩트에 대한 취약성 및 잘못된 구성정보에 대한 검사 도구이다. 소프트웨어 취약점은 소프트웨어나 운영 체제에 존재하는 결함, 또는 약점이다.
OS 패키지 (Alpine, RHEL, CentOS 등) 및 언어별 패키지 (Bundler, Composer, npm, yarn 등) 의 취약점을 감지한다 . 
또한 Terraform 및 Kubernetes와 같은 IaC(Infrastructure as Code) 파일을 스캔 하여 배포를 공격 위험에 노출시키는 잠재적 구성 문제를 감지한다.

 

출처 : https://aquasecurity.github.io/

 

설치

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에서 사용하는 방법을 알아보겠다.

반응형
Comments