GitHub Actions+Trivy를 통한 DevSecOps 구현

11085 단어 GitHubDocker
운영 환경에서 실행되는 Docker 이미지의 빈틈을 정기적으로 확인하시겠습니까?
배치 시 빈틈을 검사하는 방법은 여기 글에 적혀 있지만 운용 단계에 들어간 안전 대책은 적혀 있지 않다.차라리 긴 운용 단계에서 취약성이 더 많이 발견될 수 있으므로 정기적으로 점검해야 한다.하지만 정기 검사는 번거롭고 원가가 높다.
따라서 GitHub ActionsTrivy를 사용하여 취약성 스캐닝을 쉽게 정기적으로 하는 방법을 소개해 드리겠습니다.스캔만 하면 운용할 때 힘들기 때문에 취약성이 발견되면 GitHub의 Issue를 제작합니다.이렇게 하면 모든 저장소를 관리할 수 있고 검색과 Issue를 연결시켜 검색을 통합하면 Issue도 닫을 수 있어 대응 여부를 쉽게 알 수 있다.

GitHub Actions


Schedule


정기적으로 스캔해야 하기 때문에 GitHub Actions의 schedule 기능을 사용합니다.schedule 기능이라고 하지만 그 자체는 cron.예를 들어, 매주 월요일 9시(JST)에 CI를 전환하려면 다음과 같습니다.
GitHub Actions가 UTC에서 이동합니다.
on:
  schedule:
    - cron: '0 0 * * 1'

설치에 필요한 명령


Trivy는 말할 필요도 없습니다. Issue를 만들기 위해 다음 명령을 설치하십시오.
명령
설명
Trivy
구멍 검사 명령
hub
Issue 만들기
pandoc
Trivy 검색 결과를 HTML로 설정
- name: Install commands 
  run: |
    sudo apt install apt-transport-https gnupg
    wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
    echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -cs) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
    sudo apt update
    sudo apt install --no-install-recommends trivy

    sudo snap install hub --classic

    VERSION=$(curl --silent "https://api.github.com/repos/jgm/pandoc/releases/latest" | \
                    grep '"tag_name":' | \
                    sed -E 's/.*"([^"]+)".*/\1/')
    curl -L -o pandoc.deb https://github.com/jgm/pandoc/releases/download/${VERSION}/pandoc-${VERSION}-1-amd64.deb
    sudo dpkg -i pandoc.deb

Docker 이미지 검색


Trivy 스캔 시 옵션은 참조여기.여기서 심각성을 HIGH CRITICAL로 설정하고 빈틈이 발견되면 exit코드를 1로 설정합니다.
- name: Scan Image
  run: trivy -q --severity HIGH,CRITICAL --exit-code 1 ${IMAGE_NAME} > tmp.txt

Issue 만들기


빈틈이 없으면 끝이고, 있으면 Issue에게 준다.그 전에 Issue를 쉽게 볼 수 있도록 텍스트 기반 파일을 HTML로 변환합니다.echo -e "Security Alert\n" > result.htmlSecurity Alert는 Issue의 제목이며, trivy의 스캔 결과는 설명란에 기재되어 있으며, hub 명령의 -l 옵션에 security 라벨이 첨부되어 있습니다.GITHUB_TOKENGITHUB_PASSWORD에 대해 문서에 영패만 있으면 비밀번호가 필요 없다고 적혀 있지만 인증 오류로 둘 다 적혀 있다.안의 값은 모두 같다...
- name: Create Issue
  if: failure()
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    GITHUB_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
  run: |
    pandoc tmp.txt -o tmp.html
    sed -i -e "s/<pre><code>//g" tmp.html
    sed -i -e "s/<\/code><\/pre>//g" tmp.html
    echo -e "Security Alert\n" > result.html
    cat tmp.html >> result.html
    sudo chown root:root /
    hub issue create -F result.html -l security
다음은 테스트용 CI로 달려본 결과입니다.

괜찮은 것 같아

완성형


나는 완전한 업무 흐름을 쓸 것이다.IMAGE_NAMEGITHUB_USER자신의환경에 따라변경을 하면동작을하게 된다.
name: Vulnerability scan

on:
  schedule:
    - cron: '0 0 * * 1'

env:
  IMAGE_NAME: alpine:3.10.1
  GITHUB_USER: homoluctus

jobs:
  scan:
    name: Scan images
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@master
        with:
          ref: master

      - name: Install commands
        run: |
          sudo apt install apt-transport-https gnupg
          wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
          echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -cs) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
          sudo apt update
          sudo apt install --no-install-recommends trivy
          sudo snap install hub --classic

          VERSION=$(curl --silent "https://api.github.com/repos/jgm/pandoc/releases/latest" | \
                    grep '"tag_name":' | \
                    sed -E 's/.*"([^"]+)".*/\1/')
          curl -L -o pandoc.deb https://github.com/jgm/pandoc/releases/download/${VERSION}/pandoc-${VERSION}-1-amd64.deb
          sudo dpkg -i pandoc.deb

      - name: Pull images
        run: docker pull ${IMAGE_NAME}

      - name: Scan Image
        run: trivy -q --severity HIGH,CRITICAL --exit-code 1 ${IMAGE_NAME} > tmp.txt

      - name: Create Issue
        if: failure()
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITHUB_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
        run: |
          pandoc tmp.txt -o tmp.html
          sed -i -e "s/<pre><code>//g" tmp.html
          sed -i -e "s/<\/code><\/pre>//g" tmp.html
          echo -e "Security Alert\n" > result.html
          cat tmp.html >> result.html
          sudo chown root:root /
          hub issue create -F result.html -l security

      - name: Notify Result to Slack
        uses: homoluctus/slatify@master
        if: always()
        with:
          type: ${{ job.status }}
          channel: '#general'
          job_name: ':sniper: *Vulnerability Scan*'
          url: ${{ secrets.SLACK_WEBHOOK }}
이제 정기적인 빈틈 스캐닝을 할 수 있습니다.
GitHub Actions와 각종 도구를 결합하면 DevOps/DevSecOps를 쉽게 실현할 수 있어 한번 해 볼 만하다.
여유가 있는 사람은 GitHub의dependabot, Dockerfile의 린트 스카이나dockle와 유료 도구가 풍부하기 때문에 다방면으로 취약성 검사를 하는 사람도 있겠지.

좋은 웹페이지 즐겨찾기