본문 바로가기
모의해킹 (WAPT)

Jenkins ZAP(Zed Attack Proxy) 플러그인 통한 취약점 점검 자동화

by 날으는물고기 2024. 3. 19.

Jenkins ZAP(Zed Attack Proxy) 플러그인 통한 취약점 점검 자동화

Jenkins에 ZAP(Zed Attack Proxy) 플러그인을 사용하여 코드가 푸시될 때마다 도커(Docker)로 서비스를 배포하고, ZAP을 통해 취약점 점검을 수행한 후 결과를 리포팅하는 프로세스는 CI/CD 파이프라인에 보안 테스트를 통합하는 효과적인 방법입니다. 이를 위해서는 Jenkins, Docker, ZAP을 함께 사용하는 방법을 이해해야 합니다.

 

아래는 이 과정을 구현하는 단계별 안내입니다.

준비 단계

  1. Jenkins 설치: Jenkins 서버가 설치되어 있어야 하며, 필요한 경우 Jenkins를 설치합니다.
  2. Docker 설치: Docker가 설치되어 있어야 하며, Jenkins 서버에서 Docker 커맨드를 실행할 수 있어야 합니다.
  3. ZAP 설치: OWASP ZAP이 설치되어 있어야 합니다. Docker 이미지로 ZAP을 실행할 수도 있습니다.
  4. Jenkins에 ZAP 플러그인 설치: Jenkins 관리 페이지에서 '플러그인 관리'로 이동하여 'OWASP ZAP' 플러그인을 설치합니다.

구현 단계

  1. 소스 코드 저장소와 Jenkins 연동: Jenkins에서 소스 코드 저장소(GitHub, Bitbucket 등)와 프로젝트를 연동합니다.
  2. 빌드 트리거 설정: 코드가 푸시될 때마다 빌드가 트리거되도록 Jenkins에서 설정합니다.
  3. Jenkins 파이프라인 스크립트 작성
    • 도커로 서비스 배포: Jenkins 파이프라인에서 Docker를 사용하여 서비스를 배포하는 단계를 정의합니다. Dockerfile을 사용하여 애플리케이션을 컨테이너화하고, docker builddocker run 커맨드를 사용하여 서비스를 실행합니다.
    • ZAP을 사용한 취약점 점검: 서비스가 실행된 후, OWASP ZAP을 사용하여 취약점 점검을 수행합니다. Docker 이미지를 사용하여 ZAP을 실행할 수 있으며, zap-cli와 같은 도구를 사용하여 ZAP 스캔을 자동화합니다. Jenkins 파이프라인에서 ZAP 스캔 커맨드를 실행하고 결과를 분석합니다.
    • 결과 리포팅: ZAP 스캔의 결과를 분석하여 취약점 리포트를 생성합니다. 리포트는 Jenkins 내부에서 직접 보거나, 이메일, Slack 등으로 팀에 알릴 수 있습니다.

예시 Jenkinsfile 스크립트

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // 소스 코드 체크아웃
                checkout scm
                // Docker를 사용하여 애플리케이션 빌드 및 실행
                script {
                    docker.build('my-app:latest').run()
                }
            }
        }
        stage('Security Test') {
            steps {
                // ZAP 스캔 실행
                script {
                    sh 'docker run -t owasp/zap2docker-stable zap-baseline.py -t http://my-app:port'
                }
            }
        }
        stage('Report') {
            steps {
                // 결과 리포트 생성 및 저장
                script {
                    // ZAP 리포트 처리 로직
                }
            }
        }
    }
}

이 스크립트는 Jenkins 파이프라인을 사용하여 코드가 푸시될 때마다 자동으로 도커 컨테이너에서 서비스를 실행하고, ZAP을 사용해 취약점을 점검한 다음, 결과를 리포팅하는 기본적인 구조를 보여줍니다. CI/CD 파이프라인에 OWASP ZAP을 통한 자동화된 취약점 점검을 통합하는 과정은 다소 복잡할 수 있습니다. 처음 시작하는 경우, 단계별로 천천히 진행하며 각 단계의 목적과 실행 방법을 이해하는 것이 중요합니다.

 

