skip to Main Content

Jenkins CI/CD에서 컨테이너 보안 취약성 스캐닝

🚀 보안 통합 테스트

CI/CD는 코드를 git과 같은 소스 코드 저장소에 Commit하여 자동화된 테스트를 통해 애플리케이션 빌드/배포할 수 있도록 돕고 있습니다.

테스트가 실패하면 개발자는 즉시 알림을 받고 코드를 빠르게 수정할 수 있습니다. 이러한 자동화는 전반적인 코드 품질을 높이고 개발 속도를 높일 수 있습니다.

대부분 조직은 애플리케이션을 배포하기 전 마지막 단계에서 보안 팀이 감사를 수행하고 있습니다.

사전에 개발 조직은 취약한 소프트웨어 구성 요소, 보안 취약성이 포함된 오래된 패키지 등을 검색하고 올바르게 구성되었는지 확인할 수 있어야합니다.

출처 : https://www.jenkins.io/blog/2018/06/20/anchore-image-scanning/

CI / CD 프로세스에 보안 및 규정 준수 검사를 추가하여 개발 초기에 빠르게 보안 또는 규정 준수 문제를 수정할 수 있도록 할 수 있습니다.

이번 내용은 CI/CD Pipeline에 컨테이너 이미지 분석, 규정 준수 테스트를 Jenkins 와 Anchore를 이용하여 구성해보겠습니다.

🧰 Anchore Engine

Anchore Engine은 컨테이너 이미지를 스캔하여 보안 취약점, 파일, OS package, Dockerfile, OSS 라이선스 검사에 대한 평가 보고서를 생성 할 수 있습니다.

또한 Anchore는 Jenkins가 컨테이너 이미지 빌드 트리거하는 CI / CD Workflow에 원활하게 연결되도록 설계되었습니다.

출처 : https://anchore.com/container-registry-scanning/

🔗 https://github.com/anchore/anchore-engine

👨‍💻 Install Anchore

사전환경

🔧 Kubernetes 1.18.12

🔧 Anchore 0.9.3 (helm chart)

kubernetes 환경에서는 helm을 사용하면 간단하게 설치할 수 있습니다.

$ helm repo add anchore <https://charts.anchore.io>
$ helm install anchore -n anchore anchore/anchore-engine

설치 이후 pod를 조회하면 anchore에 필요한 구성 pod가 생성된 것을 보실 수 있습니다.

$ kubectl get po -n anchore
NAME                                                  READY   STATUS    RESTARTS   AGE
anchore-anchore-engine-analyzer-666445656f-f786q      1/1     Running   0          7d1h
anchore-anchore-engine-api-648cc86f48-4dg7c           1/1     Running   1          7d2h
anchore-anchore-engine-catalog-f9975dd86-6wsgn        1/1     Running   1          7d2h
anchore-anchore-engine-policy-746dd8bf9b-p7rdm        1/1     Running   1          7d2h
anchore-anchore-engine-simplequeue-5c66b4b9f7-zd946   1/1     Running   1          7d2h
anchore-postgresql-c498d8758-ncv9n                    1/1     Running   0          7d2h

🔗 Install with Helm on Kubernetes
https://docs.anchore.com/current/docs/installation/helm/

👨‍💻 Jenkinsfile 작성

사전환경

🔧 Jenkins v2.204 ( kubernetes plugin 1.22.0 )

Jenkins에서 anchore plugin 을 설치해서 스캔하는 방법도 있지만 anchore/engine-cli를 컨테이너를 이용하면 쉽게 가능합니다. helm 으로 구성한 ANCHORE_CLI_URL 정보와 ANCHORE_CLI_USER, ANCHORE_CLI_PASS 정보를 입력합니다.

👨‍💻  anchore/engine-cli

