본문으로 건너뛰기

Dockerfile을 사용한 Clair 컨테이너 이미지 구축

Clair는 컨테이너 취약점에 대한 오픈 소스 정적 분석 도구로, 컨테이너 이미지를 스캔하여 내부의 알려진 취약점을 감지하는 데 사용됩니다. 그 주요 특징은 다음과 같습니다:

  1. 다양한 지원 형식 Clair는 Docker, OCI, RHEL OCI 등 일반적인 리눅스 컨테이너 이미지 형식을 분석할 수 있습니다.

  2. 정적 분석 네트워크 기반 또는 런타임 스캐닝과 달리 Clair는 정적 분석 접근 방식을 사용하여 컨테이너를 시작할 필요 없이 컨테이너 이미지 파일만으로 스캔을 완료할 수 있습니다.

  3. 연속 모니터링 Clair는 컨테이너 이미지의 취약점 상태를 지속적으로 모니터링하며 새로운 취약점 업데이트를 즉시 감지하여 보고합니다.

  4. 플러그인 아키텍처 Clair는 타사 데이터 소스 플러그인 설치를 지원하여 더 많은 유형의 컨테이너 이미지와 소프트웨어 패키지 형식을 지원할 수 있습니다.

  5. 유연한 구성 특정 취약점을 무시하거나 스캔 심각도 수준을 설정하는 등의 구성을 사용자 정의할 수 있습니다.

  6. 컨테이너화된 배포 Clair 자체가 컨테이너 애플리케이션이며 컨테이너를 통해 빠르게 배포하고 확장할 수 있습니다.

이 글은 Dockerfile을 사용하여 Clair 이미지를 구축하는 방법과 이미지 구축 과정의 각 단계를 이해하는 방법에 대해 안내합니다.

Dockerfile 분석

FROM golang:alpine as builder

이 줄은 builder라는 이름의 빌드 단계를 정의하고 기본 이미지로 golang:alpine을 사용합니다. 이는 Go와 그 도구 체인을 사용하여 Clair의 소스 코드를 컴파일하기 위한 것입니다.

RUN apk --no-cache add \
ca-certificates \
git \
make

Clair 컴파일에 필요한 종속성(ca-certificates, git, make)을 설치합니다.

ENV PATH /go/bin:/usr/local/go/bin:$PATH
ENV GOPATH /go

Go 관련 환경 변수 PATHGOPATH를 설정합니다.

RUN go get github.com/quay/clair/cmd/clair || true

go get 명령어를 사용하여 Clair 소스 저장소를 가져옵니다.

ENV CLAIR_VERSION v2.1.4

컴파일할 Clair 버전을 v2.1.4로 지정합니다.

WORKDIR /go/src/github.com/quay/clair
RUN git checkout "${CLAIR_VERSION}"

작업 디렉토리를 Clair 소스 디렉토리로 변경하고 지정된 버전의 코드를 체크아웃합니다.

RUN go install ./cmd/clair

clair 명령줄 도구를 $GOPATH/bin 디렉토리에 컴파일하고 설치합니다.

FROM alpine:latest

새로운 빌드 단계로, 기본 이미지는 alpine:latest입니다.

RUN apk --no-cache add \
ca-certificates \
git \
rpm \
xz

Clair를 실행하는 데 필요한 종속성(rpmxz 등)을 추가합니다.

COPY --from=builder /go/bin/clair /usr/bin/clair

컴파일된 clair 실행 파일을 builder 단계에서 새 이미지로 복사합니다.

ENTRYPOINT ["clair"]

컨테이너 엔트리포인트를 clair 명령으로 설정합니다.

완성된 Dockerfile 스크립트

FROM golang:alpine as builder

RUN apk --no-cache add \
ca-certificates \
git \
make

ENV PATH /go/bin:/usr/local/go/bin:$PATH
ENV GOPATH /go

RUN go get github.com/quay/clair/cmd/clair || true

ENV CLAIR_VERSION v2.1.4

WORKDIR /go/src/github.com/quay/clair

RUN git checkout "${CLAIR_VERSION}"

RUN go install ./cmd/clair

FROM alpine:latest

RUN apk --no-cache add \
ca-certificates \
git \
rpm \
xz

COPY --from=builder /go/bin/clair /usr/bin/clair

ENTRYPOINT [ "clair" ]

요약

이 Dockerfile을 통해 Clair 실행 파일의 컴파일과 최소한의 이미지 구축을 완료했습니다. 다음 명령을 사용하여 이미지를 빌드할 수 있습니다:

docker build -t myclair:latest .

빌드가 완료되면, 이 이미지를 사용하여 컨테이너 스캐닝을 위한 Clair 서비스를 시작할 수 있습니다. Clair는 주로 컨테이너 환경에서 사용되며, 정적 분석을 통해 알려진 취약점을 감지함으로써 동적 런타임 스캐닝을 보완하고, 컨테이너 애플리케이션의 보안을 종합적으로 강화합니다.

참고 문헌

clair