이미지에 Docker Hardened Image 정책 적용하기

이미지에 Docker Hardened Image 정책 적용하기

Docker가 DHI 빌드 기준으로 삼는 보안·컴플라이언스 정책을 내 이미지에도 적용하고, docker scout policy로 평가하며, CI에서 강제하는 방법을 알아봐요.

출처: 문서

본문

Docker는 Docker Hardened Images(DHI)가 충족하도록 빌드되는 보안·컴플라이언스 정책의 집합을 게시해서, 자체 이미지를 동일한 기준으로 평가할 수 있게 해줘요. 이미지를 이 정책들에 대해 docker scout policy 명령으로 평가해요.

이 정책들은 non-root 사용자로 실행되는 것, 수정 가능한 critical·high 취약점이 없는 것, 내장된 악성코드나 시크릿이 없는 것, 서명된 공급망 attestation을 포함하는 것 같은 요구사항을 인코딩해요. 이미지가 DHI인지 또는 DHI 베이스 이미지 위에 빌드되었는지는 검증하지 않아요. 이미지가 DHI가 유지되는 것과 동일한 기준을 충족하는지만 확인해요.

내장된 Docker Scout 정책과 달리 DHI 정책은 CLI에 포함되지 않아요. docker-hardened-images/policies 저장소에서 Rego 소스로 유지되며 dhi/policies에서 OCI 정책 번들로 게시돼요. --policy-bundle 플래그로 평가 시 번들을 풀하므로, 데이터를 Docker Scout 서비스로 보내지 않고도 DHI 표준을 로컬, CI, 또는 둘 다에 적용할 수 있어요.

DHI 번들의 정책

dhi/policies 번들은 다음 정책을 포함해요.

정책 정책 이름 확인 내용
non-dev 이미지에 기본 root 사용자 없음 dhi-default-non-root-user 이미지가 non-root 사용자로 실행되도록 구성됨.
해결 SLA를 넘긴 수정 가능 취약점 없음 fixable-vulnerabilities 해결 SLA(critical·high는 7일, 그 외는 30일)를 넘겨 수정 가능한 CVE가 남아 있지 않음.
고위험 취약점 없음 high-profile-vulnerabilities 잘 알려진 CVE의 큐레이트 목록이 없음. 선택적으로 CISA KEV 카탈로그 포함.
내장 악성코드 없음 dhi-no-embedded-malware 악성코드 스캔 attestation이 존재하고 통과함.
내장 시크릿 없음 dhi-no-embedded-secrets 시크릿 스캔 attestation이 존재하고 통과함.
실패하는 테스트 없음 dhi-no-failing-tests 테스트 attestation이 존재하고 통과함.
서명된 공급망 attestation dhi-signed-supply-chain-attestations SBOM과 provenance attestation이 첨부·서명됨.
의도하지 않은 셸 또는 패키지 매니저 dhi-unintentional-shell-or-package-manager 이미지에 선언되지 않은 셸이나 패키지 매니저가 없음.
STIG 스캔 dhi-stig-scan-score FIPS 준수 이미지의 경우 STIG 스캔이 요구 점수를 충족함.

정책 이름(Policy name) 은 --policy-config 파일에서 정책을 활성화·비활성화·조정하기 위해 참조하는 안정적인 ID예요.

각 정책의 권위 있는 목록과 Rego 소스는 docker-hardened-images/policies 저장소를 봐요.

사전 요구사항(Prerequisites)

  • Docker Scout CLI 플러그인. Docker Desktop에 포함돼요.

  • Docker Hub에서 dhi/policies 번들을 풀할 수 있는 접근. 인증은 기존 Docker 레지스트리 자격 증명을 사용하므로 먼저 로그인해요.

    $ docker login
    

DHI 정책에 대해 이미지 평가하기

DHI 정책 번들에 대해 이미지를 평가하려면 --policy-bundle 플래그와 함께 번들 참조를 docker scout policy에 전달해요.

$ docker scout policy <image> --policy-bundle dhi/policies:latest

CLI는 번들을 풀하고, 이미지를 SBOM으로 인덱싱하며, CVE와 VEX 데이터로 강화하고, 그 데이터에 대해 번들의 각 정책을 평가해요. 번들은 digest로 캐시되므로 동일한 번들에 대해 다시 실행해도 다시 다운로드되지 않아요.

