GitHub Actions+Trivy를 통한 DevSecOps 구현
배치 시 빈틈을 검사하는 방법은 여기 글에 적혀 있지만 운용 단계에 들어간 안전 대책은 적혀 있지 않다.차라리 긴 운용 단계에서 취약성이 더 많이 발견될 수 있으므로 정기적으로 점검해야 한다.하지만 정기 검사는 번거롭고 원가가 높다.
따라서 GitHub Actions과Trivy를 사용하여 취약성 스캐닝을 쉽게 정기적으로 하는 방법을 소개해 드리겠습니다.스캔만 하면 운용할 때 힘들기 때문에 취약성이 발견되면 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.html
의Security Alert
는 Issue의 제목이며, trivy의 스캔 결과는 설명란에 기재되어 있으며, hub
명령의 -l
옵션에 security
라벨이 첨부되어 있습니다.GITHUB_TOKEN
과GITHUB_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_NAME
과GITHUB_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
와 유료 도구가 풍부하기 때문에 다방면으로 취약성 검사를 하는 사람도 있겠지.
Reference
이 문제에 관하여(GitHub Actions+Trivy를 통한 DevSecOps 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/homines22/items/7aa3cb0a16e56e41ca38
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
on:
schedule:
- cron: '0 0 * * 1'
- 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: 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: 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 }}
Reference
이 문제에 관하여(GitHub Actions+Trivy를 통한 DevSecOps 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/homines22/items/7aa3cb0a16e56e41ca38텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)