아래에서는 준비 단계와 구현 단계를 세분화하여 설명합니다.

준비 단계

  1. Jenkins 설치
    • Jenkins는 오픈 소스 자동화 서버로, 소프트웨어 개발의 지속적 통합과 배포를 위한 도구입니다.
    • Jenkins를 설치하기 위해서는 Jenkins 공식 웹사이트에서 다운로드할 수 있으며, 설치 가이드를 따라 운영 체제(OS)에 맞게 설치합니다.
  2. Docker 설치
    • Docker는 애플리케이션을 컨테이너화하여 개발, 배포 및 실행을 간소화하는 도구입니다.
    • Docker 설치는 Docker 공식 웹사이트에서 설치 지침을 따릅니다. 설치 후, Jenkins 서비스가 Docker 명령어를 사용할 수 있도록 Jenkins 사용자를 Docker 그룹에 추가합니다.
  3. ZAP 설치
    • OWASP ZAP(Zed Attack Proxy)는 웹 애플리케이션의 취약점을 찾기 위한 오픈 소스 보안 도구입니다.
    • Docker를 사용하여 ZAP을 설치할 수 있습니다. 이는 docker pull owasp/zap2docker-stable 명령어를 통해 OWASP ZAP의 Docker 이미지를 가져오는 것을 포함합니다.
  4. Jenkins에 ZAP 플러그인 설치
    • Jenkins 관리 페이지에서 "플러그인 관리" 섹션으로 이동하여 "OWASP Zed Attack Proxy(ZAP)" 플러그인을 검색하고 설치합니다.
    • 이 플러그인은 Jenkins 내에서 ZAP 스캔을 구성하고 실행하는 데 필요합니다.

구현 단계

  1. 소스 코드 저장소와 Jenkins 연동
    • Jenkins에서 새로운 프로젝트를 생성하고, 소스 코드 저장소(GitHub, GitLab 등)와의 연동을 설정합니다. 이는 "소스 코드 관리" 섹션에서 Git 등의 옵션을 선택하고, 저장소 URL과 자격 증명을 입력하여 수행할 수 있습니다.
  2. 빌드 트리거 설정
    • 프로젝트 설정에서 "빌드 트리거" 섹션을 찾아 "소스 코드 관리(SCM) 변경 시" 또는 "웹훅을 통한" 등의 옵션을 사용하여 코드가 푸시될 때마다 자동으로 빌드가 시작되도록 설정합니다.
  3. Jenkins 파이프라인 스크립트 작성
    • Jenkinsfile을 사용하여 파이프라인을 정의합니다. 이 파일은 프로젝트의 루트 디렉토리에 위치해야 하며, 빌드, 테스트, 배포 단계를 포함하여 전체 CI/CD 파이프라인을 코드 형태로 기술합니다.
    • 도커로 서비스 배포: Dockerfile을 사용하여 애플리케이션을 컨테이너화하고, Jenkins 파이프라인에서 docker builddocker run 명령어를 사용하여 이미지를 빌드하고 컨테이너를 실행합니다.
    • ZAP을 사용한 취약점 점검: 실행된 애플리케이션에 대해 ZAP 스캔을 실행합니다. 이는 ZAP Docker 이미지를 사용하거나, Jenkins ZAP 플러그인을 통해 구성할 수 있습니다.
    • 결과 리포팅: ZAP 스캔 결과를 분석하고, 취약점 리포트를 생성합니다. 이 리포트는 Jenkins 내부에서 확인할 수 있으며, 필요에 따라 이메일이나 Slack으로 알림을 설정할 수 있습니다.

이 과정은 복잡해 보일 수 있지만, 각 단계를 차근차근 진행하면서 Jenkins, Docker, 그리고 ZAP의 기본 사용법을 익히는 것이 중요합니다. 이를 통해 개발 프로세스에 보안을 통합하고, 애플리케이션의 취약점을 조기에 발견하여 대응할 수 있습니다.

 

