- ๋ณด์ ๋จ๊ณ๋ ๊ฐ๋ฐ ๋จ๊ณ์์ ์ด๋ฃจ์ด์ง๋ค.
์ ์ ์ฝ๋ ๋ถ์: Jacoco์ Sonarqube๊ฐ ์ ์ ์ฝ๋ ๋ถ์์ ํด๋นํ๋ค. (์ฝ๋ ์์ฑ ๋ ๋ณด์ ์์ ํ์ธ)์ข ์์ฑ ํ์ธ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ข ์์ฑ์ ๋ณด์ ์ํฅ์ด ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํ๊ณ , ํ๋ก์ ํธ ๋ณ ์ข ์์ฑ์ ์๋ณํ๊ณ ์๋ ค์ง ๋ณด์ ์ทจ์ฝ์ ์ด ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํ๋ค.์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ค์บ: ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋น๋ ์ ๋ณด์ ์ทจ์ฝ์ ์ ์ค์บ๋ ํ๋ค. (clair)
- ์ปจํ ์ด๋์ ์ทจ์ฝ์ ์ ๋ํ ์ ์ ๋ถ์์ ์ํ ์คํ ์์ค ํ๋ก์ ํธ
- ํด๋ผ์ด์ธํธ๋ clair api๋ฅผ ์ฌ์ฉํด์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์์ธํํ ๋ค์ ์๋ ค์ง ์ทจ์ฝ์ ๊ณผ ๋์กฐํ ์ ์๋ค.
- ์ปจํ ์ด๋ ๊ธฐ๋ฐ ์ธํ๋ผ์ ๋ณด์์ ๋ณด๋ค ํฌ๋ช ํ๊ฒ ๋ณผ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
์์ธํ๋ฅผ ํ๋ฉด ์ด๋ฏธ์ง์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ด ๋ง๋ค์ด์ง๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ค. ํด๋ผ์ด์ธํธ๋ clair์ api๋ฅผ ์ฌ์ฉํ์ฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํน์ ์ด๋ฏธ์ง์ ์ทจ์ฝ์ ์ ์ฟผ๋ฆฌํ๋ค. ๊ฐ ์์ฒญ์ ๋ํด ์ทจ์ฝ์ ๊ณผ ๊ธฐ๋ฅ์ ์๊ด๊ด๊ณ๋ฅผ ํ์ ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ค์ ์ค์บํ ํ์๊ฐ ์๋ค. ์ทจ์ฝ์ ๋ฉํ๋ฐ์ดํฐ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ฉด, ์์คํ ์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ์์ ์๋ฆฌ๋ ์๋์ ๋ณด๋ผ ์ ์๋ค.
-
ClairCore: ์ปจํ ์ธ ๊ฒ์ฌ, ์ทจ์ฝ์ ๋ณด๊ณ ๋ฅผ ํ๊ธฐ ์ํ ์์ง- ๋์ ์์ค์ claircore ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ํ clair ์๋น์ค wrapper๋ฅผ ์ ๊ณตํ ์ ์๋ค.
- ์ทจ์ฝ์ฑ ์์ค์ ๋ ์ด์ด ์ธ๋ฑ์ค์ ๊ด๋ จ๋ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์ claircore๋ฅผ ํตํด ์ ์ฉ์ด ๋๋ค.
Updaters :rest api ์๋ฒ๋ฅผ ํตํด ์ทจ์ฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฐ์ดํธ๋ฅผ ๋ด๋นํ๋ค.
clair core๋ก ํ ์ ์๋ ๊ฒ :
- Updaters์ ๋ฐ์ดํฐ ์์ค ๋ชฉ๋ก์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ ๊ตฌํํ ์ ์๋ค.
- ์ทจ์ฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ ๋ฐ ์ ๋ฐ์ดํธ ๋ ๋์ปค ์ด๋ฏธ์ง ๋ ์ด์ด ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํํ ์ ์๋ค.
๋งค๋ํ์คํธ๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ๋ํ ํด๋ ์ด ๋ช ์ธ ๋ด์ฉ์ด๋ค. ํด๋ ์ด๋ OCI ๋งค๋ํ์คํธ ๋ฐ ๋ ์ด์ด๊ฐ ์ค๋ณต ์์ ์ ์ค์ด๊ธฐ ์ํด ์ปจํ ์ธ ์ฃผ์๋ฅผ ์ง์ ํ๋ค๋ ๊ธฐ๋ฅ์ ํ์ฉํ๋ค. ๋งค๋ํ์คํธ๊ฐ ์ธ๋ฑ์ฑ๋๋ฉด ๋์ค์ ๊ฒ์ํ ์ ์๋๋ก ์ธ๋ฑ์ค ๋ ํฌํธ๊ฐ ์ ์ง๋๋ค.
-
์ธ๋ฑ์ฑ ๋ถ๋ถ : ๋งค๋ํ์คํธ๋ฅผ ํด๋ ์ด์ ์ ๋ฌํ๋ ๊ฒ์ผ๋ก ์์๋๋ค.
- ์ธ๋ฑ์ฑ์ ์์ ๋ฐ์ผ๋ฉด ํด๋ ์ด๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ๋ ์ด์ด ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ ํด๋น ์ปจํ ์ธ ๋ฅผ ์ค์บํ ๋ค์ ์ธ๋ฑ์ค ๋ ํฌํธ๋ผ๋ ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
-
๋งค์นญ ๋ถ๋ถ : ์ธ๋ฑ์ค ๋ ํฌํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋ ํฌํธ๊ฐ ๋ํ๋ด๋ ๋งค๋ํ์คํธ์ ์ํฅ์ ๋ฏธ์น๋ ๊ด๋ จ ์ทจ์ฝ์ ์ ์ฐ๊ฒฐํ๋ค.
ํด๋ ์ด๋ ์ง์์ ์ผ๋ก ์๋ก์ด ๋ณด์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์์ผ๋ฉฐ, ๋งค์นญ์๋ฒ์ ๋ํ ์์ฒญ์ ํตํด ํญ์ ์ธ๋ฑ์ค ๋ ํฌํธ์ ์ต์ ์ทจ์ฝ์ ์ ๋ถ์ํ๊ณ ์ ๊ณตํ๋ค.
-
์๋ฆผ ๋ถ๋ถ : ํด๋ ์ด๋ ๋ ธํฐํผ์ผ์ด์ ์ ํตํด ์๋ ์๋น์ค๋ฅผ ๊ตฌํํ๋ค. ์๋ก์ด ์ทจ์ฝ์ ์ด ๋ฐ๊ฒฌ๋๋ฉด ์๋ ์๋น์ค๋ ์ด๋ฌํ ์ทจ์ฝ์ ์ด ์ธ๋ฑ์ฑ๋ ๋งค๋ํ์คํธ์ ์ํฅ์ ๋ฏธ์น๋์ง ํ์ธํ๋ค. ๊ด๋ฆฌ์๋ ์๋์ ํตํด ๊ตฌ์ฑ์ ๋ฐ๋ผ ์กฐ์น๋ฅผ ์ทจํ ์ ์๋ค.
-
ํน์ ์ด๋ฏธ์ง ๋ ํฌ์งํ ๋ฆฌ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๊ฐ ์์ด์ผ ์ ๊ทผํด์ ๋ถ์ ์ํ ๊ฐ๋ฅ
- ํน์ ๋ ํฌ์งํ ๋ฆฌ์ ์ด๋ฏธ์ง๋ฅผ ์ ํํด์ ๋ก์ปฌ์์ ํน์, ํด๋ ์ด ์๋ฒ๋ฅผ ํตํด ํด๋น ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ๋ค.
-
๋ ์ง์คํธ๋ฆฌ์ ์๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด์ ํด๋น ๋ ์ด์ด์ http url์ ํตํด ๋ ์ด์ด์ tar๋ฅผ ๊ฐ์ ธ์ ๋ถ์ํ๋ค.
-
์์ ๋ถ์ํ ์ด๋ฏธ์ง ๋ ์ด์ด ์ธ์ ๋ค๋ฅธ ๋ ์ด์ด๋ฅผ ๋ถ์ํ๊ธฐ ์ํด ๋ค๋ฅธ api ์๋ํฌ์ธํธ๋ฅผ ํตํด์ tar ํ์ผ์ ์ป๋๋ค. ์ด๋ฌํ api ํธ์ถ๋ฐฉ์์ ๋ฐ๋ผ ํด๋ ์ด๊ฐ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๊ฐ์ ์ด๋ฏธ์ง ๋ ์ด์ด๋ณ๋ก ์ํํ ์ ์๋ค.
-
ํด๋ ์ด์๊ฒ ํ๋๋ก ํตํฉ๋ ์ค์บ ๊ฐ๋ฅํ ๋ ์ด์ด๋ก ๊ตฌ์ฑ๋ ๋์ปค์ด๋ฏธ์ง๋ฅผ ํตํฉ์ ์ผ๋ก ๋ถ์ํ ์ ์๋๋ก ์งํํ ์ ์๋ค. ์ด๋ฅผ ์ํด ๋ช๊ฐ์ง ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ ์ ์์ฑํ์ฌ api๋ฅผ ํตํด http ํธ์คํธ ๋ฐฉ์์ผ๋ก ํธ์ถํด ํด๋ ์ด๊ฐ ๋ถ์ํ ๊ฒฐ๊ณผ๊ฐ๋ค์ ์ทจํฉํ์ฌ json ํ์์ผ๋ก ๋ฆฌํด์ ๋ฐ์์ฌ ์ ์๋ค.
clairctl๋ฅผ ํตํด ๊ฐํธํ๊ฒ ์ค์บ ๊ฐ๋ฅ
# clair DB, clair ์๋ฒ ์ปจํ
์ด๋ ์คํ
docker run -p 5432:5432 -d --name db arminc/clair-db:latest
docker run -p 6060:6060 --link db:postgres -d --name clair arminc/clair-local-scan:latest
# clair-scanner ์ค์น (clair ๋ณด์ ์ทจ์ฝ์ ์ค์บ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด clairctl์ด๋ผ๋ cli ๋ฐ์ด๋๋ฆฌ ํด ์ฌ์ฉ)
wget https://github.com/arminc/clair-scanner/releases/download/v12/clair-scanner_linux_amd64
chmod +x clair-scanner_linux_amd64; sudo mv clair-scanner_linux_amd64 /usr/local/bin/clair-scanner- Clair ๋ณด์ ์ค์ ๋ฐ Docker ๋น๋ ์ค์บ ์ํ
- Clair-scanner ๊ธฐ๋ณธ ๋ณด์ ์ค์ ์ ์ํ ์ต์ ํ์ธ
- Jenkins์์ ๋ง์ด ์ฌ์ฉํ๋ Docker ์ด๋ฏธ์ง ์ค์บ ๋ฐ ๊ฒฐ๊ณผ ํ์ธ (Gradle, AWS-CLI)
- Gradle-Jib ์์ Docker ์ด๋ฏธ์ง ๋น๋ ์ค์บ ๋ฐ ๊ฒฐ๊ณผ ํ์ธ (spring boot)
# Clair ์คํ ์๋ฒ Private IP ํ์ธ
export IP=$(ip r | tail -n1 | awk '{ print $9 }'); echo ${IP}
# Gradle, AWS-CLI Docker ์ด๋ฏธ์ง ์ค์บ ๋ฐ ๊ฒฐ๊ณผ ํ์ธ ๋ช
๋ น์ด
clair-scanner --ip ${IP} --clair=http://localhost:6060 --log="clair.log" --report="gradle_report.txt" gradle:jdk11
clair-scanner --ip ${IP} --clair=http://localhost:6060 --log="clair.log" --report="aws-cli_report.txt" bitnami/aws-cli:latest
# Spring Boot ์น ์ ํ๋ฆฌ์ผ์ด์
Docker ์ด๋ฏธ์ง ๋น๋ ๋ณด์ ์ค์บ ๋ช
๋ น์ด
clair-scanner --ip ${IP} --clair=http://localhost:6060 --log="clair.log" --report="spring-boot-web_report.txt" <์์ Docker ์ด๋ฏธ์ง๋ช
>๋ณด์ ์ค์บ ํ ์คํธ ์ฉ
docker pull gradle:jdk11
docker pull bitnami/aws-cli:latest