VPSを借りた直後から、攻撃者のスキャンはもう始まっています。
IPアドレスが割り当てられた瞬間、自動化されたボットが22番ポートを叩き続けるのがインターネットの現実です。「設定は後でいいか」では済まない世界です。
この記事では、Linuxサーバーを新規立ち上げたときに必ず実施すべきセキュリティ設定を、25項目のチェックリスト形式で解説します。コマンドは実際に動く具体的な形で記載し、RHEL系(AlmaLinux・Rocky Linux)とDebian系(Ubuntu)の両対応を心がけています。
なぜ「後回し」が危険なのか
セキュリティ調査の観測データによると、パブリックIPを持つサーバーに最初のSSHブルートフォース試行が来るまでの時間は、平均で数分以内とされています。
攻撃者が使うのは人力ではありません。22番ポートを開いているIPを自動スキャンし、root / admin / ubuntu などよく使われるユーザー名に対して辞書攻撃を仕掛けるボットネットです。デフォルト設定のままのサーバーは、「鍵を差しっぱなしで駐車場に止めた車」と同じ状態です。
以下のチェックリストは、筆者がインフラ構築を担当するときに毎回確認する内容をベースにしています。1台ずつ手作業で設定することを前提に、理由も含めて解説します。
フェーズ1: ユーザー管理とroot保護(5項目)
1. 管理者用の一般ユーザーを作成する
クラウドやVPSの多くは、root または ubuntu / ec2-user などで初回ログインします。まず自分専用の管理ユーザーを作成し、以降はそのユーザーでログインするようにします。
# 管理ユーザーを作成(例: adminuser) useradd -m -s /bin/bash adminuser # パスワードを設定 passwd adminuser
2. sudo権限を付与する
# RHEL系(AlmaLinux / Rocky Linux) usermod -aG wheel adminuser # Ubuntu / Debian系 usermod -aG sudo adminuser
3. rootへの直接SSHログインを禁止する
rootへの直接ログインを許可していると、ユーザー名が「root」と確定しているため、パスワードさえ突破されれば即座に最高権限を取られます。
/etc/ssh/sshd_config を編集します。
# 変更: yes → no PermitRootLogin no
編集後は systemctl reload sshd で設定を反映します。
4. SSH公開鍵認証を設定する
パスワード認証は辞書攻撃で突破される可能性があります。自分のPCで鍵ペアを生成し、公開鍵をサーバーに登録します。
自分のPCで実行する操作:
# 鍵ペアを生成(ed25519 が現在の推奨アルゴリズム) ssh-keygen -t ed25519 -C "your_email@example.com" # 公開鍵をサーバーにコピー ssh-copy-id -i ~/.ssh/id_ed25519.pub adminuser@サーバーIP
5. パスワード認証を無効にする
公開鍵認証での接続が確認できたら、パスワード認証を完全に無効にします。これがブルートフォース対策で最も効果的な一手です。
# /etc/ssh/sshd_config PasswordAuthentication no ChallengeResponseAuthentication no # RHEL系 KbdInteractiveAuthentication no # Ubuntu系 # 設定を反映 systemctl reload sshd
注意: パスワード認証を無効にする前に、必ず鍵認証で接続できることを別のターミナルで確認してください。設定ミスでロックアウトされると、VPSコントロールパネルのコンソールから復旧する必要があります。
フェーズ2: SSH接続のさらなる強化(6項目)
6. SSHのデフォルトポート(22番)を変更する
ポート変更だけでは根本的な解決にはなりませんが、自動スキャンボットのほとんどが22番ポートを対象にしているため、ノイズを大幅に減らせます。
# /etc/ssh/sshd_config # デフォルト: #Port 22 → 任意のポート番号に変更 Port 2222
SELinuxを使っている環境では、変更後のポートを許可する設定も必要です。
# RHEL系(SELinux環境) semanage port -a -t ssh_port_t -p tcp 2222
7. 認証試行回数を制限する
# /etc/ssh/sshd_config # デフォルト: 6 → 3 に減らす MaxAuthTries 3 # 同時セッション数も絞る MaxSessions 3
8. ログイン可能ユーザーをホワイトリスト化する
# /etc/ssh/sshd_config # SSH接続を許可するユーザーを明示的に指定 AllowUsers adminuser
9. X11転送を無効にする
GUIを使わないサーバーでX11転送を有効にしておく理由はありません。不要な機能は閉じておきます。
# /etc/ssh/sshd_config X11Forwarding no
10. 接続タイムアウトを設定する
放置されたSSHセッションを自動切断します。
# /etc/ssh/sshd_config # 120秒(2分)応答がなければ接続を切断 ClientAliveInterval 120 ClientAliveCountMax 2
11. fail2banでブルートフォースを自動遮断する
不審なログイン試行が続いたIPを自動的にブロックするツールです。
# インストール(Ubuntu) apt install fail2ban -y # インストール(RHEL系) dnf install fail2ban -y # 設定ファイルを作成 cat > /etc/fail2ban/jail.local << 'EOF' [sshd] enabled = true port = 2222 maxretry = 3 bantime = 3600 findtime = 600 EOF systemctl enable --now fail2ban
フェーズ3: ファイアウォールの設定(4項目)
12. firewalldを有効にする
# RHEL系 systemctl enable --now firewalld # Ubuntu系(ufw) ufw enable
13. 不要なサービスをデフォルトゾーンから削除する
# 現在の設定を確認 firewall-cmd --list-all # デフォルトゾーンを public に設定 firewall-cmd --set-default-zone=public # 不要なサービスを削除(例: dhcpv6-client) firewall-cmd --permanent --remove-service=dhcpv6-client firewall-cmd --reload
14. 必要なポートのみ許可する
# 変更後のSSHポートを許可 firewall-cmd --permanent --add-port=2222/tcp # Webサーバーとして使う場合はHTTP/HTTPSも許可 firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https # 設定を反映 firewall-cmd --reload
15. 意図しないポートが開いていないか確認する
# 現在 LISTEN 中のポートを確認 ss -tlnp # 想定外のプロセスがないか目視確認 ss -tlnp | awk '{print $1, $4, $6}'
フェーズ4: パッケージ管理と自動更新(3項目)
16. システムを最新状態にアップデートする
既知の脆弱性が修正されたパッチを適用するのが、コスト対効果の最も高いセキュリティ対策です。
# RHEL系 dnf update -y # Ubuntu系 apt update && apt upgrade -y
17. 不要なパッケージを削除する
インストールされているソフトウェアが多いほど、脆弱性を抱えるリスクが上がります。使っていないものは削除します。
# RHEL系: 依存関係で不要になったパッケージを削除 dnf autoremove -y # Ubuntu系 apt autoremove -y
18. セキュリティパッチの自動適用を設定する
# RHEL系: dnf-automatic をインストール dnf install dnf-automatic -y # apply_updates = yes に変更 sed -i 's/^apply_updates = no/apply_updates = yes/' /etc/dnf/automatic.conf systemctl enable --now dnf-automatic.timer # Ubuntu系 apt install unattended-upgrades -y dpkg-reconfigure -plow unattended-upgrades
フェーズ5: ログと監視の設定(4項目)
19. rsyslogが動作していることを確認する
systemctl status rsyslog # ログが正常に記録されているか確認 tail -f /var/log/auth.log # Ubuntu系 tail -f /var/log/secure # RHEL系
20. auditdを有効にして特権操作を記録する
auditd はLinuxカーネルレベルの監査フレームワークです。重要なシステム操作の証跡を残します。
# インストールと有効化 dnf install audit -y # RHEL系 apt install auditd -y # Ubuntu系 systemctl enable --now auditd # 基本ルール: sudo コマンドの実行を記録 auditctl -a always,exit -F path=/usr/bin/sudo -F perm=x
21. ログのリモート転送を検討する
サーバーが侵害された場合、攻撃者はまずローカルのログを消去しようとします。ログを外部サーバーに転送しておくことで、侵害後の調査が格段に楽になります。
rsyslog を使ったリモートログ転送については、姉妹サイト LinuxMaster.JP の解説記事も参考にしてください。
22. ログローテーションの設定を確認する
# ローテーション設定を確認 cat /etc/logrotate.conf # ディスク使用量も確認 df -h /var/log
フェーズ6: 追加ハードニング(3項目)
23. 不要なサービスを停止・無効化する
# 起動中のサービス一覧を確認 systemctl list-units --type=service --state=running # 不要なサービスを停止・無効化(例) systemctl stop avahi-daemon systemctl disable avahi-daemon # サーバー用途で不要になりやすいサービス # avahi-daemon … ネットワーク自動検出(mDNS) # cups … 印刷サービス # bluetooth … Bluetooth デーモン
24. sysctlでカーネルのセキュリティパラメータを設定する
# /etc/sysctl.d/99-security.conf を作成 cat >> /etc/sysctl.d/99-security.conf << 'EOF' # IPスプーフィング対策(パケットの送信元検証を有効化) net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # ICMPリダイレクトを無効化(経路情報の改ざん防止) net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # SYN flood 対策(SYNクッキーを有効化) net.ipv4.tcp_syncookies = 1 # コアダンプ(クラッシュ時のメモリダンプ)を制限 fs.suid_dumpable = 0 EOF sysctl -p /etc/sysctl.d/99-security.conf
25. SUID/SGIDビット付きファイルを棚卸しする
SUID/SGID が設定されたファイルは特権昇格の踏み台になる可能性があります。初期状態を記録しておくと、後から不審なファイルが追加された際にすぐ気づけます。
# SUID/SGIDビット付きファイルを一覧表示 find / -perm /6000 -type f -ls 2>/dev/null # 結果をファイルに保存(後からの比較用) find / -perm /6000 -type f -ls 2>/dev/null > /root/suid_sgid_baseline.txt
/bin/ping、/usr/bin/passwd など正規のファイルは問題ありません。見覚えのないファイルが含まれていれば要調査です。
中小企業でも今日からできること
「25項目は多すぎる」と感じた方向けに、まず優先的に実施すべき5項目を挙げます。
・rootの直接ログイン禁止(項目3): 設定1行で対応できる、最も効果的な対策
・SSH鍵認証の設定(項目4): 自分のPCで鍵ペアを作って公開鍵を登録するだけ
・パスワード認証の無効化(項目5): 鍵認証が確認できたら即実施
・firewalldで不要ポートを閉じる(項目13・14): 攻撃面を最小化
・システムアップデート(項目16): 既知の脆弱性を即座に塞ぐ
この5項目を実施するだけで、大半の自動化攻撃を防ぐことができます。残りの項目は、運用が安定してから順番に対応していけば十分です。
よくある誤解と注意点
「クラウドのセキュリティグループがあるからfirewalldは不要」
クラウドのセキュリティグループはネットワーク層での制御です。OS内部のプロセスが意図せずポートを開いた場合、セキュリティグループでは検知できません。OS側のfirewalldと組み合わせて多層防御にするのが正しい設計です。
「SSHのポートを変更すれば安全」
ポート変更はノイズを減らす効果はありますが、ポートスキャンで発見されてしまいます。鍵認証との組み合わせが前提であり、ポート変更単体でセキュリティを担保できるわけではありません。
「fail2banがあればパスワード認証のままでいい」
fail2banは試行回数を制限するものです。パスワード認証そのもののリスクを消すわけではありません。鍵認証への移行が最優先で、fail2banはその補完として使うものです。
「初期設定が終わったら安心」
初期設定はあくまでスタートラインです。定期的なアップデート適用、ログの確認、新たな脆弱性へのパッチ適用を継続することで初めてセキュリティが維持されます。一度設定して終わりにしないことが重要です。
本記事のまとめ
Linuxサーバーの初期セキュリティ設定25項目を表にまとめます。
| フェーズ | 主な設定項目 | 優先度 |
|---|---|---|
| フェーズ1: ユーザー管理 | 管理ユーザー作成・root直接ログイン禁止・SSH鍵認証・パスワード認証無効 | ★★★ 最優先 |
| フェーズ2: SSH強化 | ポート変更・MaxAuthTries・AllowUsers・X11無効・タイムアウト・fail2ban | ★★★ 最優先 |
| フェーズ3: ファイアウォール | firewalld有効化・不要サービス削除・必要ポートのみ許可・ポート確認 | ★★★ 最優先 |
| フェーズ4: パッケージ管理 | OS更新・不要パッケージ削除・自動更新設定 | ★★☆ 重要 |
| フェーズ5: ログ監視 | rsyslog確認・auditd有効化・リモートログ転送・ログローテーション確認 | ★★☆ 重要 |
| フェーズ6: 追加ハードニング | 不要サービス停止・sysctlパラメータ設定・SUID/SGID棚卸し | ★☆☆ 推奨 |
セキュリティは「やったら終わり」ではありません。定期的なレビューと継続的な改善があって初めて維持できるものです。まずは優先度★★★の項目から着手し、確実に実施することから始めてください。
「Linuxセキュリティ」の記事を読む
このテーマに関連する解説記事を一覧でまとめています。あわせてご覧ください。
