Summary

지난 10월 8일 그리고 이틀 전인 11월 10일 두 번에 걸쳐서 2022 POWER OF XX 대회를 운영하였다.

예/본선 모두 CTF 플랫폼과 문제 인스턴스 등 인프라 전체 관리를 맡았고 약간의 문제(?)를 제외하면 성공적으로 대회를 운영한 것 같다.

이번에 운영했을 때 인프라를 어떻게 구성했는지를 간단하게 썰로 풀어보려고 한다.

Server

Instance Name Description Spec
Main-Server CTFd(v3.5.0) c5.2xlarge(8CPU, 16RAM, SSD 8GIB)
Challenge-Server Ubuntu 22.04 AMD64 c5.4xlarge(16CPU, 32RAM, SSD 32GIB)

우선 서버 인스턴스는 총 2개로 메인 서버 - 문제 서버를 생성해서 사용하였다.

img
[사진 1] 그림에 소질이 없다.. 대충 그림

사진과 같이 Main-Instance <-> Challenge-Server 간 Docker SDK API 를 통해서

인스턴스가 연결되어 있는 구조이고 실제로 참가자들에게 문제를 할당할 때

Main-Instace (Request) -> Challenge Server (Build & Deploy) 되는 구조이다.

즉, 참가팀마다 서로 다른 인스턴스 환경에서 문제를 풀이하게 되고 타 참가팀의 트롤이 불가능하다.

Qualifier

우선 이번 예선전에 참가한 팀은 46팀 (110명) 에 대한 동시 접속에 대한 처리도 생각을 해야 했었다.

그래서 메인 서버에서 돌아가는 CTFd 를 약간 커스텀해서 동시에 처리할 수 있는 thread pull 을 늘려주었고

동시 접속에 대해서 원활하게 처리를 할 수 있었다.

img
[사진 2] 예선전 결과 스코어보드

Final

본선에서는 약 10팀이 올라왔고 인원수로는 45명 정도가 되었다. 예선보다 인원수가 많이 줄었기 때문에

이번 서버 사양은 조금 낮춰서 운영을 해보기로 했다. (실제로 리소스가 어느정도 필요한지 측정을 해놔야하기 때문!)

Instance Name Description Spec
Main-Server CTFd(v3.5.0) c5a.2xlarge(8CPU, 16RAM, SSD 8GIB)
Challenge-Server Ubuntu 22.04 AMD64 c5a.2xlarge(8CPU, 16RAM, SSD 30GIB)

메인 서버 인스턴스는 크게 변화가 없지만 가격대비 가성비가 좀 나오는 사양으로 선택을 했고

문제 인스턴스도 메인 서버쪽과 동일하게 맞췄다. 이렇게 본선 대회 운영을 했는데 대회 진행 시간 내내

인프라 쪽 크게 이슈는 없었다. 이로써 인원수 별 어느정도 리소스가 드는지 대략적으로 지표를 쓸 수 있었기 때문에

다음에도 비슷한 대회 규모가 있다면 문제 없이 운영이 가능할 것 같다.

img
[사진 3] 본선전 결과 스코어보드

본선전 결과는 CyKor (고려대 사국) 소속의 여성 해커분들이 우승을 하셨다.

이번에 본선 대회가 오프라인으로 진행됐기에 퇴근 하고나마 잠깐 대회장에 가서 분위기를 봤는데

정말 아~무 소리없이 다들 문제에만 집중하시는 것을 볼 수 있었다. (열정 good)

대회가 끝나고서는 한 문제를 계속 잡고 계셨던 분이 있는데 아쉽게도 문제를 못푸셨고 매우 아쉬워하시는 모습이 보였다. 😭

다음엔 꼭 문제를 모두 풀 수 있기를 응원하겠습니다! 🙏

ETC

이번에는 대회 안내 메일에 대해서 깨알 자동화 작업을 조금 했는데 다음 대회때도 유용하게 써먹을 수 있을 것 같다.

img
[사진 4] 메일 발송 자동화 툴(python)

참가팀 정보 시트를 파싱해서 CTF 사이트 자동 가입 + 메일 발송까지 한번에 처리할 수 있도록 코드를 짰다.

References

AWS EC2, S3

https://aws.amazon.com/ko/

https://aws.amazon.com/ko/s3/

CTFd

https://github.com/ctfd/ctfd

Docker API

https://docker-py.readthedocs.io/en/stable/