はじめに
VPSを借りたら、Webアプリを公開するためにサーバーの初期設定が必要です。この記事では、Debian 12をベースに、セキュリティ対策からDocker・Nginx・SSL証明書の導入まで、本番環境を構築する手順を解説します。
この記事の構成は、さくらVPSでの実際の構築手順をもとにしています。他のVPSプロバイダでも基本的な手順は同じです。
1. SSHセキュリティの強化
VPSを借りたら最初にSSHの設定を変更し、不正アクセスを防ぎます。
SSHポートの変更
デフォルトのポート22は攻撃対象になりやすいため、別のポートに変更します。
sudo vi /etc/ssh/sshd_config
# 以下を変更
Port 3715
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no
注意: SSHポートを変更する前に、ファイアウォールで新しいポートを許可してください。でないとSSH接続ができなくなります。
公開鍵認証の設定
パスワード認証を無効にし、公開鍵認証のみに制限します。
# ローカルPCで鍵を生成
ssh-keygen -t ed25519 -C "your-email@example.com"
# 公開鍵をサーバーに転送
ssh-copy-id -p 3715 user@your-server-ip
2. ファイアウォール(UFW)の設定
UFWで必要なポートのみを開放し、不要な通信を遮断します。
sudo apt install ufw
# デフォルトポリシー
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 必要なポートを開放
sudo ufw allow 3715/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
# 有効化
sudo ufw enable
sudo ufw status
3. Fail2Banの導入
ブルートフォース攻撃を自動でブロックするFail2Banを設定します。
sudo apt install fail2ban
sudo vi /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
[sshd]
enabled = true
port = 3715
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
4. Dockerのインストール
Docker公式リポジトリからインストールします。
# 依存パッケージ
sudo apt install ca-certificates curl gnupg
# Docker公式GPGキー追加
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# リポジトリ追加
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable" | sudo tee /etc/apt/sources.list.d/docker.list
# インストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# ユーザーをdockerグループに追加
sudo usermod -aG docker \$USER
5. Nginxリバースプロキシの設定
ホストのNginxでSSL終端を行い、Dockerコンテナにリバースプロキシします。
sudo apt install nginx
sudo vi /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
return 301 https://\$host\$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options DENY always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://127.0.0.1:8080;
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-Proto \$scheme;
}
}
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
6. SSL証明書の取得(Let's Encrypt)
Certbotを使って無料のSSL証明書を取得します。
sudo apt install certbot python3-certbot-nginx
# 証明書の取得
sudo certbot --nginx -d example.com -d www.example.com
# 自動更新の確認
sudo certbot renew --dry-run
Certbotはcronで自動更新が設定されるため、証明書の期限切れを気にする必要はありません。
7. Docker Composeでアプリをデプロイ
docker-compose.ymlを作成し、アプリケーションを起動します。
services:
web:
build: .
ports:
- "8080:8000"
environment:
- SECRET_KEY=your-secret-key
- DEBUG=false
restart: unless-stopped
db:
image: postgres:16-alpine
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: myapp
POSTGRES_USER: myapp
POSTGRES_PASSWORD: secure-password
restart: unless-stopped
volumes:
db_data:
# ビルド&起動
docker compose up -d --build
# ログ確認
docker compose logs -f web
まとめ
VPSの初期設定で重要なポイントは以下の通りです。
- SSH: ポート変更 + 公開鍵認証 + root ログイン禁止
- ファイアウォール: UFWで必要なポートのみ開放
- 不正アクセス対策: Fail2Banでブルートフォース攻撃を自動ブロック
- Docker: アプリケーションをコンテナ化して管理
- Nginx: リバースプロキシでSSL終端
- SSL: Let's Encryptで無料証明書を取得・自動更新