サーバー構築

Debian VPSサーバー構築ガイド — SSH・UFW・Docker・Nginx・SSL

はじめに

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で無料証明書を取得・自動更新