Fedora Serverのインストールと初期設定:絶対に省けない重要な手順

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

現実的な問題:サーバーをインストールしたが、まだ使える状態ではない

初めて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分かかり、すべての手順は次回のために自動化することができます。

学んだ教訓:インシデントが発生してからハードニングを行うのではなく、インストール直後にすぐ実施すること — 後々の多くの問題を防ぐことができます。

Share: