CI/CD 워크플로에서 취약한 컨테이너 이미지 식별

이 페이지에서는 GitHub 워크플로의 일부로 Azure Container Registry 기반 컨테이너 이미지가 빌드될 때 통합된 취약성 검사기를 사용하여 해당 이미지를 검사하는 방법을 설명합니다.

스캐너를 설정하려면 컨테이너용 Microsoft Defender 및 CI/CD 통합을 사용하도록 설정해야 합니다. CI/CD 워크플로가 레지스트리에 이미지를 푸시하면 레지스트리 검사 결과와 CI/CD 검사 결과의 요약을 볼 수 있습니다.

CI/CD 검사의 결과는 Qualys의 기존 레지스트리 검사 결과를 보강한 결과입니다. 클라우드용 Defender의 CI/CD 검사는 Aqua Trivy를 기반으로 합니다.

GitHub 워크플로와 GitHub 실행 URL과 같은 추적 가능성 정보를 통해 취약한 이미지를 생성하는 워크플로를 식별할 수 있습니다.

레지스트리 검사에서 식별된 취약성은 CI/CD 검사의 결과와 다를 수 있습니다. 이러한 차이가 발생하는 이유 중 하나는 레지스트리 검사가 연속적인 반면, CI/CD 검사는 워크플로가 이미지를 레지스트리에 푸시하기 직전에 실행되기 때문입니다.

가용성

양상 세부 정보
릴리스 상태: 이러한 CI/CD 통합은 현재 미리 보기 상태입니다.
비프로덕션 워크플로에서만 실험하는 것이 좋습니다.
Azure Preview 추가 약관에는 베타, 미리 보기 또는 아직 일반 공급으로 릴리스되지 않은 Azure 기능에 적용되는 추가 법률 용어가 포함되어 있습니다.
가격 책정: 컨테이너 레지스트리용 Microsoft Defender가격 책정 페이지에 표시된 대로 요금이 청구됩니다.
클라우드: 상용 클라우드
국가(Azure Government, Azure 중국 21Vianet)

사전 요구 사항

CI/CD 워크플로가 레지스트리에 이미지를 푸시할 때 이미지를 검사하려면 구독에서 사용하도록 설정된 컨테이너용 Microsoft Defender 레지스트리가 있어야 합니다.

CI/CD 워크플로의 취약성 검사 설정

GitHub 워크플로에서 이미지의 취약성 검사를 사용하도록 설정하려면 다음을 수행합니다.

1단계. 클라우드용 Defender에서 CI/CD 통합 사용하도록 설정

2단계. GitHub 워크플로에 필요한 줄 추가

1단계. 클라우드용 Defender에서 CI/CD 통합 사용하도록 설정

  1. Defender for Cloud 메뉴에서 환경 설정을 엽니다.

  2. 관련 구독을 선택합니다.

  3. 해당 구독에 대한 설정 페이지의 사이드바에서 통합을 선택합니다.

  4. 창이 나타나면 워크플로에서 CI/CD 검색 결과를 푸시할 Application Insights 계정을 선택합니다.

  5. 인증 토큰과 연결 문자열을 GitHub 워크플로에 복사합니다.

    GitHub 워크플로에서 컨테이너 이미지의 취약성 검사에 대한 CI/CD 통합 사용 설정.

    중요

    인증 토큰과 연결 문자열은 수집된 보안 원격 분석과 구독의 리소스를 상호 연결하는 데 사용됩니다. 이러한 매개 변수에 잘못된 값을 사용하는 경우 원격 분석이 중단됩니다.

