会社の勉強会で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の構築
最新版のCTFdをダウンロードして展開
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で十分使用に耐えられそうという結果になりました。
勉強会の講師、頑張ります。