본문 바로가기
개발·프로그래밍

기존 DevOps 환경을 건드리지 않고 보안 자동화 구축하기

by kokojj 2026. 3. 13.

기존 CI/CD 파이프라인을 멈추지 않고 DevSecOps 자동화 도구 도입 방법을 단계별로 적용하면, 개발 워크플로우 변화 없이 보안 검사가 자동 실행되는 환경을 만들 수 있습니다. Jenkins와 GitLab CI 기준으로 바로 적용 가능한 설정 흐름을 정리했습니다.

핵심은 단순합니다. 기존 배포 프로세스를 유지한 채 코드 보안 검사, 의존성 취약점 스캔, 컨테이너 이미지 보안 검증까지 자동화하는 방식입니다.

1단계: 보안 도구 선정과 테스트 환경 구성 (DevSecOps 자동화 도구 도입 방법)

기존 시스템 영향을 줄이려면 별도 브랜치에서 보안 도구를 먼저 검증하는 편이 안전합니다. 운영 파이프라인과 분리된 환경에서 호환성을 확인해야 리스크를 낮출 수 있죠.

주의사항: 프로덕션 브랜치에 바로 보안 도구를 추가하면 빌드 시간이 늘어나거나 예상치 못한 오류가 발생할 수 있습니다.

SAST 도구 선정 기준

  • 기존 개발 언어 지원 범위 (Java, Python, JavaScript 등)
  • CI/CD 플랫폼 연동 플러그인 제공 여부
  • 스캔 실행 시간과 리소스 사용량
  • 결과 리포트 형식과 개발팀 워크플로우 적합성

SonarQube는 Jenkins 플러그인 연동이 안정적인 편이고, Checkmarx는 GitLab CI YAML 설정이 비교적 단순합니다. Veracode는 클라우드 기반이라 별도 인프라 없이 시작할 수 있어 초기 도입 단계에서 검토할 만합니다.

DevSecOps 보안 도구 비교표 - Jenkins와 GitLab CI 호환성 체크리스트 이미지

테스트 브랜치 설정 절차

  1. feature/security-test 브랜치 생성
  2. 해당 브랜치에만 적용되는 별도 Jenkinsfile 또는 .gitlab-ci.yml 작성
  3. 보안 스캔 단계를 기존 빌드와 병렬로 실행하도록 구성
  4. 실패해도 전체 파이프라인을 중단하지 않는 옵션 설정

2단계: Jenkins 파이프라인에 SAST 통합

정적 코드 분석을 빌드에 붙일 때 포인트는 독립 실행 구조입니다. 코드 보안 검사가 실패하더라도 개발자가 바로 확인하고 수정 흐름으로 넘길 수 있어야 하거든요.

Jenkinsfile 구성 예제

pipeline 블록에서 parallel 구문을 사용하면 기존 빌드와 보안 스캔을 동시에 실행할 수 있습니다. 이 구성이면 전체 빌드 시간 증가폭을 줄이기 좋습니다.

pipeline {
    agent any
    stages {
        stage('Parallel Build and Security') {
            parallel {
                stage('Build Application') {
                    steps {
                        // 기존 빌드 로직
                        sh 'mvn clean compile'
                    }
                }
                stage('SAST Scan') {
                    steps {
                        script {
                            try {
                                sh 'sonar-scanner'
                            } catch (Exception e) {
                                echo "Security scan failed: ${e.message}"
                                currentBuild.result = 'UNSTABLE'
                            }
                        }
                    }
                    post {
                        always {
                            publishHTML([
                                allowMissing: false,
                                alwaysLinkToLastBuild: true,
                                keepAll: true,
                                reportDir: 'reports',
                                reportFiles: 'sonar-report.html'
                            ])
                        }
                    }
                }
            }
        }
    }
}

SonarQube 플러그인 설정

  • Jenkins 관리 → 플러그인 관리에서 SonarQube Scanner 설치
  • Global Tool Configuration에서 SonarQube 서버 정보 등록
  • 프로젝트별 sonar-project.properties 파일에 스캔 규칙 정의
  • Quality Gates 임계값을 개발팀 기준에 맞게 조정

스캔 결과가 임계값을 넘더라도 빌드를 바로 중단하지 않고 UNSTABLE로 표시하면 운영 흐름을 유지할 수 있습니다. 이후 팀 숙련도에 맞춰 임계값을 점진적으로 강화하면 됩니다.

3단계: GitLab CI에서 컨테이너 취약점 검사 활성화

