아마존 ECR, 도커 이미지 취약점 스캔 기능 추가
아마존 ECR에 취약점 검사 기능이 추가
늦은 소식입니다만, 지난 2019년 10일 28일 아마존 웹 서비스Amazon Web Service에서는 아마존 ECRAmazon ECR에 이미지 취약점 검사 기능이 추가되었다고 발표했습니다.
아마존 ECR의 정식 명칭은 아마존 엘라스틱 컨테이너 레지스티리Amazon Elastic Container Registry로 AWS에서 제공하는 매니지드 도커 레지스트리 서비스입니다. ECR을 사용하면 별도의 서버 구축 없이 프라이빗 도커 이미지 저장소를 운영하는 것이 가능합니다. 특히 아마존 ECSAmazon ECS나 아마존 EKSAmazon EKS 등의 매니지드 컨테이너 오케스트레이션 도구들과 함께 편리하게 사용할 수 있습니다.
이 날 발표한 이미지 스캐닝 기능은 레지스트리에 저장 되어있는 이미지나, 레지스트리에 이미지를 푸시할 때 이미지를 스캔하는 기능으로 코어OSCoreOS의 클레어Clair CVE 데이터베이스를 기반으로 이미지를 스캔합니다. 도커 이미지의 취약점 검사를 수행하는 도구로는 이미 goodwithtech/dockle, aquasecurity/trivy, quay/clair 등이 있었습니다만, CI와 통합하는 등 추가 셋업이 필요합니다. 물론 레지스트리에서 이미지 스캐닝을 지원하는 것은 이미 도커 허브Docker Hub나 콰이Quay와 같은 매니지드 레지스트리에서 이미 제공해오던 기능입니다.*.
* 아주 당연한 이야기입니다만, 취약점 스캐닝 기능은 바이러스 검사 앱과 비슷합니다. 서비스나 도구 별로 서로 다른 결과를 내놓기 때문에 어떤 도구를 선택하고 그 결과를 신뢰할지, 그리고 어느 정도까지 대응할지는 전적으로 사용자가 판단할 필요가 있습니다.
이 기능은 무료로 제공됩니다. 단, 이미지 당 24시간 동안 1번만 스캔하는 것이 가능하며, 추가로 스캔을 하려고 시도하는 경우 ThrottlingException
이 발생합니다.
AWS CLI로 아마존 ECR의 취약점 스캔 기능 살펴보기
이 글에서는 awscli를 사용해, 아마존 ECR의 이미지 취약점 스캔 기능에 대해서 소개하겠습니다. awscli의 셋업에 대해서는 다음 글을 참고해주시기 바랍니다.
아미지 스캔 기능을 사용하려면 최신 버전의 awscli를 사용해야합니다. 맥OS의 경우 다음 명령어로 업그레이드를 진행할 수 있습니다.
$ brew upgrade awscli
$ aws --version
aws-cli/1.16.310 Python/3.8.1 Darwin/18.6.0 botocore/1.13.46
이미지 푸시하고 직접 이미지 스캔 실행하기
먼저 이미지 저장소를 하나 만들고, 이미지를 푸시해보겠습니다.
$ aws ecr create-repository --repository-name ecr-scan-test
$ $(aws ecr get-login --no-include-email --region ap-northeast-2)
$ docker pull httpd:latest
$ docker tag httpd:latest 526128392.dkr.ecr.ap-northeast-2.amazonaws.com/ecr-scan-test:latest
$ docker push 526128392.dkr.ecr.ap-northeast-2.amazonaws.com/ecr-scan-test:latest
이 예제에서는 도커 허브에서 제공하는 공식 아파치 서버의 이미지를 사용합니다. 이 이미지의 이름을 변경해서 ECR에 다시 푸시했습니다. 다음으로 start-image-scan
명령어로 이 이미지의 취약점을 스캔합니다.
$ aws ecr start-image-scan --repository-name ecr-scan-test --image-id imageTag=latest
{
"registryId": "526128392",
"repositoryName": "ecr-scan-test",
"imageId": {
"imageDigest": "sha256:63dbdd1b6cb325d3afda7774...",
"imageTag": "latest"
},
"imageScanStatus": {
"status": "IN_PROGRESS"
}
}
imageScanStatus
는 IN_PROGRESS
입니다. 스캔 작업은 아주 오래 걸리진 않지만, 비동기로 진행되기 때문에 필요한 경우 스캔이 끝났을 때 이벤트브릿지를 통해서 알림을 받을 수 있습니다.
수동으로 이미지 스캔 결과를 조회하는 경우 describe-image-scan-findings
명령어를 사용합니다.
$ aws ecr describe-image-scan-findings --repository-name ecr-scan-sample --image-id imageTag=latest
{
"imageScanFindings": {
"findings": [
{
"name": "CVE-2019-15505",
"description": "drivers/media/usb/dvb-usb/technisat-usb2.c in the Linux kernel through 5.2.9 has an out-of-bounds read via crafted USB device traffic (which may be remote via usbip or usbredir).",
"uri": "https://security-tracker.debian.org/tracker/CVE-2019-15505",
"severity": "CRITICAL",
...
꽤 많은 결과가 나오네요 😮. 웹 콘솔의 ECR 서비스에서도 결과를 확인해볼 수 있습니다.

이미지의 태그에서 취약점Vulnerabilities 메뉴에 들어가면 구체적인 정보들을 확인할 수 있습니다.

요약Overview에는 위험 수준 별로 취약점 개수가 나오고, 아래에는 취약점에 대한 자세한 정보가 나타납니다. 도커 환경은 일반적인 실행 환경과는 다르기는 합니다만, 문제가 될만한 취약점은 미리 걸러내거나 취약점이 해결된 베이스 이미지를 사용하는 것이 좋습니다.
이미지 스캔이 활성화된 새로운 저장소(레포지터리) 만들기
이미지 스캔은 수동으로 실행할 수도 있지만, 푸시가 되면 자동으로 이미지의 취약점을 스캔할 수도 있습니다. 아래와 같이 ECR 저장소 생성시에 scanOnPush=true
옵션을 추가해줍니다.
$ aws ecr create-repository --repository-name ecr-auto-scan-test --image-scanning-configuration scanOnPush=true
이미 만들어진 이미지 저장소에 자동 스캔 기능 활성화하기
이미 만들어진 저장소의 경우에도 자동 스캔 기능을 활성화할 수 있습니다. put-image-scanning-configuration
명령어를 사용해 scanOnPush=true
옵션을 활성화합니다.
$ aws ecr put-image-scanning-configuration --repository-name ecr-already-created --image-scanning-configuration scanOnPush=true
마치며
이미지 스캔에 대한 더 자세한 정보는 공식 문서와 블로그를 참고해주세요.
도커나 컨테이너를 기반으로 서비스를 운영하는 경우 안전하고 신뢰할 수 있는 이미지를 이용하는 것이 무엇보다도 중요합니다. 취약점 스캔 기능으로 좀 더 안전하게 도커 기반 서비스 운영을 할 수 있기를 바랍니다.