はじめに
本記事では、セキュリティインシデント対応訓練やペネトレーションテスト演習を目的とした、意図的に脆弱性を含むWordPress ECサイトの構築手順を解説します。WebサーバーとDBサーバーを分離したよくある構成で、WooCommerceを使用したECサイト「VulnShop」を構築します。
重要な注意事項
- 本環境は個人的な教育・訓練目的のみで使用を想定しいています
- 必ず隔離されたネットワークで構築してください
- インターネットから直接アクセスできないようにしてください(インターネットに公開された途端に、攻撃対象となる可能性が非常に高いです)
- 間違っても実際の顧客データは絶対に使用しないでください
- 間違っても業務上のワークロードが動いている実運用環境では絶対に実施しないでください
環境概要
システム構成
[Webサーバー] ←→ [DBサーバー]
198.51.100.10 198.51.100.11
使用技術スタック
- OS: Ubuntu Server 24.04 LTS
- Webサーバー: Apache 2.4
- スクリプト言語: PHP 8.x
- データベース: MySQL 8.0 / MariaDB 10.x
- CMS: WordPress(最新版)
- ECプラグイン: WooCommerce
ネットワーク設計
本記事では、RFC 5737で定義されたドキュメント用IPアドレス(TEST-NET-2: 198.51.100.0/24)を使用します。
| サーバー | IPアドレス | 役割 |
|---|---|---|
| Webサーバー | 198.51.100.10 | Apache + PHP + WordPress |
| DBサーバー | 198.51.100.11 | MySQL/MariaDB |
1. DBサーバーの構築
1.1 MariaDBのインストール
# システムパッケージの更新
sudo apt update && sudo apt upgrade -y
# MariaDBサーバーのインストール
sudo apt install mariadb-server -y
# MariaDBサービスの起動と自動起動設定
sudo systemctl start mariadb
sudo systemctl enable mariadb
# インストール確認
mysql --version
1.2 MariaDBの初期セキュリティ設定
# セキュリティ設定スクリプト実行
sudo mysql_secure_installation
設定項目:
Enter current password for root: (Enterキー)
Set root password? [Y/n]: Y
New password: your_secure_root_password
Re-enter new password: your_secure_root_password
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y
1.3 WordPressデータベースの作成
# MariaDBにログイン
sudo mysql -u root -p
-- データベース作成
CREATE DATABASE vulnshop_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- データベース用ユーザー作成(Webサーバーからのアクセスを許可)
CREATE USER 'vulnshop_user'@'198.51.100.10' IDENTIFIED BY 'VulnShop2024!';
-- 権限付与
GRANT ALL PRIVILEGES ON vulnshop_db.* TO 'vulnshop_user'@'198.51.100.10';
FLUSH PRIVILEGES;
-- 作成確認
SHOW DATABASES;
SELECT User, Host FROM mysql.user;
-- 終了
EXIT;
1.4 リモート接続の有効化
MariaDBはデフォルトでlocalhostのみリッスンしているため、Webサーバーからの接続を許可します。
# MariaDB設定ファイルを編集
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
変更箇所:
[mysqld]
# bind-addressを変更(localhostから全インターフェースに)
# bind-address = 127.0.0.1
bind-address = 0.0.0.0
# 文字コード設定
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# パフォーマンス設定(訓練環境用)
max_connections = 200
innodb_buffer_pool_size = 256M
# MariaDB再起動
sudo systemctl restart mariadb
# ポート確認(3306でリッスンしていることを確認)
sudo netstat -tlnp | grep 3306
# または
sudo ss -tlnp | grep 3306
期待される出力:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1234/mariadbd
1.5 ファイアウォール設定(オプション)
Firewall を利用している場合は、穴をあけておく
# UFWのインストール(未インストールの場合)
sudo apt install ufw -y
# Webサーバーからのみ3306ポートへのアクセスを許可
sudo ufw allow from 198.51.100.10 to any port 3306 proto tcp
# SSH接続を許可(管理用)
sudo ufw allow 22/tcp
# ファイアウォール有効化
sudo ufw enable
# 確認
sudo ufw status verbose
1.6 接続テスト(別サーバーから)
Webサーバー(198.51.100.10)からDBサーバーへの接続をテストします。
# Webサーバーで実行
# MySQL Clientをインストール
sudo apt install mysql-client -y
# 接続テスト
mysql -h 198.51.100.11 -u vulnshop_user -p vulnshop_db
成功時の出力:
Welcome to the MySQL monitor.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| vulnshop_db |
+--------------------+
2. Webサーバーの構築
2.1 Apache・PHP・必須パッケージのインストール
# システムパッケージの更新
sudo apt update && sudo apt upgrade -y
# Apache2のインストール
sudo apt install apache2 -y
# Apacheサービスの起動と自動起動設定
sudo systemctl start apache2
sudo systemctl enable apache2
# PHPと必須パッケージのインストール
sudo apt install php php-mysql php-curl php-gd php-mbstring \
php-xml php-xmlrpc php-soap php-intl php-zip \
libapache2-mod-php -y
# インストール確認
php -v
apache2 -v
2.2 PHPの設定調整
WordPressとWooCommerceを快適に動作させるため、PHPの設定を調整します。
# PHPバージョンの確認
php -v
# PHP設定ファイルを編集(バージョンは環境に合わせて変更)
sudo vim /etc/php/8.3/apache2/php.ini
変更すべき項目:
; メモリ制限
memory_limit = 256M
; ファイルアップロードサイズ
upload_max_filesize = 64M
post_max_size = 64M
; 最大ファイルアップロード数
max_file_uploads = 20
; 実行時間
max_execution_time = 300
max_input_time = 300
; タイムゾーン
date.timezone = Asia/Tokyo
; エラー表示(訓練環境では有効化)
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
; ログ設定 ※ログの出力可否、出力先はお好みで
log_errors = On
error_log = /var/log/php/error.log
# PHPログディレクトリを作成
sudo mkdir -p /var/log/php
sudo chown www-data:www-data /var/log/php
# Apache再起動
sudo systemctl restart apache2
2.3 Apacheの設定
# 必要なApacheモジュールを有効化
sudo a2enmod rewrite
sudo a2enmod headers
sudo a2enmod expires
sudo a2enmod ssl
# デフォルトサイト設定を編集
sudo vim /etc/apache2/sites-available/000-default.conf
設定内容:
<VirtualHost *:80>
ServerAdmin admin@vulnshop.local
ServerName vulnshop.local
DocumentRoot /var/www/html/vulnshop
<Directory /var/www/html/vulnshop>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# エラーログとアクセスログ
ErrorLog ${APACHE_LOG_DIR}/vulnshop_error.log
CustomLog ${APACHE_LOG_DIR}/vulnshop_access.log combined
# セキュリティヘッダー(訓練環境では意図的に脆弱な設定)
# Header set X-Frame-Options "SAMEORIGIN"
# Header set X-Content-Type-Options "nosniff"
# Header set X-XSS-Protection "1; mode=block"
</VirtualHost>
# Apache設定の文法チェック
sudo apache2ctl configtest
# Apache再起動
sudo systemctl restart apache2
# Apacheの状態確認
sudo systemctl status apache2
2.4 WordPressのダウンロードと配置
# 作業ディレクトリに移動
cd /tmp
# WordPress最新版をダウンロード
wget https://wordpress.org/latest.tar.gz
# ダウンロード確認
ls -lh latest.tar.gz
# 解凍
tar -xvzf latest.tar.gz
# Apacheのドキュメントルートに移動
sudo mv wordpress /var/www/html/vulnshop
# 所有権とパーミッション設定
sudo chown -R www-data:www-data /var/www/html/vulnshop
sudo find /var/www/html/vulnshop -type d -exec chmod 755 {} \;
sudo find /var/www/html/vulnshop -type f -exec chmod 644 {} \;
# wp-contentディレクトリに書き込み権限を付与
sudo chmod -R 775 /var/www/html/vulnshop/wp-content
2.5 wp-config.phpの設定
# サンプル設定ファイルをコピー
cd /var/www/html/vulnshop
sudo cp wp-config-sample.php wp-config.php
# 編集
sudo vim wp-config.php
データベース設定:
<?php
// データベース設定
define('DB_NAME', 'vulnshop_db');
define('DB_USER', 'vulnshop_user');
define('DB_PASSWORD', 'VulnShop2024!');
define('DB_HOST', '198.51.100.11');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
// 認証用ユニークキー(https://api.wordpress.org/secret-key/1.1/salt/ から取得)
// 訓練環境では簡易的なキーでも可
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
// データベーステーブル接頭辞
$table_prefix = 'vs_';
// デバッグモード(基本は無効、必要に応じて有効化)
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', true);
@ini_set('display_errors', 1);
// メモリ制限
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
// 自動保存とリビジョンの設定
define('AUTOSAVE_INTERVAL', 300);
define('WP_POST_REVISIONS', 5);
/* 編集完了 */
require_once ABSPATH . 'wp-settings.php';
# 所有権を確認
sudo chown www-data:www-data /var/www/html/vulnshop/wp-config.php
sudo chmod 644 /var/www/html/vulnshop/wp-config.php
2.6 WordPress初期設定
ブラウザで http://198.51.100.10/ にアクセスし、WordPressのインストールウィザードを実行します。
インストール情報:
サイトのタイトル: VulnShop
ユーザー名: admin
パスワード: (訓練用の弱いパスワード: admin123)
メールアドレス: admin@vulnshop.local
検索エンジンがサイトをインデックスしないようにする: チェックを入れる
2.7 パーマリンク設定
WordPress管理画面にログイン後、パーマリンクを設定します。
これにより .htaccess ファイルが自動生成されます。
# .htaccessの確認
cat /var/www/html/vulnshop/.htaccess
期待される内容:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /vulnshop/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /vulnshop/index.php [L]
</IfModule>
# END WordPress
3. 関連するPluginのインストールと設定
3.1 WooCommerceプラグインのインストール
WordPress管理画面から以下の手順でインストール:
- プラグイン → 新規プラグインを追加
- 検索ボックスに "WooCommerce" と入力
- 今すぐインストール をクリック
- 有効化 をクリック
3.2 WooCommerceセットアップウィザード
有効化すると自動的にセットアップウィザードが起動します。
※ ECサイトの構築自体は、それぞれの訓練での要件に併せて適宜設定される範囲のため、ここでは割愛
3.3 脆弱性を抱えたPluginをインストール
攻撃を成立させるために、脆弱性を抱えたPluginを適宜インストールする
4. まとめ
本記事では、セキュリティ訓練用の脆弱なWordPress ECサイト「VulnShop」の構築手順を解説しました。
構築した環境
- WebサーバーとDBサーバーの分離構成
- WordPress + WooCommerce によるECサイト
- 意図的な脆弱性の導入
- 脆弱なプラグイン etc
参考資料
- WordPress公式ドキュメント
- WooCommerce公式ドキュメント
- OWASP Top 10
- CVE Details - WordPress
- WPScan Vulnerability Database
- RFC 5737 - IPv4 Address Blocks Reserved for Documentation
今後の発展
この環境をベースに、以下のような拡張も考えていきます。(たぶん)
- IDS/IPS(Suricata, Snort 等)の導入
- WAF(ModSecurity 等)の設定
- ログ管理システム(Splunk 等)との連携
- 自動攻撃検知システムの構築
免責事項
本記事で紹介する設定は、個人的な教育・訓練目的でのみ使用することを想定しています。万が一にも、これらの設定を実運用環境で使用することは絶対に避けてください。本記事の内容を利用して発生したいかなる損害についても、著者は一切の責任を負いません。



