trivy를 이용한 파이프라인 관련 글을 찾다가, 이 글을 보고 나도 구성 해보고싶어졌다.
현재 맡고있는 프로젝트에서는 CI는 github action으로 image가 만들어지고, ecr로 업로드가 된다.
보안팀이었다면 CI 파이프라인에 개입해서 취약점이 발견되었을때 ecr에 업로드가 되지 않게 하거나 ecr에 업로드 전에 slack/mail alert를 발생시켰을텐데, 나서기 애매한 상황이라 다음과 같이 구성했다.
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: ''