Docker 로 AZURE PlayFab 구현하기

WONY_yoon·2025년 12월 16일

CVE-2025-59247 AZURE PlayFab 취약점 재현 준비

MACos 환경에서 구현

1. 사전 준비 및 설치

1.1. 필요 도구 확인 / 설치

Docker 설치 확인

Docker Download
docker --version
docker-compose --version

Python3 설치 확인

python3 --version
pip3 --version

curl 확인

curl --version

git 확인

Git Download
여기서는 GitHub 정보들 활용 예정
git --version

Node.js 확인

Node.js Download
node --version

1.2. PlayFab 계정 생성 및 설정

1. 계정 만들기

PlayFab → 'Sign Up Free' 로 진행

2. 첫 번째 타이틀(게임) 만들기

3. Title ID 확인

→ Title ID : 1B9990
→ 메모장에 복사해두기

2. 로컬 개발 환경 구축

2.1. 작업 폴더 만들기

mkdir ~/PlayFab
cd ~/PlayFab

2.2. PlayFab 샘플 코드 다운로드

git clone https://github.com/PlayFab/MpsSamples.git
cd MpsSamples/wrappingGsdk

다운로드 완료 시 폴더 구조

PlayFab/
└── MpsSamples/
    └── wrappingGsdk/
        ├── wrapper/        (PlayFab GSDK 통합 코드)
        ├── fakegame/       (간단한 테스트 서버)
        └── Dockerfile      (Docker 설정 파일)

2.3. LocalMultiplayerAgent 다운로드

LocalMultiplayerAgent는 로컬에서 PlayFab 서버를 테스트하는 도구

  1. https://github.com/PlayFab/MpsAgent/releases 방문
  2. 최신 버전의 'LocalMultiplayerAgent.zip' 다운로드
  3. PlayFab 폴더에 압축 풀기
  4. 압축 푼 폴더 이름을 'LocalMultiplayerAgent'로 변경

3. 첫 번째 게임 서버 만들기

3.1. FakeGame 개요

MpsSamples에 포함된 'fakegame'서버의 기능

  • 포트 80에서 실행
  • /hello 경로로 접속하면 'Hello from fake game!' 응답
  • /hello/terminate 경로로 서버 종료 가능

3.2. 코드 파일 구조

fakegame/Program.cs - 간단한 웹 서버

// 포트 80에서 웹 서버 시작
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls("http://*:80");
var app = builder.Build();

// /hello 경로
app.MapGet("/hello", () => "Hello from fake game!");

// 서버 실행
app.Run();

wrapper/Program.cs - PlayFab GSDK 통합

// PlayFab SDK 시작
GameserverSDK.Start(true);

// 서버 준비 완료 알림
GameserverSDK.ReadyForPlayers();

// 게임 서버 프로세스 시작 및 대기
var process = new Process();
process.StartInfo.FileName = "./fakegame/fakegame";
process.Start();
process.WaitForExit();

4. Docker 컨테이너로 패키징

Docker 컨테이너로 만들기

4.1. Dockerfile 이해하기

wrappingGsdk 폴더에 있는 Dockerfile의 내용

# .NET 8.0 SDK 사용 (중요: 3.1이 아님!)
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /source

