はじめに
VPSを契約してOSをインストールしたら、まず最初にやるべきことがあります。それはセキュリティ設定と基本環境の構築です。
この記事では、Debian 12(bookworm)を例に、VPSサーバーの初期構築手順を一から解説します。SSH設定、ファイアウォール、Docker、Nginx、SSL証明書まで、本番運用に必要な設定を網羅しています。
対象読者: VPSを借りて初めてサーバーを構築する方、セキュリティ設定の基本を知りたい方
1. 一般ユーザーの作成
VPSの初期状態では root や debian などのデフォルトユーザーしかありません。まず運用用の一般ユーザーを作成します。
ユーザー作成
# 新しいユーザーを作成
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/TLS | Nginx + Let's Encrypt |
これらの設定を行うことで、安全で管理しやすいサーバー環境が整います。Docker Composeでアプリケーションを管理することで、再現性と保守性を確保できます。