2단계 컨테이너
이 컨테이너들은 purpleteam CLI에 제공된 Build User config(작업) 입력, 특히 사용자가 정의한 testSession 수에 따라 동적으로 시작됩니다.
다음 구성은 purpleteam 백엔드를 local 환경에서 실행하려는 경우에 관련됩니다. cloud 환경에서는 이 모든 작업이 자동으로 처리됩니다.
이 저장소를 클론하세요.
테스트를 위해 app-slave 디렉토리에서 직접 .env 파일을 사용합니다.
ZAP_API_KEY
ZAP_API_KEY 환경 변수에 값을 할당했는지 확인하세요.
ZAP_API_KEY는 원하는 값으로 설정할 수 있습니다. app-slave에 정의하는 것뿐만 아니라 app-scanner 프로젝트 구성에도 추가해야 합니다. app-scanner 프로젝트는 Stage Two 컨테이너에서 실행 중인 Zap에 인증하기 위해 Zap API 키가 구성되어야 합니다. app-scanner 프로젝트의 경우 다음과 같이 설정해야 합니다:
{ "slave": { "apiKey": <zap-api-key-here> } }
HOST_ZAP_LOG4J_PROPERTIES_PATH and ZAP_LOG4J_PROPERTIES_PATH_MOUNT_TARGET
Zap 디버그 로그가 필요할 때는 LOG4J 디버그 구성을 위한 환경 변수도 추가해야 합니다.
.env 파일
.env 파일을 사용하기로 선택했다면, 이러한 모든 환경 변수를 추가하는 것은 다음과 같을 것입니다:
ZAP_API_KEY=<zap-api-key-here>
HOST_ZAP_LOG4J_PROPERTIES_PATH=<absolute-path-to/purpleteam-s2-containers/app-slave/log4j.properties>
ZAP_LOG4J_PROPERTIES_PATH_MOUNT_TARGET=/home/zap/.ZAP/log4j.properties
위에서 설명한 환경 변수를 설정했다면:
local 환경에서 실행되는 app-slave (Zap) 컨테이너의 디버그 로깅을 켜려면 volumes 배열과 HOST_ZAP_LOG4J_PROPERTIES_PATH 환경 변수가 포함된 source 키가 있는 요소의 주석을 해제하세요.
실제 로그를 보는 방법은 아래에서 확인하세요.
테스트가 실행되는 동안 Zap과 상호작용(쿼리)할 수 있습니다. 과거에 app-scanner를 디버깅하면서 Zap의 상태를 확인하는 데 유용했습니다.
docker stats
docker container ls
8080-8091 사이의 포트일 수 있습니다.
zap:8080/*
http://zap:8080/로 이동하세요.zap 프로세스가 응답합니다.local 환경에서 실행되는 Selenium 컨테이너의 디버그 로깅을 켜려면 environment 배열과 chrome 및/또는 firefox에 대한 SE_OPTS=-debug 요소의 주석을 해제하세요.
실제 로그를 보는 방법은 아래에서 확인하세요.
다음은 이 프로젝트에서 실행되는 Selenium 컨테이너 내부의 브라우저를 보기 위해 필요한 작업을 설명합니다.
-debug 이미지로 교체하세요. -debug 이미지가 주석 처리되어 있을 수 있으므로, 일반 이미지를 주석 처리하고 끝에 -debug가 추가된 이미지의 주석을 해제하면 됩니다.5900 포트 범위의 주석을 해제하여 컨테이너 내부의 VNC 서버에 액세스할 수 있는지 확인하세요. 외부 포트로 범위를 지정하면(예: 5900-5901) 한 번에 둘 이상의 컨테이너에 VNC로 접속할 수 있습니다. 예제에서는 동시에 두 개의 세션을 열 수 있도록 허용했습니다. 두 개 이상 VNC로 접속해야 하는 경우 외부 포트 범위를 넓히기만 하면 됩니다.| 키 | 값 |
|---|---|
| 이름 | seleniumstandalone_chrome_1 |
| 프로토콜 | VNC - Virtual Network Computing |
| 기본 탭에서 | |
| 서버 | 127.0.0.1:5900 |
| 비밀번호 | secret |
| 색상 깊이 | True color (24 bit) # 이것이 우리에게 작동한 유일한 것입니다. |
| 품질 | Poor (fastest) |
| 키 | 값 |
|---|---|
| 이름 | seleniumstandalone_chrome_2 |
| 프로토콜 | VNC - Virtual Network Computing |
| 기본 탭에서 | |
| 서버 | 127.0.0.1:5901 |
| 비밀번호 | secret |
| 색상 깊이 | True color (24 bit) # 이것이 우리에게 작동한 유일한 것입니다. |
| 품질 | Poor (fastest) |
자세한 내용은 SeleniumHQ github에서 확인하세요.
Selenium 컨테이너가 실행되면 (터미널에서 docker stats를 실행하면 이를 확인하는 데 편리합니다), docker container ls로 각 Selenium 컨테이너가 사용하는 외부 포트를 확인할 수 있습니다. Docker는 VNC 클라이언트 항목에 할당한 포트를 알지 못하므로, 특정 VNC 클라이언트 항목의 이름이 동일한 이름의 Selenium 컨테이너와 일치하지 않을 수 있습니다. 따라서 docker container ls로 포트 매핑을 확인하는 것이 좋습니다.
여러 테스트 세션이 있을 때 어떤 Selenium 컨테이너가 어떤 테스트 세션에 사용되는지 확인하려면 실행 중인 app-scanner 로그를 검토해야 할 수 있습니다. 또한 app-scanner가 로그 수준 debug로 구성되어 있어야 다음 로그 메시지 중 일부 또는 전부를 볼 수 있습니다:
[app.parallel] cucCli process with PID "28" has been spawned for test session with Id "lowPrivUser"
[app.parallel] cucCli process with PID "34" has been spawned for test session with Id "adminUser"
[pid-28,world] seleniumContainerName is: seleniumstandalone_chrome_1
[pid-34,world] seleniumContainerName is: seleniumstandalone_chrome_2
이 예제에서는 Build User config(작업)에 두 개의 테스트 세션이 구성되어 있습니다. 하나는 id가 lowPrivUser이고 다른 하나는 id가 adminUser입니다. 이 예제에서 lowPrivUser 테스트 세션은 PID 28인 프로세스를 가지고 있고, adminUser 테스트 세션은 PID 34인 프로세스를 가지고 있습니다.
그 다음 두 개의 로그 메시지에서 PID를 상호 연관시켜 보면 lowPrivUser 테스트 세션이 seleniumstandalone_chrome_1이라는 컨테이너를 실행 중이고 adminUser 테스트 세션이 seleniumstandalone_chrome_2라는 컨테이너를 실행 중인 것을 알 수 있습니다.
어떤 테스트 세션이 seleniumstandalone_chrome_[n] 컨테이너 중 어떤 것을 실행할지 보장되지 않으므로, 확실히 하려면 이 연관 기술을 사용하세요.
Selenium 컨테이너에 VNC로 접속하려면 Remmina가 실행 중인 상태에서 위에서 생성한 VNC 항목 중 하나 이상을 더블 클릭하면 브라우저가 상호작용하는 것을 볼 수 있습니다... app-scanner의 Cucumber 테스트 단계가 실제로 해당 지점에 도달했을 때만 가능합니다.
물론 테스트 속도를 늦추거나, 일시 중지하거나, 디버거로 단계별 실행할 수 있습니다. 이러한 세부 사항은 purpleteam wiki의 workflow 페이지에 있습니다.
로컬에서 원한다면 docker stats를 계속 실행하여 어떤 컨테이너가 실행 중인지, 언제 시작되고 중지되는지 확인할 수 있습니다. 또한 다음 명령에 사용할 컨테이너 이름도 제공합니다.
Stage Two 컨테이너 로그를 보려면 컨테이너의 stdout(및 stderr, Docker는 stdout과 stderr를 병합함)을 tail하세요:
docker logs --follow [container-name]
로그를 파일로도 보내려면:
docker logs --follow [container-name] |tee output.log$(date '+%Y-%m-%d_%T')
로그를 터미널로 보지 않고 파일로만 보내려면:
docker logs --follow [container-name] > output.log$(date '+%Y-%m-%d_%T')