現実的な問題:サーバーをインストールしたが、まだ使える状態ではない
初めてFedora ServerをVPSにセットアップしたとき、インストールが完了した直後の感覚は「終わった、使おう」というものでした。しかし3日後、ログにはポート22へのブルートフォース試行が数百件記録され、rootログインへの試みが絶え間なく続いており、ファイアウォールはルールをほとんど設定していなかったため、ほぼ何もブロックできていない状態でした。
Fedora Serverは「インストールするだけで安全」なディストリビューションではありません。クリーンな基盤は提供してくれますが、セキュリティ、ユーザー管理、ネットワークサービスなど残りのすべては自分で設定する必要があります。Fedoraをメインの開発マシンとして2年間使ってきて、パッケージの更新速度にはかなり満足していますが、サーバーとして運用する場合は追加の設定手順が必要です。
原因の分析:なぜFedora Serverのデフォルト設定では不十分なのか
Fedoraは防御的な事前設定よりも柔軟性を優先しています。最小限のインストール後、デフォルトでは以下のような状態になっています:
- SSHデーモンが稼働中で、デフォルトではパスワード認証が許可されています — ブルートフォース攻撃に脆弱です。
- firewalldは有効ですが、デフォルトゾーン
publicでは多くの不要なサービスが開放されています。 - SELinuxはEnforcingモード — セキュリティには有効ですが、エラーが発生したとき原因を理解せずに無効化してしまう人が多いです。
- fail2banがない — ブルートフォース攻撃がブロックされることなく永遠に試行できます。
- 一部の設定ではrootアカウントのSSHが無効化されていない。
問題はFedoraにあるのではなく、多くの人が「後でやること」として初期ハードニングの手順を省いてしまうことにあります。
解決策
方法1:Ansibleで自動化する
複数のサーバーを管理している場合、Ansibleは合理的な選択肢です。プレイブックを一度作成すれば、すべての設定が完了します。デメリット:初心者には学習コストが高く、YAMLとモジュールの構文を事前に理解する必要があります。
方法2:ワンタイムシェルスクリプト
すべての設定を行うbashスクリプトを作成し、プロビジョニング後に実行します。Ansibleよりも速いですが、メンテナンスが難しく、十分にテストしないとバグが発生しやすいです。
方法3:手動で一つ一つ設定する(初心者向け推奨)
時間はかかりますが、各手順が何をしているかを理解できます。後でエラーが発生したとき、どこを確認すればよいかがわかります。これは自分が最初に始めたときの方法で、デバッグが必要な場合には今でも使っています。
最善の方法:ステップバイステップの初期設定手順
ステップ1:Fedora Serverのインストール
Fedoraの公式サイトからISOをダウンロードします。インストール時は、不要なパッケージを避けるために最小限の構成でFedora Server Editionを選択します。インストール中に、rootパスワードを設定し、非rootユーザーも作成します。
初回起動後、すぐにシステムを更新します:
sudo dnf update -y
sudo reboot
rebootする理由:カーネルが更新された場合、新しいカーネルを使用するために再起動が必要です。
ステップ2:ユーザーの作成とsudo権限の付与
rootアカウントはインストール後もシステム上に存在しますが、直接使用するのは悪い習慣です — コマンドを一つ間違えると、チェックポイントなしでサーバー全体を削除してしまう可能性があります。専用のユーザーを作成してsudo権限を付与します:
# 新しいユーザーを作成する
useradd -m -s /bin/bash sysadmin
passwd sysadmin
# wheelグループに追加(FedoraのSudo)
usermod -aG wheel sysadmin
# 確認
id sysadmin
これ以降は、このユーザーでログインし、rootは使用しません。
ステップ3:SSHを適切に強化する
SSHはサーバーへの唯一の入口であり、最も攻撃を受けやすい場所でもあります。かつてこの手順をスキップして、毎日数千行のブルートフォースログと夜間の異常なCPUスパイクという代償を払いました。
まず、ローカルマシンからサーバーにSSH公開鍵をコピーします(ローカルマシンで実行):
# ローカルマシンで実行
ssh-keygen -t ed25519 -C "[email protected]"
ssh-copy-id sysadmin@your_server_ip
次に、サーバー上のSSH設定ファイルを編集します:
sudo nano /etc/ssh/sshd_config
以下の行を見つけて修正します:
Port 2222 # デフォルトポートを変更する(任意だがノイズが減る)
PermitRootLogin no # SSHでのrootログインを禁止する
PasswordAuthentication no # SSH鍵のみを使用する
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
# SSHを再起動する(現在のセッションは閉じないこと)
sudo systemctl restart sshd
# 新しいターミナルを開き、古いセッションを閉じる前に接続を確認する
ssh -p 2222 sysadmin@your_server_ip
注意:SSHポートを変更した場合は、sshdを再起動する前にそのポートをファイアウォールで開放する必要があります。この手順を省略すると、自分自身がサーバーから締め出されます。
ステップ4:firewalldの設定
Fedoraはゾーンベースのアプローチでfirewalldを使用しています。慣れると、このアプローチはかなり便利です。
# 現在のゾーンを確認する
sudo firewall-cmd --get-active-zones
# 現在のルールを確認する
sudo firewall-cmd --list-all
# SSHポートを2222に変更した場合
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-service=ssh # 古いポート22のルールを削除する
# 必要なものだけを開く(例:Webサーバー)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# リロードして適用する
sudo firewall-cmd --reload
# 再確認
sudo firewall-cmd --list-all
ステップ5:SELinuxを維持する — 無効にしないこと
Stack OverflowやLinuxフォーラムの数十のガイドが「面倒を避けるためにSELinuxを無効にせよ」と言っています。私はその意見に賛成しません。SELinuxは第二の防御層です — RCE脆弱性のあるWebアプリを通じて攻撃者が最初の防御層をバイパスした場合でも、これがブロックします。
# SELinuxのステータスを確認する
sudo sestatus
# Enforcingモードであることを確認する
sudo getenforce
SELinux関連のエラーが発生した場合は、無効にする代わりにaudit2allowを使用して分析します:
# SELinuxのdenyログを確認する
sudo ausearch -m avc -ts recent
# setroubleshootをインストール済みの場合はsealertを使う
sudo sealert -a /var/log/audit/audit.log
ステップ6:fail2banのインストール
fail2banはN回のログイン失敗後に自動的にIPをブロックします。自分のサーバーでは、このツールが1日平均80〜150のIPをブロックしています — そのほとんどがボットネットからの自動スキャンボットです。
# インストール
sudo dnf install fail2ban -y
# ローカル設定ファイルを作成する(元のファイルは編集しない)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[sshd]セクションを追加または編集します。Fedoraはsystemd-journaldを使用しているため、バックエンドを明示的に指定する必要があります:
[sshd]
enabled = true
port = 2222
filter = sshd
backend = systemd
maxretry = 3
bantime = 3600
findtime = 600
# サービスを有効化して起動する
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# ステータスを確認する
sudo fail2ban-client status sshd
ステップ7:自動セキュリティアップデートの設定
Fedoraにはセキュリティアップデートを自動的にインストールするためのdnf-automaticがあります:
sudo dnf install dnf-automatic -y
# 設定を変更:セキュリティアップデートのみダウンロードする
sudo nano /etc/dnf/automatic.conf
[commands]
upgrade_type = security
apply_updates = yes
# タイマーを有効化する
sudo systemctl enable --now dnf-automatic.timer
sudo systemctl status dnf-automatic.timer
設定後の総合確認
# 実行中のサービスを確認する
sudo systemctl list-units --type=service --state=running
# リッスン中のポートを確認する
sudo ss -tlnp
# 最近のログインログを確認する
sudo journalctl -u sshd --since "1 hour ago"
# fail2banが動作しているか確認する
sudo fail2ban-client status
以上の7つのステップが完了したら、サーバーは基本的な本番環境として十分な状態になります。新しいサーバーでこの手順を完了するのに通常30〜45分かかり、すべての手順は次回のために自動化することができます。
学んだ教訓:インシデントが発生してからハードニングを行うのではなく、インストール直後にすぐ実施すること — 後々の多くの問題を防ぐことができます。

