github action, trivy로 image 점검 자동화

Glen·2024년 7월 5일
0

trivy를 이용한 파이프라인 관련 글을 찾다가, 이 을 보고 나도 구성 해보고싶어졌다.

현재 맡고있는 프로젝트에서는 CI는 github action으로 image가 만들어지고, ecr로 업로드가 된다.

보안팀이었다면 CI 파이프라인에 개입해서 취약점이 발견되었을때 ecr에 업로드가 되지 않게 하거나 ecr에 업로드 전에 slack/mail alert를 발생시켰을텐데, 나서기 애매한 상황이라 다음과 같이 구성했다.

  1. ecr의 이미지 업로드가 된 후 helm chart의 image tag가 수정됨.
    • ci의 마지막 단계
  2. 이때 helm repository의 action이 동작
  3. branch 값 가져옴.
    • branch 이름이 서비스명
  4. image tag 찾음
  5. ecr에서 해당 image 다운로드해서 trivy 점검
  6. issue에 결과 업로드
    • github 라이선스가 낮아서 security tab으로 결과를 못넘김 ㅠㅠ

Action

name: check image
on:
  push:
    branches:
    - stg/*

jobs:
  build:
    name: trivy
    runs-on: ubuntu-20.04
    steps:
      - name: check branch
        run: |
          # github.ref_name 값 가져오기
          REF_TYPE=${{ github.ref_name }}
          # "/" 기준으로 split
          IFS='/' read -ra REF_TYPE_ARRAY <<< "$REF_TYPE"
          # 2번째 인덱스의 값을 가져오기
          echo "SERVICE_NAME=${REF_TYPE_ARRAY[1]}" >> $GITHUB_ENV
          
          echo "service name : $SERVICE_NAME"
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Check yaml image tag
        run: |
          echo "IMAGE_TAG=$(yq e '.replicaset.containers[].image.tag' "${{ env.SERVICE_NAME }}/values.yaml")" >> $GITHUB_ENV
          echo "Image tag : $IMAGE_TAG"
        
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: '${{ secrets.DOCKER_LOGIN_SERVER }}/${{ env.SERVICE_NAME }}:${{ env.IMAGE_TAG }}'
          format: 'json'
          # exit-code: '1'
          output: "result.json"
          ignore-unfixed: true
          vuln-type: 'os,library'
          severity: 'CRITICAL,HIGH'
        env:
          TRIVY_USERNAME: ${{ secrets.DOCKER_USER_NAME }}
          TRIVY_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
      
      - uses: CemitDigital/trivy-report-issue-action@v1.1
        with:
          # Token passed by GitHub actions, required for access to GitHub issues
          token: ${{ secrets.github_TOKEN }}

          # File with scan results
          input-filename: "result.json"

          # Label name
          # Default: vulnerability (this label must be created in advance)
          label: 'vulnerability'

          # Assignees, comma separated
          # Default: ''
          # Example: 'monalisa,hubot'
          assignee: ''

          # If set the new issues will be assigned to the specified project
          # Default: ''
          project-id: ''

Result

  • 취약점이 나온만큼 등록됨
profile
어제보다 나은 엔지니어가 되기 위해서 공부중

0개의 댓글