Linux용 tar.gz 압축 파일을 다운로드하고 ./zap.sh로 바로 실행하는 비설치형으로 구축하겠습니다.
현재 최신 정식 버전은 2.17.0이며, GitHub에서 다운로드하여 사용합니다.
OWASP ZAP은 Java가 필수 설치 되어야 하며, 압축 파일에는 포함되어 있지 않아 별도로 설치해야 합니다.
ZAP 2.16.0부터는 최소 Java 17 이상이 필요합니다.
# 현재 apt 저장소에서 jdk 몇을 제공하는지 전부 확인
apt-cache search openjdk | grep -E 'openjdk-[0-9]+'
# jdk-17을 몇 버전을 지원하는지 확인
apt-cache policy openjdk-17-jdk
===
openjdk-17-jdk:
Installed: (none)
Candidate: 17.0.20.1+1-1~26.04
Version table:
17.0.20.1+1-1~26.04 500
500 http://archive.ubuntu.com/ubuntu resolute-updates/universe amd64 Packages
500 http://security.ubuntu.com/ubuntu resolute-security/universe amd64 Packages
17.0.18+8-1 500
500 http://archive.ubuntu.com/ubuntu resolute/universe amd64 Packages
===
apt list openjdk-17-jdk
===
openjdk-17-jdk/resolute-updates,resolute-security 17.0.20.1+1-1~26.04 amd64
Notice: There is 1 additional version. Please use the '-a' switch to see it
===
정확하게 Java 17을 설치하려면 아래와 같이 입력합니다.
apt install -y openjdk-17-jre
# jdk가 필요 시 (zap 실행을 위해서는 jre로만 설치해도 됨)
apt install -y openjdk-17-jdk
하지만 17 이상의 버전이라면 최신 버전을 설치해도 무방하므로 최신 버전이 몇인지 확인하고 설치합니다.
apt-cache depends default-jre
===
default-jre
Depends: default-jre-headless
Depends: openjdk-25-jre
===
# GUI 지원 서버
apt install -y default-jre xauth
# GUI 없는 서버에서 데몬으로만 쓸 때
# apt install -y default-jre-headless
# 설치 확인
java -version
cd /tmp
wget https://github.com/zaproxy/zaproxy/releases/download/v2.17.0/ZAP_2.17.0_Linux.tar.gz
# 체크섬 확인
echo "efe799aaa3627db683b43f00c9c210aea0b75c00cc8f0a0f0434d12bb3ddde5a ZAP_2.17.0_Linux.tar.gz" | sha256sum -c
2.17.0 공식 릴리스 페이지에 공개된 Linux tar.gz의 SHA-256 해시 값과 비교하는 절차를 거쳐 OK가 출력된다면 실제 설치로 넘어갑니다.
mkdir -p /opt/zap
tar -xzf /tmp/ZAP_2.17.0_Linux.tar.gz -C /opt/zap
chown -R $USER:$USER /opt/zap
# 버전 업그레이드 시 경로가 안 바뀌도록 심볼릭 링크 (선택)
ln -sfn /opt/zap/ZAP_2.17.0 /opt/zap/current
무작위 키를 생성하여 관리자도 모르게 운영된다면 곤란합니다. 따라서 임의로 키를 생성하여 실행 시 선언합니다.
cd /opt/zap/ZAP_2.17.0
# 충분히 긴 랜덤 키 생성 후 파일로 보관
openssl rand -hex 32 > ~/.zap_api_key
chmod 600 ~/.zap_api_key
# 생성한 API 키로 데몬 실행
cd /opt/zap/current
# 로컬 접속만 허용
./zap.sh -daemon -host 127.0.0.1 -port 8080 \
-config api.key=$(cat ~/.zap_api_key)
# 외부 접근 가능한 바인딩 (접근 가능 IP 지정)
./zap.sh -daemon -host 0.0.0.0 -port 8080 \
-config api.key=$(cat ~/.zap_api_key) \
-config api.addrs.addr.name=$AcceptIP -config api.addrs.addr.regex=false
실행 명령어 입력 후에도 모든 작업이 끝나고 listen 중이라는 문구(ZAP is now listening on 0.0.0.0:8080)가 출력되어야 접근이 가능합니다.
만일 부득이 모든 IP에서 접근 허용하게 하려면 아래 옵션을 사용하면 됩니다.
-config api.addrs.addr.name=.* -config api.addrs.addr.regex=true
그러나 보안 상 권장하지 않습니다.
차라리 대역대 자체를 허용하는 방법도 있습니다.
-config api.addrs.addr.name=^(127[.]0[.]0[.]1|192[.]168[.]0[.][0-9]+|10[.]172[.]1[.]122)$$ -config api.addrs.addr.regex=true
WEB UI를 접근하면 아래와 같이 출력됩니다.
허무하게도 ZAP은 WEB UI가 우리가 생각하는 관리자 기능 제어 화면이 아닙니다.
따라서 스크립트를 만들어 편리하게 사용할 수 있도록 합니다.
mkdir -p /etc/zap
echo "ZAP_API_KEY=$(cat ~/.zap_api_key)" | sudo tee /etc/zap/zap.env > /dev/null
chmod 600 /etc/zap/zap.env
vi /etc/systemd/system/zap.service
===
[Unit]
Description=ZAP Daemon
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=$USER
WorkingDirectory=/opt/zap/current
EnvironmentFile=/etc/zap/zap.env
ExecStart=/opt/zap/current/zap.sh -daemon -host 127.0.0.1 -port 8080 -config api.key=\${ZAP_API_KEY}
Restart=on-failure
RestartSec=10
TimeoutStopSec=60
[Install]
WantedBy=multi-user.target
===
systemctl daemon-reload
systemctl enable zap --now