Jenkins ZAP(Zed Attack Proxy) 플러그인 통한 취약점 점검 자동화
Jenkins에 ZAP(Zed Attack Proxy) 플러그인을 사용하여 코드가 푸시될 때마다 도커(Docker)로 서비스를 배포하고, ZAP을 통해 취약점 점검을 수행한 후 결과를 리포팅하는 프로세스는 CI/CD 파이프라인에 보안 테스트를 통합하는 효과적인 방법입니다. 이를 위해서는 Jenkins, Docker, ZAP을 함께 사용하는 방법을 이해해야 합니다.
아래는 이 과정을 구현하는 단계별 안내입니다.
준비 단계
- Jenkins 설치: Jenkins 서버가 설치되어 있어야 하며, 필요한 경우 Jenkins를 설치합니다.
- Docker 설치: Docker가 설치되어 있어야 하며, Jenkins 서버에서 Docker 커맨드를 실행할 수 있어야 합니다.
- ZAP 설치: OWASP ZAP이 설치되어 있어야 합니다. Docker 이미지로 ZAP을 실행할 수도 있습니다.
- Jenkins에 ZAP 플러그인 설치: Jenkins 관리 페이지에서 '플러그인 관리'로 이동하여 'OWASP ZAP' 플러그인을 설치합니다.
구현 단계
- 소스 코드 저장소와 Jenkins 연동: Jenkins에서 소스 코드 저장소(GitHub, Bitbucket 등)와 프로젝트를 연동합니다.
- 빌드 트리거 설정: 코드가 푸시될 때마다 빌드가 트리거되도록 Jenkins에서 설정합니다.
- Jenkins 파이프라인 스크립트 작성
- 도커로 서비스 배포: Jenkins 파이프라인에서 Docker를 사용하여 서비스를 배포하는 단계를 정의합니다.
Dockerfile
을 사용하여 애플리케이션을 컨테이너화하고,docker build
와docker run
커맨드를 사용하여 서비스를 실행합니다. - ZAP을 사용한 취약점 점검: 서비스가 실행된 후, OWASP ZAP을 사용하여 취약점 점검을 수행합니다. Docker 이미지를 사용하여 ZAP을 실행할 수 있으며,
zap-cli
와 같은 도구를 사용하여 ZAP 스캔을 자동화합니다. Jenkins 파이프라인에서 ZAP 스캔 커맨드를 실행하고 결과를 분석합니다. - 결과 리포팅: ZAP 스캔의 결과를 분석하여 취약점 리포트를 생성합니다. 리포트는 Jenkins 내부에서 직접 보거나, 이메일, Slack 등으로 팀에 알릴 수 있습니다.
- 도커로 서비스 배포: Jenkins 파이프라인에서 Docker를 사용하여 서비스를 배포하는 단계를 정의합니다.
예시 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을 통한 자동화된 취약점 점검을 통합하는 과정은 다소 복잡할 수 있습니다. 처음 시작하는 경우, 단계별로 천천히 진행하며 각 단계의 목적과 실행 방법을 이해하는 것이 중요합니다.
아래에서는 준비 단계와 구현 단계를 세분화하여 설명합니다.
준비 단계
- Jenkins 설치
- Jenkins는 오픈 소스 자동화 서버로, 소프트웨어 개발의 지속적 통합과 배포를 위한 도구입니다.
- Jenkins를 설치하기 위해서는 Jenkins 공식 웹사이트에서 다운로드할 수 있으며, 설치 가이드를 따라 운영 체제(OS)에 맞게 설치합니다.
- Docker 설치
- Docker는 애플리케이션을 컨테이너화하여 개발, 배포 및 실행을 간소화하는 도구입니다.
- Docker 설치는 Docker 공식 웹사이트에서 설치 지침을 따릅니다. 설치 후, Jenkins 서비스가 Docker 명령어를 사용할 수 있도록 Jenkins 사용자를 Docker 그룹에 추가합니다.
- ZAP 설치
- OWASP ZAP(Zed Attack Proxy)는 웹 애플리케이션의 취약점을 찾기 위한 오픈 소스 보안 도구입니다.
- Docker를 사용하여 ZAP을 설치할 수 있습니다. 이는
docker pull owasp/zap2docker-stable
명령어를 통해 OWASP ZAP의 Docker 이미지를 가져오는 것을 포함합니다.
- Jenkins에 ZAP 플러그인 설치
- Jenkins 관리 페이지에서 "플러그인 관리" 섹션으로 이동하여 "OWASP Zed Attack Proxy(ZAP)" 플러그인을 검색하고 설치합니다.
- 이 플러그인은 Jenkins 내에서 ZAP 스캔을 구성하고 실행하는 데 필요합니다.
구현 단계
- 소스 코드 저장소와 Jenkins 연동
- Jenkins에서 새로운 프로젝트를 생성하고, 소스 코드 저장소(GitHub, GitLab 등)와의 연동을 설정합니다. 이는 "소스 코드 관리" 섹션에서 Git 등의 옵션을 선택하고, 저장소 URL과 자격 증명을 입력하여 수행할 수 있습니다.
- 빌드 트리거 설정
- 프로젝트 설정에서 "빌드 트리거" 섹션을 찾아 "소스 코드 관리(SCM) 변경 시" 또는 "웹훅을 통한" 등의 옵션을 사용하여 코드가 푸시될 때마다 자동으로 빌드가 시작되도록 설정합니다.
- Jenkins 파이프라인 스크립트 작성
- Jenkinsfile을 사용하여 파이프라인을 정의합니다. 이 파일은 프로젝트의 루트 디렉토리에 위치해야 하며, 빌드, 테스트, 배포 단계를 포함하여 전체 CI/CD 파이프라인을 코드 형태로 기술합니다.
- 도커로 서비스 배포: Dockerfile을 사용하여 애플리케이션을 컨테이너화하고, Jenkins 파이프라인에서
docker build
와docker run
명령어를 사용하여 이미지를 빌드하고 컨테이너를 실행합니다. - ZAP을 사용한 취약점 점검: 실행된 애플리케이션에 대해 ZAP 스캔을 실행합니다. 이는 ZAP Docker 이미지를 사용하거나, Jenkins ZAP 플러그인을 통해 구성할 수 있습니다.
- 결과 리포팅: ZAP 스캔 결과를 분석하고, 취약점 리포트를 생성합니다. 이 리포트는 Jenkins 내부에서 확인할 수 있으며, 필요에 따라 이메일이나 Slack으로 알림을 설정할 수 있습니다.
이 과정은 복잡해 보일 수 있지만, 각 단계를 차근차근 진행하면서 Jenkins, Docker, 그리고 ZAP의 기본 사용법을 익히는 것이 중요합니다. 이를 통해 개발 프로세스에 보안을 통합하고, 애플리케이션의 취약점을 조기에 발견하여 대응할 수 있습니다.
이제 각 단계별로 더 자세한 명령어, 코드 예시, 메뉴 경로 등을 살펴보겠습니다. 이는 Jenkins를 사용하여 코드가 푸시될 때마다 Docker로 서비스를 배포하고 OWASP ZAP을 사용하여 취약점 점검을 수행한 후 결과를 리포팅하는 프로세스를 구현하는 데 도움이 될 것입니다.
준비 단계
- 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에 접속합니다.
- Linux(Ubuntu 기준)에서 Jenkins 설치
- 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
- Linux(Ubuntu 기준)에서 Docker 설치
- ZAP 설치 (Docker 이미지 사용)
- OWASP ZAP Docker 이미지 다운로드
docker pull owasp/zap2docker-stable
- OWASP ZAP Docker 이미지 다운로드
- Jenkins에 ZAP 플러그인 설치
- Jenkins 관리자 페이지에서 대시보드 > 관리 > 플러그인 관리로 이동합니다.
- "사용 가능" 탭에서 "OWASP ZAP"를 검색하고 설치합니다.
구현 단계
- 소스 코드 저장소와 Jenkins 연동
- 새로운 프로젝트(또는 파이프라인)를 생성하고, "소스 코드 관리" 섹션에서 Git을 선택한 후, 저장소 URL과 자격 증명(필요한 경우)을 입력합니다.
- 빌드 트리거 설정
- 프로젝트 설정에서 "빌드 트리거" 섹션을 찾아 "GitHub hook trigger for GITScm polling" 또는 "SCM을 폴링" 등의 옵션을 선택하여 설정합니다.
- Jenkins 파이프라인 스크립트 작성
- Jenkinsfile은 파이프라인의 단계를 정의하는 Groovy 스크립트입니다. 아래는 Docker와 ZAP을 사용하는 기본적인 파이프라인 예시입니다.
이 파이프라인 스크립트는 애플리케이션을 Docker를 사용하여 빌드 및 실행하고, ZAP을 사용하여 보안 취약점을 스캔한 후, 결과 보고서를 생성하여 Jenkins에서 사용할 수 있게 합니다.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 } } } } }
- Jenkinsfile은 파이프라인의 단계를 정의하는 Groovy 스크립트입니다. 아래는 Docker와 ZAP을 사용하는 기본적인 파이프라인 예시입니다.
이 단계별 안내를 통해 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 사용 설정
- Google Cloud Console(https://console.cloud.google.com/)에서 새 프로젝트를 생성합니다.
- API 및 서비스 > 대시보드 > API 및 서비스 사용 설정으로 이동하여 "Google Sheets API"를 검색하고 사용 설정합니다.
- API 및 서비스 > 사용자 인증 정보에서 사용자 인증 정보를 생성합니다. 서비스 계정을 선택하고, JSON 키 파일을 다운로드합니다. 이 키 파일은 나중에 Python 스크립트에서 사용됩니다.
2. Python 스크립트 준비
- 목적: 구글 시트의 데이터를 읽고, ZAP 스캔을 수행한 후, 결과를 구글 시트에 기록합니다.
- 라이브러리 설치:
gspread
와oauth2client
를 설치합니다.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를 연동하여 보다 동적이고 자동화된 보안 점검 및 리포팅 시스템을 구축할 수 있습니다.