아마존 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"
    }
}

imageScanStatusIN_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

마치며

이미지 스캔에 대한 더 자세한 정보는 공식 문서와 블로그를 참고해주세요.

도커나 컨테이너를 기반으로 서비스를 운영하는 경우 안전하고 신뢰할 수 있는 이미지를 이용하는 것이 무엇보다도 중요합니다. 취약점 스캔 기능으로 좀 더 안전하게 도커 기반 서비스 운영을 할 수 있기를 바랍니다.

패커(Packer)로 도커(Docker) 이미지 및 AMI 자동 빌드 시스템 구축

🗒 기사, 2015-09-30 - 패커는 하시코프에서 만든 범용 가상머신, 컨테이니 이미지 생성 도구입니다. 패커는 시스템의 특정 상태를 저장하는 대신 복원 가능한 방식으로 이미지 생성을 자동화할 수 있게 도와줍니다. 이 글에서는 패커를 사용해 도커 이미지와 AMI 이미지를 빌드하는 방법을 소개합니다.

젯브레인 IDE로 쾌적한 테라폼(Terraform) 코딩 환경 구축

🗒 기사, 2019-02-26 - 테라폼(Terraform)은 클라우드 시대에 각광받고 있는 인프라스트럭처 관리 도구입니다. 대다수 에디터들이 코드 하이라이팅이나 자동 완성 등을 지원하지만, 아직까지 인텔리J(IntelliJ) 만큼 강력한 지원 기능을 본 적은 없습니다. 어떤 기능인지 둘러보실까요?

싱크띵(Syncthing), 여러 기기간 파일 동기화 애플리케이션: 드롭박스 대신 무료로 가능한 오픈소스 프로젝트

🗒 기사, 2019-09-08 - 싱크띵(Syncthing)은 드롭박스와 같은 여러 기기간에 파일을 동기화하는 애플리케이션입니다. 싱크띵은 오픈소스로 개발되고 있으며 동기화하지 않을 파일 패턴을 지정하지 않을 수 있는 방법을 제공합니다. 이 글에서는 싱크띵의 기본적인 사용법을 소개합니다.