모의해킹 (WAPT)

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

날으는물고기 2024. 3. 19. 00:38

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