2단계. GitHub 워크플로에 필요한 행을 추가하고 검사를 수행합니다.

  1. GitHub 워크플로에서 다음과 같이 CI/CD 검사를 사용하도록 설정합니다.

    아래와 같이 YAML 파일에서 참조할 수 있도록 리포지토리에 두 개의 비밀을 만드는 것이 좋습니다. 자신만의 명명 규칙에 따라 비밀의 이름을 지정할 수 있습니다. 이 예시에서는 비밀이 AZ_APPINSIGHTS_CONNECTION_STRINGAZ_SUBSCRIPTION_TOKEN으로 참조됩니다.

    중요

    레지스트리에 대한 푸시는 결과가 게시되기 전에 발생해야 합니다.

    - name: Build and Tag Image
      run: |
        echo "github.sha=$GITHUB_SHA"
        docker build -t githubdemo1.azurecr.io/k8sdemo:${{ github.sha }} .
    
    - uses: Azure/container-scan@v0 
      name: Scan image for vulnerabilities
      id: container-scan
      continue-on-error: true
      with:
        image-name: githubdemo1.azurecr.io/k8sdemo:${{ github.sha }} 
    
    - name: Push Docker image 
      run: |
        docker push githubdemo1.azurecr.io/k8sdemo:${{ github.sha }}
    
    - name: Post logs to appinsights
      uses: Azure/publish-security-assessments@v0
      with: 
        scan-results-path: ${{ steps.container-scan.outputs.scan-report-path }}
        connection-string: ${{ secrets.AZ_APPINSIGHTS_CONNECTION_STRING }}
        subscription-token: ${{ secrets.AZ_SUBSCRIPTION_TOKEN }} 
    
  2. 선택한 컨테이너 레지스트리에 이미지를 푸시할 워크플로를 실행합니다. 이미지가 레지스트리에 푸시되면 레지스트리 검사가 실행되고 클라우드용 Microsoft Defender 내에서 레지스트리 검사 결과와 함께 CI/CD 검사 결과를 볼 수 있습니다. 위의 YAML 파일을 실행하면 빌드 시스템에 Aqua Security의 Trivy 인스턴스가 설치됩니다. Trivy는 Apache 2.0 라이선스에 따라 라이선스가 부여되었으며 데이터 피드에 종속되어 있고 이러한 데이터 피드에는 자체 사용 약관이 포함되어 있습니다.

  3. CI/CD 검사 결과를 확인합니다.

CI/CD 검사 결과 확인

  1. 결과를 보려면 권장 사항 페이지를 엽니다. 문제가 발견되면 컨테이너 레지스트리 이미지에서 취약성 결과를 해결해야 함(Qualys 제공) 권장 사항이 표시됩니다.

    문제를 수정하기 위한 권장 사항.

  2. 권장 사항을 선택합니다.

    추가 정보를 포함하는 권장 사항 세부 정보 페이지가 열립니다. 이 정보에는 취약한 이미지를 포함하는 레지스트리 목록(‘영향을 받는 리소스’)과 수정 문제 해결 단계가 포함됩니다.

  3. 영향을 받는 리소스 목록을 열고 비정상 레지스트리를 선택하여 취약한 이미지를 포함하는 레지스트리 내 리포지토리를 확인합니다.

    비정상 레지스트리 선택.

    영향을 받는 리포지토리 목록과 함께 레지스트리 세부 정보 페이지가 열립니다.

  4. 특정 리포지토리를 선택하여 취약한 이미지가 있는 리포지토리를 확인합니다.

    비정상 리포지토리 선택.

    리포지토리 세부 정보가 열립니다. 결과의 심각도 평가와 함께 취약한 이미지가 나열됩니다.

  5. 취약성을 확인할 이미지를 선택합니다.

    비정상 이미지 선택.

    선택한 이미지에 대한 결과 목록이 열립니다.

    이미지 검사 결과.

  6. 취약한 이미지를 푸시하는 GitHub 워크플로에 대한 자세한 내용을 보려면 해당 정보 버블을 선택합니다.

    특정 GitHub 분기 및 커밋에 대한 CI/CD 결과.

다음 단계

클라우드용 Microsoft Defender의 고급 보호 계획에 관해 자세히 알아봅니다.