์ทจ์ฝ์ฑ ๊ด๋ฆฌ์ ์ค์ํ ๋ถ๋ถ์ ์ต์ ์์คํ ์ ๊ตฌ์ฑํ๋ ์ํํธ์จ์ด ๊ตฌ์ฑ ์์์ ๊ณต๊ธ๋ง์ ์ฒ ์ ํ๊ฒ ์ดํดํ๊ณ ๋ณดํธํ๋ ๊ฒ์ ๋๋ค. Agile ๋ฐ DevOps ํ์ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ ์๊ฐ๊ณผ ๋น์ฉ์ ์ค์ ๋๋ค. ํ์ง๋ง ์ด ๋ฉ๋ฌ์๋ ๋จ์ ๋ ์์ต๋๋ค. ์ฆ, ๋ค๋ฅธ ์ฌ๋์ ์ค์์ ์ทจ์ฝ์ฑ์ ๋ฌผ๋ ค๋ฐ์ ๊ธฐํ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ถ๋ช ํ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ค ์คํ ์์ค ๊ตฌ์ฑ ์์๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํ๊ณ , ์๋ ค์ง ์ ๋ขฐํ ์ ์๋ ๋ฒ์ ์ด ์๋ ค์ง ์ ๋ขฐํ ์ ์๋ ์์ค์์ ๋ค์ด๋ก๋๋์๋์ง ํ์ธํ๊ณ , ์๋ก ๋ฐ๊ฒฌ๋ ์ทจ์ฝ์ ์ด ํจ์น๋ ํ ์ ๋ฐ์ดํธ๋ ๋ฒ์ ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค.
์ด ๊ฒ์๋ฌผ์์๋ ์ฝ๋์์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋น๋๋ฅผ ์ค๋จํ๊ธฐ ์ํด OWASP ์ข ์์ฑ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ใ์ ์์ผ ํ๋ก์ ํธ์ ๊ฐ๋ฐ ๋ณด์ใ์ด๋ผ๋ ์ฑ ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ๋์ด ์์ต๋๋ค. OWASP ์ข ์์ฑ ๊ฒ์ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์คํ ์์ค ๊ตฌ์ฑ ์์๋ฅผ ์นดํ๋ก๊ทธํํ๊ณ ์ฌ๊ธฐ์ ํฌํจ๋ ์ทจ์ฝ์ ์ ๋ณด์ฌ์ฃผ๋ ๋ฌด๋ฃ ์ค์บ๋์ ๋๋ค. Java, .NET, Ruby(gemspec), PHP(composer), Node.js, Python์ฉ ๋ฒ์ ์ ๋ฌผ๋ก ์ผ๋ถ C/C++ ํ๋ก์ ํธ์ฉ ๋ฒ์ ๋ ์์ต๋๋ค. ์ข ์์ฑ ํ์ธ์ Ant, Maven, Gradle ๋ฑ์ ์ผ๋ฐ์ ์ธ ๋น๋ ๋๊ตฌ์ Jenkins์ ๊ฐ์ ์ง์์ ์ธ ํตํฉ ์๋ฒ์ ํตํฉ๋ฉ๋๋ค.
์ข ์์ฑ ๊ฒ์ฌ๋ NIST์ NVD(National Vulnerability Database)์์ ์๋ ค์ง ์ทจ์ฝ์ ์ด ์๋ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ณด๊ณ ํ๊ณ NVD ๋ด์ค ํผ๋์ ๋ฐ์ดํฐ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
๋คํํ ์ด ๋ชจ๋ ์์
์ OWASP ์ข
์์ฑ ๊ฒ์ฌ ํ๋ก์ ํธ์ ๊ฐ์ ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋๊ตฌ๋ ๋น๋ ํ์ดํ๋ผ์ธ์ ํฌํจ๋์ด ์คํ ์์ค ์ข ์์ฑ์ ์๋์ผ๋ก ์ธ๋ฒคํ ๋ฆฌํํ๊ณ , ์๋ ค์ง ์ทจ์ฝ์ ์ด ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค๋๋ ๋ฒ์ ์ ์๋ณํ๊ณ , ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๊ฐ์ง๋๋ฉด ๋น๋๋ฅผ ์ค๋จํ ์ ์์ต๋๋ค.
OWASP ์ข ์์ฑ ํ์ธ
์ข
์์ฑ ๊ฒ์ฌ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ํ
์คํธํ๊ณ ์์ฐํ๊ธฐ ์ํด ์ด ์ ์ฅ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
HTML ๋ณด๊ณ ์๋ฅผ ๋ณด๋ ค๋ฉด gitlab-runner์์ nginx ์น ์๋ฒ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
์ต์ nginx ๊ตฌ์ฑ์ ์:
server {
listen 9999;
listen [::]:9999;
server_name _;
root /home/gitlab-runner/builds;
location / {
autoindex on;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
์ด์ ๋ธ๋ฆฌ๊ฐ ๋๋๋ฉด ๋ค์ ๊ทธ๋ฆผ์ ๋ณผ ์ ์์ต๋๋ค.
๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ์ ์ข ์์ฑ ๊ฒ์ฌ ๋ณด๊ณ ์๋ฅผ ํ์ธํ์ธ์.
์ฒซ ๋ฒ์งธ ์คํฌ๋ฆฐ์ท์ ์์ฝ์ด ํฌํจ๋ ๋ณด๊ณ ์์ ์๋จ ๋ถ๋ถ์ ๋๋ค.
๋ ๋ฒ์งธ ์คํฌ๋ฆฐ์ท์์๋ CVE-2017-5638์ ์์ธํ ์ค๋ช ํฉ๋๋ค. ์ฌ๊ธฐ์๋ CVE ์์ค๊ณผ ์ต์คํ๋ก์ ๋งํฌ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ์คํฌ๋ฆฐ์ท์ log4j-api-2.7.jar์ ์ธ๋ถ์ ๋ณด์ ๋๋ค. CVE ์์ค์ 7.5์ 9.8์์ ์ ์ ์์ต๋๋ค.
๋ค ๋ฒ์งธ ์คํฌ๋ฆฐ์ท์ commons-fileupload-1.3.2.jar์ ์ธ๋ถ์ ๋ณด์ ๋๋ค. CVE ์์ค์ 7.5์ 9.8์์ ์ ์ ์์ต๋๋ค.
gitlab ํ์ด์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์๋ํ์ง ์์ต๋๋ค. ์คํจํ ์์ ์ ์ํฐํฉํธ๋ฅผ ์์ฑํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ ์
๋น๋ ์ถ๋ ฅ: ์ํฐํฉํธ๊ฐ ์์ต๋๋ค. HTML ๋ณด๊ณ ์๊ฐ ํ์๋์ง ์์ต๋๋ค. Artifact: Always๋ฅผ ์ฌ์ฉํด ๋ณด์ธ์.
CVE ์ทจ์ฝ์ ์์ค ๊ท์
gitlab-ci.yaml ํ์ผ์์ ๊ฐ์ฅ ์ค์ํ ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7
fallBuildOnCVSS ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ํด์ผ ํ๋ CVE ์ทจ์ฝ์ฑ ์์ค์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ธํฐ๋ท์์ NIST ์ทจ์ฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(NVD) ๋ค์ด๋ก๋
NIST๊ฐ ์ธํฐ๋ท์์ NIST ์ทจ์ฝ์ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค(NVD)๋ฅผ ์ง์์ ์ผ๋ก ๋ค์ด๋ก๋ํ๋ค๋ ์ฌ์ค์ ์๊ณ ๊ณ์ จ์ต๋๊น?
๋ค์ด๋ก๋ํ๋ ค๋ฉด ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค
์ค์นํ๊ณ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
yum -y install yum-plugin-copr
yum copr enable antonpatsev/nist_data_mirror_golang
yum -y install nist-data-mirror
systemctl start nist-data-mirror
Nist-data-mirror๋ ์์ ์ NIST JSON CVE๋ฅผ /var/www/repos/nist-data-mirror/์ ์ ๋ก๋ํ๊ณ 24์๊ฐ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
CVE JSON NIST๋ฅผ ๋ค์ด๋ก๋ํ๋ ค๋ฉด nginx ์น ์๋ฒ(์: gitlab-runner์์)๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
์ต์ nginx ๊ตฌ์ฑ์ ์:
server {
listen 12345;
listen [::]:12345;
server_name _;
root /var/www/repos/nist-data-mirror/;
location / {
autoindex on;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
mvn์ด ์คํ๋๋ ๊ณณ์ ๊ธด ์ค์ด ์๊ธฐ์ง ์๋๋ก ๋งค๊ฐ ๋ณ์๋ฅผ ๋ณ๋์ ๋ณ์ DEPENDENCY_OPTS๋ก ์ด๋ํ๊ฒ ์ต๋๋ค.
์ต์ข ์ต์ ๊ตฌ์ฑ .gitlab-ci.yml์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
variables:
MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
DEPENDENCY_OPTS: "-DfailBuildOnCVSS=7 -DcveUrlModified=http://localhost:12345/nvdcve-1.1-modified.json.gz -DcveUrlBase=http://localhost:12345/nvdcve-1.1-%d.json.gz"
cache:
paths:
- .m2/repository
verify:
stage: test
script:
- set +e
- mvn $MAVEN_CLI_OPTS install org.owasp:dependency-check-maven:check $DEPENDENCY_OPTS || EXIT_CODE=$?
- export PATH_WITHOUT_HOME=$(pwd | sed -e "s//home/gitlab-runner/builds//g")
- echo "************************* URL Dependency-check-report.html *************************"
- echo "http://$HOSTNAME:9999$PATH_WITHOUT_HOME/target/dependency-check-report.html"
- set -e
- exit ${EXIT_CODE}
tags:
- shell
์ถ์ฒ : habr.com