๐๏ธ GH ๋ฌธ์ ๊ฐ ์๋ Docker ์ด๋ฏธ์ง ๋ณด์ ์ค์บ ์๋ํ
โ๏ธ ์ปจํ ์คํธ
Docker ์ด๋ฏธ์ง ๋ณด์์ ๊ณ์ํด์ ์ฆ๊ฐํ๋ ์ถ์ธ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ถ์ธ ์ด์์ผ๋ก ์ด๋ฏธ์ง ๋ณด์์ ๋ํ ์ ์ ํ ํ์ดํ๋ผ์ธ์ ๋ฌ์ฑํ์ง ๋ชปํ๋ฉด ์ฌ์์ ์ด๋ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ค์ ์ ๋ต์ ์ฑํํ์ต๋๋ค.
์ข ์์ฑ ๊ด๋ฆฌ๋ DependaBot ๋๋ถ์ ๊ด๋ฆฌ๋๋ฉฐ ๊ฑฐ์ "์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ"ํฉ๋๋ค.
๋์ปค ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ๋ ๋ง์ ์์ ์ด ์์ต๋๋ค.
๐ ์ด ์งง์ ๊ฒ์๋ฌผ์์๋ ๋ฆฌํฌ์งํ ๋ฆฌ ์ค์ฌ ๋ฐ CI ๊ธฐ๋ฐ์ ํจ์จ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๐ ๊ตฌํ
๋์ปค ์ด๋ฏธ์ง ์ค์บ์ ๊ฒฝ์ฐ Container Scan (GitHub Action)์์ ์ ์ง ๊ด๋ฆฌํ๋ Anchore์ ์ฌ์ฉํฉ๋๋ค.
Then we wrapped some CI around it so we can monitor security as part of our daily activities.
โฐ ์ค์บ ์์ฝ
๋จผ์ ์์ฝ๋ ์ค์บ์ด ์์ต๋๋ค. ์ฝ๋ ์๋์์
latest
ํ๊ทธ๋ฅผ ์ค์บํฉ๋๋ค.name: ๐ก๏ธ Scan Docker image latest ๐ณ
on:
schedule: ## Schedule the job to run at a particular time.
- cron: '0 1 * * 1' ## every monday at 1:00AM
๐ฅ ์ฌ๊ฐ๋ ์ปท์คํ ์ฌ์ฉ
๋ค์์ผ๋ก ์ค์ํ ์ทจ์ฝ์ ์ด ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ ์์ฝ๋ ์์ ์ด ์คํจํด์ผ ํฉ๋๋ค.
์๋
severity-cutoff
๊ตฌํ ์ฐพ๊ธฐ:jobs:
scan:
name: ๐ก๏ธ Scan image latest
runs-on: ubuntu-latest
steps:
- uses: anchore/scan-action@v3
id: scan
with:
image: optnc/domaine-nc-api:latest
fail-build: true
severity-cutoff: critical
๐ซ ๋ฌธ์ ์์ฑ(๋๋ ์ ๋ฐ์ดํธ)
๋ค์์ผ๋ก ์ค์บ ์์ ์คํจ ์ ๋ฌธ์ ๋ฅผ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค(
critical
๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋์์์ ์๋ฏธ).์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ์ ์ ํ๊ฒ ํ๊ทธ๊ฐ ์ง์ ๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ์ ์ผ์ ์ ๋ฌด์ ์ผ๋ถ๋ก ๊ด๋ฆฌํ๊ณ ๋ณด๊ณ ์๋ฅผ ์์ฑํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋:
security
, docker-scan'
์๋ ์ฝ๋๋ฅผ ์ฐพ์ผ์ญ์์ค.
- name: Create/Update an issue of vulnerabilities ๐ก๏ธ that have been detected
if: ${{ failure() }}
uses: actions/github-script@v6
with:
debug: true
script: |
const { owner, repo } = context.repo;
const labels = ['security', 'docker-scan', 'Alert : Docker image scan'];
// rรฉcupรฉration de l'id de la derniรจre issue (si existante)
const existingIssue = (await github.paginate(github.rest.issues.listForRepo.endpoint.merge({
owner, repo, state: 'open',labels
}))).filter(i => i.title.indexOf('Docker image security scan') !== -1)[0];
// crรฉation ou modification de l'issue
const body = `Workflow failed for commit ${{github.sha}}.
Following vulnerabilities have been detected :
\`\`\`
${{ steps.scan_report.outputs.report }}
\`\`\`
`;
if (existingIssue) {
github.rest.issues.update({ owner, repo, issue_number: existingIssue.number, body });
} else {
github.rest.issues.create({
owner, repo,
title : '๐ก๏ธ Docker image security scan failed ๐ก๏ธ',
body,
labels
});
}
๐ฎ ๊นจ๋ํ ๋ฌธ์ ๋ฅผ ์ฆ๊ธฐ์ญ์์ค
๊ทธ๋ฐ ๋ค์ CI์์ ๋งค์ฐ ์ ์ฉํ ๋ฌธ์ ๋ฅผ ์ป์ ์ ์๋๋ก ์ค์ ๋์์ต๋๋ค.
๐ ๋ณด๋์ค
๋ฌธ์ ๊ฐ ์ปค๋ฐ๊ณผ ๊ด๋ จ๋์ด ์๋ค๋ ์ฌ์ค์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ญ์์ค. ์ด๋ ๋ณด์ ๊ฒฐํจ์ด ๋์ ๋ ๋ฐฉ์์ ์ถ์ ํ๋ ๋ฐ ์ ๋ง ์ ์ฉํฉ๋๋ค.
๐ ๋ฆฌ์์ค
Anchore Container Scan
on GitHub marketplaceAnchore Container Scan
sourcecode on GitHub ๐ anchore/grype๋ฅผ ์ฌ์ฉํ์ฌ Java-8 ๋์ปค ์ด๋ฏธ์ง ๋ฒค์น(๋ฐ ์ ํ)
opt-nc์ ๋ํ adriens ใป 4์ 25์ผ ใป 4๋ถ ์ฝ๊ธฐ
#docker
#security
#devsecops
#infosec
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐๏ธ GH ๋ฌธ์ ๊ฐ ์๋ Docker ์ด๋ฏธ์ง ๋ณด์ ์ค์บ ์๋ํ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/optnc/docker-image-security-scan-automation-with-gh-issues-2h0pํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค