CTFdの構築手順と負荷試験結果について

会社の勉強会でCTFサーバを使用することにしました。
AWSでのCTFdの構築手順はいろいろなサイトで紹介されているのですが、
どのインスタンスタイプでどの程度のアクセス数に耐えられるのか？
という情報が得られなかったので負荷試験の結果と共に記事にしたいと思います。

# 1.構成
AWS上のEC2(インスタンスタイプ：t3.xlarge(4vcpu:16GBmem))1台構成。
1台の中で
docker compose up でCTDdを起動し、
docker外部のNginxをリバースプロキシサーバとして利用します。

# 2.構築手順
### 2-1.EC2作成
AWSのEC2でAMIは(Ubuntu Server 24.04 LTS)でインスタンスを起動。
お金が掛かるので構築中はt3.microで起動します。

### 2-2.CTFdの構築

最新版のCTFｄをダウンロードして展開
```
wget https://github.com/CTFd/CTFd/archive/refs/tags/3.7.0.zip
```

unzipのインストール
```
sudo apt install unzip
```
unzipで展開
```
unzip 3.7.0.zip
```
```
cd CTFd-3.7.0
pwd
/home/ubuntu/CTFd-3.7.0
```
```
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
```
```
# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
docker-composeなかったので入れる
```
sudo apt install docker-compose
```
```
cd CTFd

# 領域展開
sudo docker compose up -d
```

ブラウザでCTFdを起動したサーバの8000番ポートにアクセス
```
http://[サーバのIP]:8000
```
CTFdの初期セットアップ画面が確認出来たら一旦CTFdを落とします
```
sudo docker compose down
```

nginx/http.confの修正
```
sudo vi /home/ubuntu/CTFd-3.7.0/conf/nginx/http.conf
```
```
server {
listen 80;
↓
listen 8080;
に変更
```
docker-compose.ymlの修正
```
cd /home/ubuntu/CTFd-3.7.0

sudo vi docker-compose.yml
```
```
ports:
      - 80:80
↓
ports:
      - 8080:8080
に修正
```
```
sudo cd /home/ubuntu/CTFd-3.7.0/CTFd

# 再び領域展開
sudo docker compose up -d
```
### 2-3.Nginxの設定
Nginxのインストール
```
sudo apt install -y nginx
```
自己証明書の作成
```
sudo mkdir /etc/nginx/ssl
sudo openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key

sudo chown root:root -R /etc/nginx/ssl/
sudo chmod 600 /etc/nginx/ssl/*
sudo chmod 700 /etc/nginx/ssl
```
BASIC認証の設定
```
sudo apt-get install apache2-utils

# .htpasswdファイルの作成(ユーザ名hogeで作成)
sudo htpasswd -c /etc/nginx/.htpasswd hoge
(設定したいパスワードを2回入力)
```
Nginxのconfig設定
```
sudo vi /etc/nginx/sites-available/default
```
Nginxのconfig(サーバのIPを123.456.789.123とした場合)
```
server {
    listen 80;
    server_name 123.456.789.123;
    return 301 https://123.456.789.123$request_uri;
    
}

server {
    listen 443;
    server_name 123.456.789.123;
    ssl on;
    ssl_certificate /etc/nginx/ssl/nginx.pem;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    
    client_max_body_size 10M;
    
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    
    proxy_set_header Authorization "";
    
    location / {
      
        auth_basic "Please enter your ID and password.";
        auth_basic_user_file "/etc/nginx/.htpasswd";
        proxy_pass http://127.0.0.1:8000;
        
        proxy_set_header Authorization "";
    }
    
}
```
コンフィグテスト
```
sudo nginx -t
```
Nginxサービスの再起動
```
sudo systemctl restart nginx
```
### 2-4.CTFdの初期設定
Web画面で直観的にわかるので問題の登録なども済ませて下さい。

# 3.負荷試験

### 3-1.試験方法
負荷試験ツールJmeterで負荷試験を行いました。

### 3-2.試験条件
CTFdサーバのEC2インスタンスタイプ：t3.xlarge(4vcpu:16GBmem)
Win11PCにインストールしたJmeterよりインターネット経由で
CTFdのTOPページ(BASIC認証は通過させて)に対して負荷を掛けました。

JMeter設定条件
スレッド数：800
Ramp-UP：60sec
ループ回数：1回
で1分間に800ユーザが1回ずつ(13.33PV/sec)アクセスする試験としました。

### 3-2.試験結果
負荷試験中のCPU使用率は6.7%程度とまだまだ余裕があり、
レスポンスタイムも95%Lineで100msと良く、Error%も0%とエラーも出ませんでした。

# 4.まとめ
意外にもBASIC認証の設定で苦戦したのですが、会社の人の協力で解消することが出来ました。
勉強会の参加人数はおそらく40人～60人位だろうと聞いているので
アクセス数についてはt3.xlargeで十分使用に耐えられそうという結果になりました。
勉強会の講師、頑張ります。