サーバー構築

VPSサーバー初期構築ガイド — Debian 12 + Docker + セキュリティ設定

はじめに

VPSを契約してOSをインストールしたら、まず最初にやるべきことがあります。それはセキュリティ設定基本環境の構築です。

この記事では、Debian 12(bookworm)を例に、VPSサーバーの初期構築手順を一から解説します。SSH設定、ファイアウォール、Docker、Nginx、SSL証明書まで、本番運用に必要な設定を網羅しています。

対象読者: VPSを借りて初めてサーバーを構築する方、セキュリティ設定の基本を知りたい方

1. 一般ユーザーの作成

VPSの初期状態では rootdebian などのデフォルトユーザーしかありません。まず運用用の一般ユーザーを作成します。

ユーザー作成
# 新しいユーザーを作成
sudo useradd -m -s /bin/bash maru

# パスワードを設定
sudo passwd maru

# sudo権限を付与
sudo usermod -aG sudo maru

SSH公開鍵の設定

ローカルマシンの公開鍵をサーバーに登録して、パスワードなしでSSH接続できるようにします。

サーバー側で実行
# 新ユーザーに切り替え
su - maru

# .sshディレクトリ作成
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 公開鍵を登録(ローカルの公開鍵を貼り付け)
echo 'ssh-ed25519 AAAA... your@email.com' > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
重要: SSH接続テストが成功するまで、デフォルトユーザーは削除しないでください。ロックアウトの危険があります。

デフォルトユーザーの削除

新ユーザーでSSH接続できることを確認したら、デフォルトユーザーを削除します。

デフォルトユーザー削除
# 接続テスト(ローカルから)
ssh maru@サーバーIP

# テスト成功後、デフォルトユーザーを削除
sudo userdel -r debian

2. SSH セキュリティ強化

SSHはサーバーへの入り口です。デフォルト設定のままでは攻撃されやすいため、以下の設定を行います。

/etc/ssh/sshd_config の編集
# ポート番号を変更(22番は攻撃の標的になりやすい)
Port 3715

# rootログインを禁止
PermitRootLogin no

# パスワード認証を無効化(公開鍵のみ)
PasswordAuthentication no

# 認証試行回数の制限
MaxAuthTries 3

# 認証タイムアウトを短縮
LoginGraceTime 30

# X11転送を無効化
X11Forwarding no
設定を反映
sudo systemctl restart sshd
注意: ポートを変更する場合は、先にファイアウォールで新しいポートを許可してからSSHDを再起動してください。ロックアウトの危険があります。

3. ファイアウォール(UFW)の設定

UFWで不要なポートをブロックし、必要なポートだけを開放します。

UFWの設定
# UFWのインストール
sudo apt install -y 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

# UFWを有効化
sudo ufw enable

# 状態確認
sudo ufw status

4. Fail2Ban の導入

Fail2Banは不正なログイン試行を検知して自動的にIPをブロックするツールです。

Fail2Banの設定
# インストール
sudo apt install -y fail2ban

# 設定ファイル作成
sudo tee /etc/fail2ban/jail.local <<EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3

[sshd]
enabled = true
port = 3715
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
EOF

# 有効化・起動
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban

これで3回ログインに失敗したIPは1時間ブロックされます。

5. Docker のインストール

アプリケーションのコンテナ化にDockerを使います。公式リポジトリからインストールします。

Docker CE インストール
# 必要パッケージのインストール
sudo apt install -y 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 -y docker-ce docker-ce-cli containerd.io   docker-compose-plugin

# ユーザーをdockerグループに追加
sudo usermod -aG docker $USER

6. Nginx + SSL証明書の設定

NginxをリバースプロキシとしてDockerコンテナの前段に配置し、Let's EncryptでSSL証明書を取得します。

Nginx + Certbot インストール
sudo apt install -y nginx certbot python3-certbot-nginx
sudo systemctl enable nginx

Nginx サイト設定

/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 Strict-Transport-Security "max-age=63072000" always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-Frame-Options DENY always;

    location / {
        proxy_pass http://localhost:3000;
        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;
    }
}
SSL証明書の取得
# サイト有効化
sudo ln -s /etc/nginx/sites-available/example.com   /etc/nginx/sites-enabled/

# Certbot でSSL証明書取得
sudo certbot --nginx -d example.com -d www.example.com

# 自動更新の確認
sudo certbot renew --dry-run

7. Docker Compose でアプリをデプロイ

アプリケーションを docker-compose.yml で定義し、起動します。

docker-compose.yml の例
services:
  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: myapp
      POSTGRES_PASSWORD: secure_password
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myapp"]
      interval: 5s
      timeout: 3s
      retries: 5

  web:
    build: .
    ports:
      - "8080:8000"
    environment:
      - DATABASE_HOST=db
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

volumes:
  postgres_data:
起動コマンド
# ビルド&起動
docker compose up -d --build

# ログ確認
docker compose logs -f web

# 状態確認
docker ps

まとめ

VPSサーバーの初期構築で行うべき設定をまとめます。

項目内容
ユーザー管理一般ユーザー作成、デフォルトユーザー削除
SSH強化ポート変更、root禁止、パスワード認証無効化
ファイアウォールUFWで必要ポートのみ許可
侵入防止Fail2Banで不正ログイン自動BAN
コンテナDocker CE + Docker Compose
SSL/TLSNginx + Let's Encrypt

これらの設定を行うことで、安全で管理しやすいサーバー環境が整います。Docker Composeでアプリケーションを管理することで、再現性と保守性を確保できます。