# 프로젝트 파일 복사 및 복원
COPY fakegame/*.csproj ./fakegame/
COPY wrapper/*.csproj ./wrapper/
RUN dotnet restore ./fakegame && dotnet restore ./wrapper

# 전체 코드 복사 및 빌드
COPY fakegame/ ./fakegame/
COPY wrapper/ ./wrapper/
RUN dotnet publish ./fakegame -c release -o /fakegamepublish --self-contained -r linux-x64
RUN dotnet publish ./wrapper -c release -o /wrapperpublish --self-contained -r linux-x64

# 최종 이미지
FROM ubuntu:18.04

# 사용자 생성
RUN useradd --system ue
USER ue

EXPOSE 80/tcp
WORKDIR /app

# 빌드된 파일 복사
COPY --from=build --chown=ue:ue /fakegamepublish ./fakegame
COPY --from=build --chown=ue:ue /wrapperpublish .

# 서버 실행
USER root
CMD chown -R ue.ue $PF_SERVER_LOG_DIRECTORY && su ue -c ./wrapper

중요‼️ DockerFile 첫 줄 확인 필요!

FROM mcr.microsoft.com/dotnet/core/sdk:3.1로 되어 있다면,
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build 로 반드시 변경!

내용 해석

  • FROM : 기본 운영체제 선택 (Ubuntu 18.04)
  • RUN useradd : 보안을 위해 일반 사용자 생성
  • EXPOSE : 외부에서 접속할 포트 번호
  • WORKDIR : 컨테이너 안에서 파일이 저장될 위치
  • COPY : 여러분의 파일을 컨테이너 안으로 복사
  • CMD : 컨테이너 시작 시 실행할 명령어

4.2. Docker 이미지 빌드하기

Docker 이미지 빌드

cd ~/PlayFab/MpsSamples/wrappingGsdk

# Docker 이미지 빌드 (첫 실행 시 5-10분 소요)
docker build -t myfirstgame:v1 .

명령어 설명

  • docker build: Docker 이미지를 만드는 명령어
  • -t myfirstgame:v1: 이미지 이름과 버전 태그
    → myfirstgame: 이미지 이름
    → v1: 버전 번호
  • . (점): 현재 폴더에서 Dockerfile 찾기

성공 메세지

Successfully tagged myfirstgame:v1

4.3. 빌드한 이미지 확인

docker images

5. 로컬에서 테스트하기

클라우드에 배포하기 전, 로컬에서 제대로 작동하는지 테스트!!

5.1. Docker 네트워크 생성

Step 1 : Docker 네트워크 생성

docker network create playfab

Step 2 : 서버 실행

  1. 포그라운드 실행
docker run -it --rm \
  --network playfab \
  -p 56100:80 \
  myfirstgame:v1 \
  /app/fakegame
  1. 명령어 설명
  • -it: 인터랙티브 모드 (로그를 바로 볼 수 있음)
  • --rm: 종료 시 컨테이너 자동 삭제
  • --network playfab: PlayFab 네트워크에 연결
  • -p 56100:80: 로컬 56100 포트를 컨테이너 80 포트로 연결
  1. 성공시 나타나는 로그

Step 3 : 서버 테스트

  1. curl로 확인
  2. 브라우저로 확인
  3. 여러 번 호출해보기

Step 4 : 서버 관리 명령어

  1. 실행 중인 컨테이너 확인
    docker ps
  2. 서버 중지
    포그라운드로 실행한 경우 : Ctrl + C 누르기
    백그라운드로 실행한 경우 : bashdocker stop playfab-test
  3. 서버 삭제
    docker rm playfab-test
  4. 서버 재시작
    docker restart playfab-test

Step 4 : 문제 해결

  1. 포트가 이미 사용 중
    증상 :Error: port 56100 already in use
    해결 :
# 포트 사용 중인 프로세스 확인
lsof -i :56100

# 프로세스 종료
kill -9 [PID]

# 또는 다른 포트 사용
docker run -p 56101:80 myfirstgame:v1
  1. 컨테이너가 즉시 종료됨
    해결 :
# 종료된 컨테이너 확인
docker ps -a

# 로그 확인하여 오류 파악
docker logs playfab-test
  1. 네트워크 연결 오류
    증상 : Error: network playfab not found
    해결 : docker network create playfab

6. PlayFab 클라우드에 배포

6.1. PlayFab Container Registry 접속

유료라 따로 진행하지는 않고 과정만 명시

  1. PlayFab 대시보드 로그인 (https://playfab.com)
    → MyFisrtGame 들어가기
  2. 왼쪽 메뉴에서 'Multiplayer' → 'Servers' 선택
  3. 'New Build' 버튼 클릭
  4. Build 정보 입력:
    → Build Name: MyFirstGameBuild
    → VM Selection: Dasv4 (2 cores)
    → Servers per machine: 1
  5. Server Details 섹션:
    → Server Type: Container
    → Operating System: Linux
  6. 'Upload to container registry' 버튼 클릭
  7. 표시되는 Azure Username 복사 (예: customer12345.azurecr.io)
  8. 'Copy Docker Login Command' 클릭하여 명령어 복사

6.2. Docker 이미지 업로드

유료라 따로 진행하지는 않고 과정만 명시

Step 1: Azure Container Registry 로그인

docker login customer12345.azurecr.io -u customer12345 -p <password>

Step 2: 이미지 태그 변경

docker tag myfirstgame:v1 customer12345.azurecr.io/myfirstgame:v1
⚠️ 주의 : customer12345를 실제 Azure Username으로 변경

Step 3: 이미지 업로드

docker push customer12345.azurecr.io/myfirstgame:v1

업로드 성공 메시지:

v1: digest: sha256:abc123... size: 1234

6.3. Build 설정 완료

  1. PlayFab 웹사이트로 돌아가기
  2. 'Container image' 옆의 'Refresh' 버튼 클릭
  3. 드롭다운에서 방금 업로드한 이미지 선택:
    → Image: myfirstgame
    → Tag: v1
  4. Network 섹션:
    → Port name: gameport
    → Port: 80
    → Protocol: TCP
  5. Regions 섹션:
    → Region: 가장 가까운 지역 선택 (예: Japan East)
    → Standby servers: 1
    → Max servers: 2
  6. 'Add Build' 버튼 클릭
  7. Build Status가 'Deploying' → 'Deployed'로 변경될 때까지 대기 (5-10분)

6.4. 서버 할당 및 테스트

Build가 'Deployed' 상태가 되면

  1. 'Servers' 탭 클릭
  2. 'Request Server' 버튼 클릭
  3. Build 선택: MyFirstGameBuild
  4. Preferred Regions: 선택한 지역
  5. 'Request' 클릭
  6. 할당된 서버 정보 확인
    → IP Address (예: 20.194.123.45)
    → Port (예: 30001)

터미널에서 서버 테스트

curl http://20.194.123.45:30001/hello

0개의 댓글