워게임 구조

Dreamhack 워게임은 만약 문제를 동작시키기 위해 별도의 서버를 필요로 하는 경우(예: 리모트 서버, 웹 서버) 해당 문제를 해결하기 위해 각 유저를 대상으로 별도의 가상 환경을 제공합니다. 해당 가상 환경을 공격하여 사용자는 Flag를 획득하고, 문제에 따른 점수를 획득합니다.

  • 사용자가 VM을 필요로 하는 문제를 도전하려고 할 때 새로운 VM 인스턴스가 생성되며 각 유저에게 독자적으로 제공됩니다.
    • 이를 통해 문제를 도전 중인 여러 사용자의 상태가 간섭되는 것을 방지합니다.
  • 워게임 서버의 임의의 포트가 배정되며, Specfile에 정의된 포트로 포워딩됩니다.
    • 포트는 TCP와 UDP를 지원합니다.
    • 각 문제는 여러 개의 포트를 Expose 할 수 있지만, 워게임 서버에서 순차적인 포트를 배정하지 않을 수 있습니다.
      예를 들어, Specfile에서 Expose 하기로 지정한 포트가 8080/tcp,8081/tcp 과 같은 연속된 포트여도, 시스템에서 배정하는 포트는 10254/tcp,10532/tcp 와 같이 연속적이지 않을 수 있습니다.

서버 설정

Dreamhack 문제가 제공하는 서버는 아래의 설정을 기반으로 동작하며, 문제는 해당 환경 아래에서 반드시 호환성을 테스트해야 합니다.

  • 모든 문제 VM은 Firecracker microVM 아래에서 동작합니다.
  • 문제를 만든 사람이 제공한 image를 빌드한 container가 문제의 VM으로 사용됩니다.
  • Container는 문제를 만든 사람이 명시한 Dockerfile를 기반으로 생성됩니다.
  • 문제의 Repository 내 Specfile에 문제 VM이 필요로 하는 최소의 CPU, 메모리, 디스크 크기가 설정되어야 합니다.
    • 문제를 만드는 사람의 별도 요청에 따라 변경될 수 있습니다.
  • 문제 VM은 CPU 사용량 제한이 걸려 있습니다. (전체 서버의 CPU 사용량 중 약 10% 규모)
    • 부팅 과정은 예외로 CPU 사용량 제한이 해제됩니다.
  • VM 자체의 메모리 사용량에 의해 최소 메모리 필요 용량은 128MB입니다.
  • 디스크 크기는 image를 빌드하기 위한 공간을 포함해야합니다.
    • 문제를 만드는 사람이 직접 Dockerfile을 테스트하여 필요한 공간의 크기를 알고 있어야 합니다.
    • docker images 명령어를 통해 Docker image의 크기를 알 수 있습니다.

문제 구성 관리

Dreamhack은 문제의 버전 관리의 용이함을 위해 Git을 내부적으로 사용하고 있습니다.

  • 문제가 생성됨과 동시에 실제 Git Repository가 서버에 생성되며 관리됩니다.
  • 문제 출제자가 문제를 개발하는 과정 중 원하는 상태의 커밋을 tag하고 웹페이지를 통해 Deploy할 수 있습니다.
    • 이 과정을 통해 문제 출제자와 Dreamhack 스탭들이 쉽게 기록을 통해 발생한 서버 문제를 해결할 수 있습니다.
  • Git Repository는 현재 128MB의 크기 제한이 있습니다.
  • Git을 사용하지 않고 웹페이지만을 사용하여 문제의 버전을 업로드 할 수 있습니다.
  • 웹페이지를 사용하여 업로드하는 경우 전송된 파일을 자동으로 커밋한 후 upload-1과 같은 태그를 부여합니다.
  • 웹페이지를 통해 커밋하는 것과 Git을 통해 커밋하는 것은 차이가 없으며, Dreamhack 내부에서 동일하게 관리합니다.
  • Deploy를 요청하기 전에 반드시 설정된 값이 정상적인지 검사해야 하며, 웹페이지에서 검사를 요청할 수 있습니다.
  • Test 과정이 완료되면 Dockerfile을 포함한 문제인 경우 image를 빌드합니다.
  • 만약 image를 재생성 및 재배포해야 하는 경우 새로운 Tag를 부여하여 빌드해야 합니다.
  • Test 과정과 image 빌드 과정이 모두 끝나면 "Live" 버전으로 배포할 수 있게 됩니다.
  • 유저가 문제의 정보를 요청하는 경우 문제를 만든 사람이 기술한 문제의 "Live" 버전의 정보를 받게 됩니다.