배포 전에 취약점을 잡아라: 로컬 SonarQube 설정 (파트 2)
Source: Dev.to
소개
정적 애플리케이션 보안 테스트(SAST)는 소프트웨어 보안 개발 라이프사이클(SSDLC) 내에서 중요한 실천으로, 개발자가 코드 개발 단계 초기에 보안 취약점을 식별할 수 있게 해줍니다. SAST 개념을 이해하는 것도 중요하지만, 실제 프로젝트에 효과적으로 구현하는 것이 견고하고 안전한 소프트웨어 제공을 보장합니다.
이번 SAST 시리즈의 두 번째 파트에서는 인기 있는 정적 분석 도구인 SonarQube Cloud를 IntelliJ IDEA에 통합하고 Docker와 함께 실행하는 방법에 초점을 맞춥니다. 다음을 살펴볼 것입니다:
- SAST를 위한 SonarQube Cloud
- IntelliJ IDEA를 통한 SonarQube Cloud 로컬 스캔
- SonarQube 이미지와 Docker Compose를 이용한 로컬 스캔
도구: SonarQube Cloud, Spring Boot, IntelliJ IDEA, Docker‑Compose
전제 조건: IntelliJ IDEA 또는 Spring Boot Initializr 를 사용해 Spring Boot 프로젝트를 생성합니다.
SonarQube Cloud
SonarQube Cloud는 자체 인프라를 관리하지 않고도 정적 코드 분석을 손쉽게 시작할 수 있는 방법을 제공합니다. 클라우드에서 호스팅되는 스캔 기능을 통해 코드 품질, 보안 취약점, 버그 및 코드 냄새를 분석합니다.
- 계정 생성 – SonarQube 공식 웹사이트에 방문해 무료 또는 유료 클라우드 계정을 등록합니다.
- 새 프로젝트 생성 – 저장소 정보를 입력합니다.
- 인증 토큰 생성 – My Account > Security 에서 토큰을 생성하고 안전하게 보관합니다(예: GitHub Actions 비밀).
- 프로젝트 설정 구성 – 품질 게이트, SLA 및 규칙을 보안 정책에 맞게 설정합니다. 무료 계정은 기본 품질 게이트를 사용해야 합니다.
SonarQube Cloud는 상세 보안 보고서와 코드 품질 메트릭을 확인할 수 있는 중앙 허브가 됩니다.
SonarCloud
SonarCloud는 지속적인 정적 코드 분석을 위해 완전 관리형 SaaS 플랫폼으로, 코드 품질 문제, 보안 취약점 및 유지보수 위험을 현대 소프트웨어 프로젝트 전반에 걸쳐 탐지하도록 설계되었습니다. Java, Python, C#, JavaScript, TypeScript, Go 등 30개 이상의 프로그래밍 언어를 지원합니다.
기능
- 클라우드 호스팅 및 완전 관리형 – 설치, 호스팅, 유지보수가 필요 없습니다. 엄격한 규정 준수가 요구되지 않는 팀에 이상적입니다.
- SonarSource 관리 – 가동 시간, 확장성, 규칙 업데이트, 언어 분석기 및 보안 패치를 담당합니다.
- 깊이 있는 정적 분석 – 버그, CWE 기반 및 OWASP 정렬 보안 이슈(예: SQL 인젝션, 경로 탐색, 입력 검증 문제, 하드코딩된 비밀, 명령어 인젝션)를 탐지합니다.
- 코드 냄새 및 인지 복잡도 – 유지보수 문제를 표시하고 코드 이해 난이도를 측정합니다.
- 다중 언어 지원 – Java, Python, JavaScript, TypeScript, Go, C#, Kotlin, PHP, Terraform, YAML 등.
- 원활한 CI/CD 통합 – GitHub Actions, Azure Pipelines, Bitbucket Pipelines, GitLab CI 및 Gradle Sonar 플러그인 등과 네이티브 통합.
- 풀 리퀘스트 및 브랜치 분석 – PR 리뷰 중 인라인 분석 제공(무료 플랜에서는 사용 불가).
품질 게이트
품질 게이트는 코드를 병합하기 전에 충족해야 할 규칙을 정의합니다. 기본 체크 항목은 다음과 같습니다:
- 새로운 치명적 또는 차단 이슈가 없음.
- 최소 코드 커버리지 임계값 충족.
- 새로운 버그 또는 보안 취약점이 없음.
- 새로운 코드 중복이 없음.
무료 플랜에서는 사용자 정의 품질 게이트를 지원하지 않습니다.
대시보드 및 알림
- 중앙 집중식 이슈 추적, 히스토리 트렌드 차트, 핫스팟 보안 검토, 커버리지 진행 상황.
- GitHub 체크, GitLab 머지 리퀘스트, Slack, 이메일, 웹훅 및 맞춤 확장을 위한 오픈 API를 통한 알림.
IntelliJ IDEA에 SonarQube 플러그인 설치 및 구성
-
플러그인 설치
- IntelliJ IDEA → File > Settings > Plugins 열기.
- SonarQube를 검색하고 설치합니다. IDE를 재시작합니다.
-
인증 토큰 생성
- SonarCloud 웹사이트 → My Account > Security 로 이동하거나 직접 방문합니다.
- 토큰 이름을 입력하고 Generate Token을 클릭합니다.
-
플러그인 구성
- SonarQube 플러그인 아이콘 → 톱니바퀴 아이콘 클릭.
- SonarQube Cloud 서버 URL을 입력하고 생성한 토큰을 붙여넣습니다.
-
연결 추가
- Connection 섹션에서 + 클릭 → 연결 이름 입력 → Next.
- 토큰을 붙여넣기(또는 이 창에서 생성) → Next.
- IDE가 연결을 검증하고 성공적인 인증 메시지가 표시됩니다.
-
스캔 실행
- 프로젝트 우클릭 → SonarQube → Analyze All Project Files.
- 결과가 인라인으로 표시되며, 플러그인이 이슈를 강조하고 상세 보고서 링크를 제공합니다.
로컬 스캔의 장점
- 보안 및 품질 이슈에 대한 즉각적인 피드백.
- 취약한 코드를 푸시할 가능성 감소.
- 개발 워크플로 초기에 문제를 해결함으로써 시간 절약.
Docker Compose와 SonarQube 이미지로 로컬 스캔 수행
SonarQube를 로컬에서 실행하고 싶다면 Docker를 이용해 복잡한 설치 없이 손쉽게 설정할 수 있습니다.
Docker Compose로 SonarQube 로컬 설정
다음 내용을 가진 docker-compose.yml 파일을 생성합니다:
version: "3.9"
services:
sonarqube:
image: sonarqube:latest
ports:
- "9000:9000"
environment:
SONAR_ES_BOOTSTRAP_CHECKS_DISABLE: "true"
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
volumes:
sonarqube_data:
sonarqube_extensions:
프로젝트 루트에 다음 gradle-local.properties 파일을 추가하고 .gitignore에 포함합니다:
systemProp.sonar.qualitygate.wait=true
sonar.projectKey=sonarqube_action
스택을 실행합니다:
docker compose up -d
SonarQube UI는 에서 확인할 수 있습니다. 이제 IntelliJ 플러그인이나 SonarScanner를 통해 로컬 인스턴스로 스캔을 보낼 수 있습니다.