이제 각 단계별로 더 자세한 명령어, 코드 예시, 메뉴 경로 등을 살펴보겠습니다. 이는 Jenkins를 사용하여 코드가 푸시될 때마다 Docker로 서비스를 배포하고 OWASP ZAP을 사용하여 취약점 점검을 수행한 후 결과를 리포팅하는 프로세스를 구현하는 데 도움이 될 것입니다.

준비 단계

  1. Jenkins 설치
    • Linux(Ubuntu 기준)에서 Jenkins 설치
      wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
      sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
      sudo apt-get update
      sudo apt-get install jenkins
    • 설치 후, Jenkins는 기본적으로 8080 포트에서 실행됩니다. 브라우저에서 http://your_server_ip:8080을 열어 Jenkins에 접속합니다.
  2. Docker 설치
    • Linux(Ubuntu 기준)에서 Docker 설치
      sudo apt-get update
      sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
      sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
      sudo apt-get update
      sudo apt-get install docker-ce
    • Jenkins 사용자를 Docker 그룹에 추가
      sudo usermod -aG docker jenkins
    • 이 변경을 적용하기 위해 Jenkins 서비스 재시작
      sudo systemctl restart jenkins
  3. ZAP 설치 (Docker 이미지 사용)
    • OWASP ZAP Docker 이미지 다운로드
      docker pull owasp/zap2docker-stable
  4. Jenkins에 ZAP 플러그인 설치
    • Jenkins 관리자 페이지에서 대시보드 > 관리 > 플러그인 관리로 이동합니다.
    • "사용 가능" 탭에서 "OWASP ZAP"를 검색하고 설치합니다.

구현 단계

  1. 소스 코드 저장소와 Jenkins 연동
    • 새로운 프로젝트(또는 파이프라인)를 생성하고, "소스 코드 관리" 섹션에서 Git을 선택한 후, 저장소 URL과 자격 증명(필요한 경우)을 입력합니다.
  2. 빌드 트리거 설정
    • 프로젝트 설정에서 "빌드 트리거" 섹션을 찾아 "GitHub hook trigger for GITScm polling" 또는 "SCM을 폴링" 등의 옵션을 선택하여 설정합니다.
  3. Jenkins 파이프라인 스크립트 작성
    • Jenkinsfile은 파이프라인의 단계를 정의하는 Groovy 스크립트입니다. 아래는 Docker와 ZAP을 사용하는 기본적인 파이프라인 예시입니다.
      pipeline {
          agent any
      
          stages {
              stage('Build') {
                  steps {
                      script {
                          // Docker를 사용하여 애플리케이션 빌드
                          sh 'docker build -t my-app .'
                          // Docker를 사용하여 애플리케이션 실행
                          sh 'docker run -d --name my-app-instance -p 80:80 my-app'
                      }
                  }
              }
      
              stage('Security Test') {
                  steps {
                      script {
                          // OWASP ZAP을 사용하여 동적 취약점 분석 실행
                          sh 'docker run --net="host" owasp/zap2docker-stable zap-baseline.py -t http://localhost:80 -r zap-report.html'
                      }
                  }
              }
      
              stage('Report') {
                  steps {
                      script {
                          // ZAP 보고서를 Jenkins 작업의 아티팩트로 저장
                          sh 'cp zap-report.html $WORKSPACE'
                          archiveArtifacts artifacts: 'zap-report.html', fingerprint: true
                      }
                  }
              }
          }
      }
      이 파이프라인 스크립트는 애플리케이션을 Docker를 사용하여 빌드 및 실행하고, ZAP을 사용하여 보안 취약점을 스캔한 후, 결과 보고서를 생성하여 Jenkins에서 사용할 수 있게 합니다.

이 단계별 안내를 통해 Jenkins, Docker, 그리고 OWASP ZAP을 사용하여 자동화된 보안 테스트 파이프라인을 구축할 수 있습니다. 구글 시트를 사용하여 점검 대상 목록을 참조하고, OWASP ZAP을 사용하여 취약점 점검을 순차적으로 반복적으로 수행한 후, 수행 결과 리포트를 구글 시트에 추가/저장하는 방식으로 CI/CD 파이프라인을 개선하는 방법을 구현하려면 여러 단계와 도구가 필요합니다. 이 과정은 Jenkins 파이프라인, Google Sheets API, Python 스크립트 또는 다른 프로그래밍 언어를 사용하여 자동화할 수 있습니다.

