Jenkins CI/CD에서 컨테이너 보안 취약성 스캐닝
🚀 보안 통합 테스트
CI/CD는 코드를 git과 같은 소스 코드 저장소에 Commit하여 자동화된 테스트를 통해 애플리케이션 빌드/배포할 수 있도록 돕고 있습니다.
테스트가 실패하면 개발자는 즉시 알림을 받고 코드를 빠르게 수정할 수 있습니다. 이러한 자동화는 전반적인 코드 품질을 높이고 개발 속도를 높일 수 있습니다.
대부분 조직은 애플리케이션을 배포하기 전 마지막 단계에서 보안 팀이 감사를 수행하고 있습니다.
사전에 개발 조직은 취약한 소프트웨어 구성 요소, 보안 취약성이 포함된 오래된 패키지 등을 검색하고 올바르게 구성되었는지 확인할 수 있어야합니다.
CI / CD 프로세스에 보안 및 규정 준수 검사를 추가하여 개발 초기에 빠르게 보안 또는 규정 준수 문제를 수정할 수 있도록 할 수 있습니다.
이번 내용은 CI/CD Pipeline에 컨테이너 이미지 분석, 규정 준수 테스트를 Jenkins 와 Anchore를 이용하여 구성해보겠습니다.
🧰 Anchore Engine
Anchore Engine은 컨테이너 이미지를 스캔하여 보안 취약점, 파일, OS package, Dockerfile, OSS 라이선스 검사에 대한 평가 보고서를 생성 할 수 있습니다.
또한 Anchore는 Jenkins가 컨테이너 이미지 빌드 트리거하는 CI / CD Workflow에 원활하게 연결되도록 설계되었습니다.
🔗 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
👨💻 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}}
}
👨💻 실행결과
다음과 같이 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/opensource/
https://github.com/anchore/anchore-engine