예시: DHI 기반 이미지 빌드 및 평가

다음 예시는 DHI 베이스 이미지에서 이미지를 빌드하고 DHI 정책 번들에 대해 평가해요.

1단계: Dockerfile에서 DHI 베이스 이미지 사용

DHI 카탈로그의 Docker Hardened Image를 베이스로 사용하는 Dockerfile을 만들어요. 예를 들면:

# Dockerfile
FROM dhi.io/python:3.13

ENTRYPOINT ["python", "-c", "print('Hello from a DHI-based image')"]

2단계: 이미지 빌드

터미널을 열고 Dockerfile이 있는 디렉터리로 이동해요. 그런 다음 이미지를 빌드하고 로컬 이미지 저장소에 로드해요.

$ docker build --load -t my-dhi-app:v1 .

3단계: DHI 정책에 대해 이미지 평가

로그인하고 로컬 이미지를 DHI 정책 번들에 대해 평가해요.

$ docker login
$ docker scout policy my-dhi-app:v1 \
  --policy-bundle dhi/policies:latest

명령은 번들의 각 정책에 대한 컴플라이언스 결과와 함께 위반 사항의 세부 정보를 출력해요.

DHI 정책 커스터마이즈하기

--policy-config 파일로 어떤 정책이 실행되고 그 임계값을 조정할 수 있어요. docker-hardened-images/policies 저장소에는 시작점으로 사용할 수 있는 예시 config.json이 포함돼요.

$ docker scout policy my-dhi-app:v1 \
  --policy-bundle dhi/policies:latest \
  --policy-config ./config.json

구성 파일은 DHI 번들의 정책에 나열된 정책 이름으로 정책을 매칭하며, 개별 정책을 비활성화하거나 설정을 조정할 수 있게 해줘요. 예를 들어 다음 구성은 STIG 스캔 정책을 비활성화하고 고위험 취약점 정책에서 CISA KEV 검사를 제외해요.

{
  "policies": [
    {
      "name": "dhi-stig-scan-score",
      "enabled": false
    },
    {
      "name": "high-profile-vulnerabilities",
      "config": {
        "include_cisa_kev": false
      }
    }
  ]
}

전체 구성 파일 형식은 Configure built-in policies를 봐요.

또한 DHI 번들을 내장된 Docker Scout 정책, 추가 번들, 또는 자체 커스텀 Rego 파일과 결합할 수 있어요. --policy-bundle, --policy-file, --policy-dir은 모두 반복할 수 있어요.

$ docker scout policy my-dhi-app:v1 \
  --policy-bundle dhi/policies:latest \
  --policy-file ./custom.rego

커스텀 정책 작성과 정책 소스 결합에 대한 자세한 내용은 Evaluate policies를 봐요.

CI에서 정책 컴플라이언스 강제하기

Docker Scout GitHub Action을 사용해 푸시할 때마다 DHI 정책을 평가하고, 이미지가 이를 충족하지 않으면 워크플로를 실패시켜요. 다음 워크플로는 이미지를 빌드한 다음 DHI 정책 번들에 대해 평가해요.

name: DHI policy check

on:
  push:

env:
  IMAGE_NAME: my-dhi-app:${{ github.sha }}

jobs:
  policy:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PAT }}

      - name: Build the image
        uses: docker/build-push-action@v6
        with:
          context: .
          load: true
          tags: ${{ env.IMAGE_NAME }}

      - name: Evaluate DHI policies
        uses: docker/[email protected]
        with:
          command: policy
          image: ${{ env.IMAGE_NAME }}
          policy-bundle: dhi/policies:latest
          exit-code: true

docker/login-action 단계는 러너가 DHI 베이스 이미지와 dhi/policies 번들을 풀할 수 있도록 Docker Hub로 인증해요. Docker Hub 사용자 이름과 개인 액세스 토큰을 DOCKER_USER와 DOCKER_PAT 저장소 시크릿으로 저장하세요.

어떤 정책도 충족되지 않으면 단계가 실패하도록 exit-code: true를 설정해요. policy-bundle 입력은 쉼표로 구분된 번들 목록을 받으며, CLI 플래그와 동일하게 policy-file, policy-dir, policy-config 입력과 결합할 수 있어요.

CI에서 정책 평가 실행에 대한 자세한 내용은 Evaluate policies를 봐요.

더 알아보기 (Learn more)