필요한 도구 및 서비스

  • Google Sheets API: 구글 시트에 데이터를 읽고 쓰기 위해 필요합니다.
  • Python: Google Sheets API와의 통신을 위한 스크립트를 작성합니다. Python은 이러한 종류의 작업을 위한 라이브러리(gspread 등)를 제공합니다.
  • Jenkins: CI/CD 파이프라인을 관리합니다.

구현 단계

1. Google Sheets API 사용 설정

  1. Google Cloud Console(https://console.cloud.google.com/)에서 새 프로젝트를 생성합니다.
  2. API 및 서비스 > 대시보드 > API 및 서비스 사용 설정으로 이동하여 "Google Sheets API"를 검색하고 사용 설정합니다.
  3. API 및 서비스 > 사용자 인증 정보에서 사용자 인증 정보를 생성합니다. 서비스 계정을 선택하고, JSON 키 파일을 다운로드합니다. 이 키 파일은 나중에 Python 스크립트에서 사용됩니다.

2. Python 스크립트 준비

  • 목적: 구글 시트의 데이터를 읽고, ZAP 스캔을 수행한 후, 결과를 구글 시트에 기록합니다.
  • 라이브러리 설치: gspreadoauth2client를 설치합니다.
    pip install gspread oauth2client
  • 스크립트 예시: 아래 Python 스크립트는 구글 시트에서 URL 목록을 읽어 OWASP ZAP을 사용하여 스캔한 후, 결과를 구글 시트에 기록하는 기본적인 예시입니다.
    import gspread
    from oauth2client.service_account import ServiceAccountCredentials
    import subprocess
    
    # Google Sheets API 설정
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    creds = ServiceAccountCredentials.from_json_keyfile_name('your-google-api-key.json', scope)
    client = gspread.authorize(creds)
    
    # 구글 시트 열기
    sheet = client.open("Your Sheet Name").sheet1
    
    # URL 목록 읽기
    urls = sheet.col_values(1) # 첫 번째 열의 모든 값
    
    for url in urls:
        # ZAP 스캔 명령 실행
        result = subprocess.run(["zap-cli", "quick-scan", "--self-contained", url], capture_output=True, text=True)
        scan_result = result.stdout
    
        # 결과를 구글 시트에 기록
        sheet.append_row([url, scan_result])
    이 스크립트는 your-google-api-key.json을 사용자 인증 정보 파일로, "Your Sheet Name"을 구글 시트의 이름으로 교체해야 합니다.

3. Jenkins 파이프라인에서 Python 스크립트 실행

  • Jenkins 파이프라인에 Python 스크립트를 실행하는 단계를 추가합니다. 파이프라인 스크립트에서 sh 또는 bat 명령어를 사용하여 Python 스크립트를 실행할 수 있습니다.
    pipeline {
        agent any
        stages {
            stage('Scan and Report') {
                steps {
                    script {
                        // Python 스크립트 실행
                        sh 'python zap_scan_to_sheets.py'
                    }
                }
            }
        }
    }
  • 이렇게 설정하면 Jenkins 파이프라인이 실행될 때마다 Python 스크립트가 구글 시트의 URL 목록을 읽어 각 URL에 대해 ZAP 스캔을 수행하고, 결과를 구글 시트에 자동으로 기록합니다.

주의사항

  • Google Sheets API 사용량 제한 및 할당량에 주의하세요.
  • 서비스 계정의 보안과 관련된 JSON 키 파일을 안전하게 관리하세요.
  • Jenkins에서 Python 스크립트를 실행할 때 필요한 모든 환경 변수와 경로가 올바르게 설정되었는지 확인하세요.

 

이 방식을 통해, Jenkins와 Google Sheets를 연동하여 보다 동적이고 자동화된 보안 점검 및 리포팅 시스템을 구축할 수 있습니다.

728x90

댓글