podTemplate (
         containers: [
             containerTemplate(name: 'anchore', image: 'anchore/engine-cli', ttyEnabled: true, command: 'cat', 
                 envVars: [
                     containerEnvVar(key: 'ANCHORE_CLI_URL', value: 'http://anchore-anchore-engine-api.anchore.svc.cluster.local:8228/v1/'),
                     containerEnvVar(key: 'ANCHORE_CLI_USER', value: 'admin'),
                     containerEnvVar(key: 'ANCHORE_CLI_PASS', value: 'password'),
                     ]
             ),

👨‍💻  Evaluation Container Image

위에서 anchore-cli 컨테이너를 정의했다면 CI/CD Workflow 에 anchore Stage를 추가합니다. cli 명령어 순은 이미지 추가 이후 분석하고 평가되도록 합니다.

    {{GetSource}} 

    {{SourceBuild}}

    {{DockerBuild}}

    {{DockerPush}}

    container('anchore') { 
    stage('Anchore Evaluation') { 
        sh """
            echo "Adding image to Anchore engine" && 
            anchore-cli image add ${image.name}:${image.tag} &&
            echo "Waiting for image analysis to complete" &&
            anchore-cli image get ${image.name}:${image.tag} &&
            sleep 30 &&
            echo "Analysis complete" &&
            anchore-cli evaluate check ${image.name}:${image.tag} --detail
            echo "Evaluate check complete" &&
            anchore-cli evaluate check ${image.name}:${image.tag} | grep 'Status: pass' > /dev/null
        """        
	    }     
    }

    {{Deploy}}
}

🔗 Anchore-cli 사용방법
https://github.com/anchore/anchore-cli

👨‍💻  실행결과

다음과 같이 Status: pass 라면 다음 Stage로 진행되지만 fail 이라면 abort된 상태에서 멈추게 됩니다.

+ echo 'Analysis complete'
Analysis complete
+ anchore-cli evaluate check 10.60.200.131:30001/admin/demo.deployment.anchore-test:65 --detail
Image Digest: sha256:a9a8004e40edcce7cc3ad04383e63d577224324e869188a40ba8cd6476f3f924
Full Tag: 10.60.200.131:30001/admin/demo.deployment.anchore-test:65
Image ID: 7693cc5868ee2e787475acf68121ad221b0f2928c6f346214d3c311a60da4cbd
Status: pass
Last Eval: 2021-04-27T05:54:10Z
Policy ID: custom-policy
Final Action: warn
Final Action Reason: policy_evaluation

Gate                   Trigger                               Detail                                                                                                                                                                                                         Status        
dockerfile             instruction                           Dockerfile directive 'HEALTHCHECK' not found, matching condition 'not_exists' check                                                                                                                            warn          
vulnerabilities        stale_feed_data                       The vulnerability feed for this image distro is older than MAXAGE (2) days                                                                                                                                     warn          
vulnerabilities        vulnerability_data_unavailable        Distro-specific feed data not found for distro namespace: busybox:v1.30.0. Cannot perform CVE scan OS/distro packages                                                                                          warn          
vulnerabilities        package                               MEDIUM Vulnerability found in non-os package type (java) - /deployment/ROOT.war:WEB-INF/lib/sonar-scanner-api-2.12.0.1661.jar:okhttp (CVE-2018-20200 - https://nvd.nist.gov/vuln/detail/CVE-2018-20200)        warn          
vulnerabilities        package                               MEDIUM Vulnerability found in non-os package type (java) - log4j (fixed in: None)(GHSA-2qrg-x229-3v8q - https://github.com/advisories/GHSA-2qrg-x229-3v8q)                                                     warn          

+ echo 'Evaluate check complete'
Evaluate check complete
+ grep 'Status: pass'
+ anchore-cli evaluate check 10.60.200.131:30001/admin/demo.deployment.anchore-test:65

이외에도 Anchore를 사용하여 Image contents ( os, files, npm, gem, python ) 를 검사하거나 Policy를 커스텀하여 필요한 규정을 만들어서 평가할 수도 있습니다.
사이트별 모범사례(소프트웨어 라이선스, 화이트/블랙리스트 패키지, dockerfile 검사 등) Anchore 정책의 범위에 대한 자세한 내용은 여기서 확인하실 수 있습니다. 🙇

🔗 Related Links

https://anchore.com/blog/inline-scanning-with-anchore-engine/

https://anchore.com/

https://anchore.com/opensource/

https://github.com/anchore/anchore-engine

Back To Top