Docker로 CTFd 구축하기

Docker로 CTFd 구축하기

in

CTFd는 “Capture The Flag daemon”의 약자로, 정보 보안 기술을 경쟁적으로 연습하고 향상시키기 위한 웹 기반 플랫폼입니다. 정보 보안 관련 대회인 Capture The Flag (CTF)를 운영하고 관리하는 데 사용되며, 문제 생성, 점수 관리, 참가자 진행 상황 추적 등을 지원합니다.

도커 설치

Ubuntu 22.04 LTS으로 환경 구축 후 다운로드를 진행하였습니다. 인터넷에 Ubuntu 환경에 도커를 설치하는 과정이 매우 상세히 나와있기 때문에 도커 설치는 넘어가도록 하겠습니다.

1. CTFd 저장소 가져오기

git clone https://github.com/CTFd/CTFd.git
cd CTFd


2. Docker Compose으로 환경 구축

head -c 64 /dev/urandom > .ctfd_secret_key
vi docker-compose.yml

services:
	ctfd: ... 
		environment:
			- SECRET_KEY=file:.ctfd_secret_key
			...

CTFd 공식 문서에서 나온대로 head -c 64 /dev/urandom > .ctfd_secret_key으로 Flask의 secret key를 랜덤한 값으로 생성하여 compose 파일에 반영합니다.

docker-compose up -d

이후 localhost:8000으로 접근하여 웹 페이지가 잘 뜨는지 확인합니다.

3. CTFd Plugin 설정

저는 여러 CTF 사이트들 처럼 컨테이너에 문제 환경을 구성하여 각 사용자 별로 개별 문제 환경을 제공하려고 합니다. 그러긴 위해선 CTFd Plugin을 사용해야 합니다. 몇 개를 찾아본 결과, phannhat17의 CTFd-Docker-Plugin이 잘 되는 것을 확인하였습니다.

cd ~

git clone https://github.com/phannhat17/CTFd-Docker-Plugin.git
cp -r ./CTFd-Docker-Plugin ./CTFd/CTFd/plugins/containers

CTFd 디렉터리에서 나온 다음, 해당 CTFd-Docker-Plugin 저장소를 다운로드하여 CTFdplugins 디렉터리에 복사하였습니다.

vi ./CTFd/requirements.txt

...
docker
paramiko
apscheduler
...

CTFd-Docker-Plugin/requirements.txt에서 사용하는 파이썬 라이브러리를 확인하여 CTFd/requirements.txt에 추가합니다.

vi ./CTFd/docker-compose.yml

services:
	ctfd: ... 
		volumes:
			- /var/run/docker.sock:/var/run/docker.sock
			...
vi /lib/systemd/system/docker.service

...
[Service] Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required 
# for containers run by docker 
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock 
ExecReload=/bin/kill -s HUP $MAINPID 
TimeoutStartSec=0
RestartSec=2
Restart=always
....

CTFd 서비스에서 Docker 데몬을 제어하기 위해 compose 파일에 docker.sock를 추가하였습니다. 또한 systemctl에서 동작 시 TCP 포트 2375와 Unix 소켓을 활성화하는 옵션(# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock)을 넣었습니다.

service dockerd restart

cd CTFd
docker-compose down
docker-compose build
docker-compose up -d

설정한 값을 반영하기 위해 docker 데몬 재시작 및 compose를 다시 올립니다.

이후, CTFd Admin에 접근하여 상단 메뉴의 Plugins > Containers로 이동하여 Settings 버튼을 클릭합니다.

설정에서 Docker Host와 컨테이너 만료 시간, 최대 램/CPU 설정을 하고 Submit를 클릭합니다.

설정이 잘 되었으면, 문제 생성 페이지 내 Image 항목에서 도커에 저장된 Image들을 확인할 수 있습니다.