最低限のセキュリティ設定
これは脅しではありません。公開して数分後には、ログに攻撃の記録が残り始めます。最初の10分でやることを順番に。
VPSにグローバルIPが付いた瞬間から、そのアドレスは世界中のスキャナに補足されます。
これは比喩ではありません。設定後に /var/log/auth.log を確認すれば、公開から数時間で数百から数千件のログイン試行が記録されているのが分かります。
以下を順番に実行してください。所要時間は10分程度です。
1. 一般ユーザーを作る
rootで日常作業をしないための準備です。
# ユーザーを作成(対話でパスワードを設定)
adduser myuser
# sudo 権限を与える
usermod -aG sudo myuser
Debian系以外では sudo グループが wheel のことがあります。
鍵を新しいユーザーにコピーする
rootで鍵認証を設定していた場合、そのままでは新ユーザーで入れません。
# root の鍵をコピーして所有者を変える
rsync --archive --chown=myuser:myuser ~/.ssh /home/myuser/
ここで一度、別のターミナルから新ユーザーでログインできることを確認してください。
ssh myuser@<IPアドレス>
2. SSHのパスワード認証を無効化する
これが最も効果の大きい対策です。 鍵認証だけにすれば、総当たり攻撃は原理的に成立しなくなります。
sudo nano /etc/ssh/sshd_config
次の3項目を設定します。
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
最近のディストリビューションでは /etc/ssh/sshd_config.d/ 配下の設定ファイルが優先されることがあります。そちらに PasswordAuthentication yes が残っていると無効化されないので確認してください。
# 上書きしている設定がないか確認
sudo grep -r "PasswordAuthentication" /etc/ssh/
# 設定に文法エラーがないか検証してから反映
sudo sshd -t && sudo systemctl restart ssh
sshd -t は文法チェックです。これを省くと、設定ミスでSSHが起動しなくなり締め出されます。 必ず実行してください。
3. ファイアウォールを設定する
必要なポート以外を全部閉じます。
sudo apt install -y ufw
# 先に SSH を許可する(これを忘れると締め出される)
sudo ufw allow OpenSSH
# 既定の方針: 入力は拒否、出力は許可
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 有効化
sudo ufw enable
sudo ufw status verbose
用途に応じてポートを開けます。
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 25565/tcp # Minecraft
事業者側のファイアウォールも使う
VultrやLinodeには、OSの外側にファイアウォール機能があります(Linodeは無料)。二重にしておくと、OS側の設定を壊しても守られます。 管理画面から設定できるので、あわせて有効にしておくことを推奨します。
4. 自動セキュリティ更新を有効にする
放置していると、既知の脆弱性が残り続けます。
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
有効になっているか確認します。
cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Unattended-Upgrade "1"; があれば有効です。
5. fail2ban を入れる(推奨)
鍵認証のみにしていれば必須ではありませんが、ログの汚染とリソースの無駄な消費を減らせます。
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
# 状態を確認
sudo fail2ban-client status sshd
既定の設定でSSHの保護が有効になります。何度も失敗したIPが一定時間ブロックされます。
6. 攻撃されていることを実際に見る
設定が済んだら、少し時間を置いてログを見てください。
# ログイン試行の失敗を数える
sudo grep "Failed password" /var/log/auth.log | wc -l
# 攻撃元のIPを多い順に
sudo grep "Failed password" /var/log/auth.log \
| awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
# 試されたユーザー名
sudo grep "Invalid user" /var/log/auth.log \
| awk '{print $8}' | sort | uniq -c | sort -rn | head
root、admin、ubuntu、test、oracle といったユーザー名が延々と試されているのが見えるはずです。
パスワード認証を無効化していれば、これらは全て無意味な試行です。これがこの作業の意味です。
チェックリスト
よくある事故
| 事故 | 原因 | 予防策 |
|---|---|---|
| SSHから締め出された | 確認前に設定を反映した | 別ターミナルで接続確認してから閉じる |
| ufw有効化で切断された | SSH許可の前に有効化した | ufw allow OpenSSH を先に |
| sshdが起動しなくなった | 設定ファイルの文法エラー | sshd -t で検証してから再起動 |
| 秘密鍵を失った | 手元マシンの故障・初期化 | 鍵を安全な場所にバックアップ |
| パスワード認証が無効化されない | sshd_config.d/ の設定が優先 | grep -r で全設定を確認 |
いずれの場合も、事業者のWebコンソールから復旧できます。管理画面のどこにコンソール機能があるかを、事前に確認しておいてください。
よくある質問
本当に攻撃されるのですか
されます。インターネット上のIPアドレスは常時スキャンされており、SSHのポート22は最も狙われるポートの一つです。/var/log/auth.log を見れば、公開して数時間で数百〜数千件のログイン試行が記録されているのが確認できます。
SSHのポートを変えれば安全ですか
総当たり攻撃のログは減りますが、本質的な対策ではありません。ポートスキャンで見つけられるためです。ポート変更よりも、パスワード認証を無効化して鍵認証のみにするほうが遥かに効果的です。
rootで作業してはいけないのはなぜですか
操作ミスが即座に致命傷になるためです。またrootログインを許可していると、攻撃者は「root」というユーザー名が存在することを前提に総当たりできます。一般ユーザーを作り、必要なときだけsudoを使ってください。
fail2banは必須ですか
鍵認証のみにしていれば必須ではありません。ただしログの汚染を防ぎ、リソースの無駄な消費を減らす効果があります。導入コストが低いので入れておくことを推奨します。