Proven by Intelligence
보이지 않는 안전을 인텔리전스로 증명하다.
기술 인사이트를 만나보세요.
지난 블로그에 이어 GitLab에서 CodeSonar를 연동하여 DevSecOps 기반의 CI 파이프라인 구축과 수행 후 GitLab에서 이에 대한 결과를 살펴보도록 하겠습니다.
💡 잠깐 혹시, 아래 컨텐츠를 확인하셨나요??
[CodeSonar] DevSecOps를 위한 SAST 기반 CI/CD 파이프라인 구축(1)
해당 글을 읽기 전에 내용 확인하시면 이해가 쏙쏙!

1.
워크플로우 개요
전반적인 워크플로우는 아래 그림(1)과 같습니다.

[그림 1]
로컬 PC에서 작성한 코드를 GitLab 저장소에 push하면, .gitlab-ci.yml 스크립트에 작성된 파이프라인 수행 조건(예: push, merge request 등)과 일치할 경우 GitLab에서 Runner를 통해 파이프라인 스크립트를 실행합니다.
스크립트 내에서는 CodeSonar의 분석 명령어를 통해 코드 상의 보안 취약점을 탐지하고, 그 결과를 CodeSonar HUB에 저장한 뒤, 이를 기반으로 GitLab에서 제공하는 SAST 레포트를 CodeSonar 형식에 맞춰 출력할 수 있습니다.
2.
.gitlab-ci.yml 스크립트 작성
그럼 본격적으로 CodeSonar를 연동한 스크립트 구성에 대해 살펴보겠습니다.
( ※ 본 예시의 스크립트는 Windows 환경에서 PowerShell 기반으로 파이프라인이 실행되도록 구성하였습니다.)
먼저, CI 파이프라인의 수행 조건과 각 작업 단계, 그리고 스크립트 내에서 사용되는 환경 변수를 지정합니다.
------------------------------------------------------------------------------------------------------------------------------------------------
# 파이프라인이 실행되는 조건 (Push or Merge Request 이벤트 발생 시 CI 파이프
라인 실행)
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "push"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
# 워크플로우 실행 순서
stages:
- build_test
codesonar-sast:
stage: build_test
tags:
- Windows
- CodeSonar
# CodeSonar와 관련된 환경변수
variables:
SARIF2SAST: {CodeSonar Integration Toolkit 설치 경로}
CODESONAR: {CodeSonar 설치 경로}
CSPYTHON: {CodeSoSonar 설치 경로 내 cspython.exe 경로}
CODESONAR_PROJECT_NAME: {프로젝트명}
CODESONAR_HUBUSER: {CodeSonar 유저 ID}
CODESONAR_HUBPWFILE: {CodeSonar 유저 Password가 담긴 txt 파일 경로}
CODESONAR_HUB_URL: {http://ServerIP:7340}
CODESONAR_VISIBILITY_FILTER: {CodeSonar의 Visible Warnings에 저장된 filter명}
------------------------------------------------------------------------------------------------------------------------------------------------
그 다음 “codesonar-sast”라는 작업을 수행하는 스크립트를 작성해 줍니다.
------------------------------------------------------------------------------------------------------------------------------------------------
script:
- > # CodeSonar 분석 프로세스 구동 명령어
& "${CODESONAR}" install-launchd "${CODESONAR_HUB_URL}"
- > # CodeSonar 분석 명령어
& "${CODESONAR}" analyze
"${CODESONAR_PROJECT_NAME}"
-foreground
-name "${CODESONAR_PROJECT_NAME} ref=${CI_COMMIT_REF_NAME} commit msg=${CI_COMMIT_MESSAGE}"
-property branch "$CI_COMMIT_REF_NAME"
-property commit "$CI_COMMIT_MESSAGE"
"${CODESONAR_HUB_URL}"
빌드 명령어
# CodeSonar 분석 ID 추출
- $CODESONAR_ANALYSIS_ID = & "${CSPYTHON}" "${SARIF2SAST}\analysis_id.py" "${CODESONAR_PROJECT_NAME}"
- > # 추출한 분석 ID 기반으로 SARIF 파일을 생성하는 명령어
& "${CODESONAR}" get
-auth password -hubuser "${CODESONAR_HUBUSER}" -hubpwfile ${CODESONAR_HUBPWFILE}
-o allwarnings.sarif
"${CODESONAR_HUB_URL}/analysis/${CODESONAR_ANALYSIS_ID}-allwarnings.sarif?filter=%22${CODESONAR_VISIBILITY_FILTER}%22"
- > # SARIF를 SAST 레포트로 변환하는 명령어
& "${CSPYTHON}" "${SARIF2SAST}\sarif2sast.py"
--sarif allwarnings.sarif
--output gl-sast-report.json
--summary-report sast-summary-report.md
--codesonar-url "${CODESONAR_HUB_URL}"
--analysis-id ${CODESONAR_ANALYSIS_ID}
# GitLab에서 SAST 레포트를 산출물로 지정
artifacts:
reports:
sast: gl-sast-report.json
------------------------------------------------------------------------------------------------------------------------------------------------
해당 작업에 대해 간단히 설명하자면, CodeSonar를 통해 코드를 분석한 후 해당 분석 결과 ID 값을 추출합니다. 이 ID 값을 기반으로 SARIF(Static Analysis Results Interchange Format, 정적 분석 결과 교환 형식) 파일을 생성하게 됩니다.
생성된 SARIF 파일을 GitLab의 SAST 레포트로 변환되며, 이 과정에서 CodeSonar에서 제공하는 GitLab Integration Toolkit을 통해 CodeSonar 형식에 맞게 변환이 이루어집니다.
파이프라인 실행 이후 SAST 레포트가 산출물로 등록되므로, GitLab에서는 해당 레포트를 출력할 수 있으며, Security Scanning 탭에서도 CodeSonar에서 검출한 보안 취약점들을 확인할 수 있습니다.
3.
파이프라인 수행 결과
CI 파이프라인에 CodeSonar를 연동함으로써 아래 그림(2)과 같이 GitLab UI 상에서 CodeSonar를 통해 검출한 보안 취약점 확인 및 해당 결과를 레포트로 출력할 수 있습니다.

그림(2)
여기까지 GitLab에서 CodeSonar를 연동해 CI 파이프라인 구축하는 방법에 대해 살펴봤습니다.
SAST 도구인 CodeSonar를 파이프라인에 도입함으로써 보안 테스트 자동화를 간편하게 구축할 수 있으며, 소프트웨어 개발 생명 주기 초기 단계부터 지속적인 보안 활동을 수행할 수 있습니다.
-----------------------
혹시 CodeSonar에 대해 더 알고 싶으신가요? 💁
MDS인텔리전스는 매달 1회씩 CodeSonar뿐만 아니라 다양한 도구 기본 교육을 진행하고 있습니다!🙌
아래 링크를 통해 MDS인텔리전스 홈페이지를 방문하시어 도구 사용자 교육을 수강해 보세요!
훨씬 더 쉽게 CodeSonar를 활용하실 수 있습니다.
* 출처
https://www.atlassian.com/ko/devops/devops-tools/devsecops-tools
https://waspro.tistory.com/693
https://www.jaenung.net/tree/2930