컨테이너 환경에서는 베이스 이미지와 의존성 라이브러리 취약점 점검이 필수에 가깝습니다. GitLab CI는 내장 보안 스캐너를 제공하므로 별도 도구 설치 없이 시작할 수 있죠.

GitLab CI 파이프라인에서 DevSecOps 컨테이너 보안 검사

.gitlab-ci.yml 보안 단계 구성

stages:
  - build
  - test
  - security
  - deploy

build:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
  only:
    - main
    - develop

container_scanning:
  stage: security
  image: registry.gitlab.com/gitlab-org/security-products/analyzers/klar:latest
  services:
    - docker:dind
  script:
    - mkdir reports
    - export CI_APPLICATION_REPOSITORY=$CI_REGISTRY_IMAGE
    - export CI_APPLICATION_TAG=$CI_COMMIT_SHA
    - /analyzer run
  artifacts:
    reports:
      container_scanning: gl-container-scanning-report.json
  allow_failure: true

dependency_scanning:
  stage: security
  image: registry.gitlab.com/gitlab-org/security-products/analyzers/gemnasium:latest
  script:
    - /analyzer run
  artifacts:
    reports:
      dependency_scanning: gl-dependency-scanning-report.json
  allow_failure: true

Trivy를 이용한 추가 검사 설정

GitLab 내장 스캐너에 Trivy를 더하면 취약점 정보를 더 촘촘하게 수집할 수 있습니다. 최신 CVE 데이터베이스 반영 주기가 빨라 신규 취약점 탐지에도 유리한 편입니다.

  • HIGH, CRITICAL 등급 취약점만 필터링하여 알림 발송
  • 스캔 결과를 JSON 형태로 저장하여 보안팀과 공유
  • 베이스 이미지별 취약점 통계를 Merge Request에 코멘트로 추가
  • 수정 가능한 취약점과 패치 방법을 개발자에게 자동 안내

팁: allow_failure: true 옵션으로 보안 검사가 실패해도 배포는 계속 진행되도록 설정하세요. 초기 도입 시 지나치게 엄격한 정책은 개발 속도를 크게 저하시킬 수 있습니다.

4단계: 보안 정책 설정과 알림 체계 구축

DevSecOps 자동화가 제대로 작동하려면 발견된 보안 이슈가 적절한 담당자에게 빠르게 전달되어야 합니다. 중요도별로 알림 채널을 분리하고 즉시 대응 가능한 정보를 함께 제공하는 게 핵심이죠.

보안 등급별 대응 매트릭스

등급 알림 채널 대응 시간 배포 차단
CRITICAL Slack + Email + SMS 즉시 Yes
HIGH Slack + Email 4시간 Review
MEDIUM Slack 24시간 No
LOW Weekly Report 주간 리뷰 No

Slack 통합 웹훅 설정

Jenkins와 GitLab CI 모두 Slack 플러그인을 지원하므로 보안 스캔 결과를 실시간으로 전송할 수 있습니다. 채널 권한을 분리해 개발팀이 자기 프로젝트 알림만 받게 구성하면 운영 피로도도 줄어듭니다.

// Jenkins Pipeline에서 Slack 알림
post {
    always {
        script {
            def color = currentBuild.result == 'SUCCESS' ? 'good' : 'warning'
            slackSend(
                channel: '#security-alerts',
                color: color,
                message: "Security Scan Result: ${env.JOB_NAME} - ${env.BUILD_NUMBER}\n" +
                        "Status: ${currentBuild.result}\n" +
                        "Report: ${env.BUILD_URL}artifact/reports/security-report.html"
            )
        }
    }
}

주의사항: 알림이 과도하면 피로도가 높아져 중요한 이슈를 놓치기 쉽습니다. 초기에는 HIGH 등급 이상만 보내고, 팀이 적응한 뒤 범위를 넓히는 방식이 안정적입니다.

JIRA 티켓 자동 생성

HIGH 등급 이상 보안 이슈는 JIRA 티켓으로 자동 생성해 추적 관리할 수 있습니다. 티켓에 CVE 번호, 영향 범위, 수정 방법을 함께 넣으면 대응 속도가 확실히 빨라집니다. 중복 발행을 막으려면 CVE ID나 파일 경로 기준으로 기존 티켓 존재 여부를 확인하는 로직이 필요합니다.

5단계: 성능 영향 최소화와 점진적 확장

보안 도구 도입 뒤 가장 자주 나오는 이슈는 빌드 시간 증가입니다. 캐싱과 병렬 처리로 성능 저하를 줄이고, 팀별로 단계적으로 확산하는 접근이 정착에 유리합니다.

DevSecOps 파이프라인 성능 최적화 전후 비교 차트 - 빌드 시간과 보안 검사 효율성

스캔 결과 캐싱 전략

  • 의존성 라이브러리가 변경되지 않은 경우 이전 스캔 결과 재사용
  • 베이스 이미지별로 취약점 정보를 캐시하여 중복 검사 방지
  • 코드 변경이 있는 파일만 선별적으로 SAST 스캔 실행
  • 주기적으로 전체 스캔을 실행하여 캐시 무효화 처리

리소스 사용량 모니터링

보안 도구가 CI/CD 인프라에 주는 영향을 지속적으로 확인해야 합니다. Jenkins 에이전트나 GitLab Runner의 CPU, 메모리 사용률이 급증하면 스캔 주기 조정이나 전용 에이전트 구성이 필요해지는 셈입니다.

성능 최적화 체크리스트
• 보안 스캔을 nightly build로 분리
• 개발자 PR에는 빠른 스캔만 적용
• 스캔 결과 DB화하여 트렌드 분석
• 임계값 도달 시 알림 및 자동 확장

팀별 확산 로드맵

  1. 1개월차: 코어 개발팀에서 파일럿 운영
  2. 2개월차: 웹 프론트엔드팀 확대 적용
  3. 3개월차: API 백엔드팀 통합
  4. 4개월차: 모바일 앱팀 및 데이터 파이프라인 포함
  5. 5개월차: 전사 표준 정책 수립 및 의무화

단계별로 정책을 강화하면서 개발팀 피드백을 반영해 도구 설정을 조정해야 합니다. 빠른 확산보다 안정적인 정착이 우선입니다. 그게 장기적으로 더 빠른 길이죠.

전체 과정 요약 체크리스트

  • 테스트 브랜치에서 보안 도구 호환성 검증
  • Jenkins/GitLab CI 파이프라인에 병렬 보안 검사 추가
  • 등급별 알림 체계와 대응 프로세스 구축
  • 캐싱과 선별적 스캔으로 성능 최적화
  • 팀별 단계적 확산과 피드백 수집

자주 묻는 질문

Q. 기존 파이프라인 빌드 시간이 2배로 늘어났는데 어떻게 해결하나요?

보안 스캔을 기존 빌드와 병렬로 실행하도록 설정을 바꾸는 게 우선입니다. Jenkins는 parallel 블록, GitLab CI는 별도 stage 분리로 동시 실행이 가능합니다. 여기에 변경 파일만 스캔하는 증분 분석 옵션을 더하면 시간 단축 효과를 기대할 수 있습니다.

Q. 보안 스캔에서 너무 많은 false positive가 발생합니다.

초기에는 임계값을 낮춰 HIGH, CRITICAL 등급 중심으로 알림을 받는 편이 좋습니다. 프로젝트별 화이트리스트를 적용하면 업무 영향이 적은 경고를 제외할 수 있죠. SonarQube라면 Quality Profile 커스터마이징으로 규칙을 더 세밀하게 조정할 수 있습니다.

Q. 여러 보안 도구의 결과를 통합해서 보고 싶어요.

DefectDojo나 OWASP Dependency-Track 같은 보안 오케스트레이션 도구를 쓰면 여러 스캔 결과를 하나의 대시보드에서 관리할 수 있습니다. JSON 출력 결과를 API로 통합하거나 Elasticsearch와 Kibana로 커스텀 대시보드를 구성하는 방법도 많이 사용됩니다.

마무리

기존 DevOps 환경에 보안 자동화를 통합하는 일은 한 번에 끝나지 않습니다. 작은 범위에서 시작해 점진적으로 확장하면서 개발팀 워크플로우에 자연스럽게 맞추는 접근이 가장 안정적입니다. 초기에는 빌드 중단 없이 보안 이슈를 가시화하고, 팀이 익숙해지면 정책을 강화하면 됩니다.

DevSecOps 자동화 도구가 자리 잡으면 개발자는 코드 품질에 집중하고, 보안팀은 전략 수립에 더 많은 시간을 쓸 수 있습니다. 결국 보안이 개발 속도를 막는 요소가 아니라 안정적인 서비스 운영을 지탱하는 기반이 되는 셈입니다.