Linuxサーバーのハードニング:初心者向け包括的セキュリティチェックリスト

Security tutorial - IT technology blog
Security tutorial - IT technology blog

問題提起:なぜLinuxサーバーのセキュリティは重要なのか?

今日のLinuxサーバーは強力で柔軟であり、広く普及しています。しかし、その力には無数の脅威から保護する責任が伴います。セキュリティが不十分なサーバーは悪意のある攻撃者の標的となりやすく、データ損失、サービス中断、さらには違法行為に悪用される可能性があります。

以前、私の個人サーバーが真夜中にSSHのブルートフォース攻撃を連続して受けたことがあります。警告を受けてすぐに起き上がり、不審なIPアドレスをブロックし、SSH設定を強化する緊急対応をしました。この経験から、私は痛い教訓を学びました。「後悔先に立たず」の諺のように、常に最初からセキュリティを設定しておくべきだということです。この記事では、Linuxサーバーを効果的に「ハードニング」(セキュリティ強化)するための包括的なチェックリストを提供します。

核となる概念:サーバーのハードニングとは?

サーバーのハードニング(セキュリティ強化)とは、システムの「攻撃対象領域」を縮小するための対策と設定を実装することです。主な目的は、サーバーをより侵入されにくく、悪用されにくくすることです。

具体的には、悪用されやすい不要な機能、サービス、設定を削除または無効化します。同時に、残りのコンポーネントに対する防御策を強化します。簡単に言えば、ハードニングはあなたのサーバーを「多くの開いた窓がある家」から「堅固な要塞」に変え、必要な入り口だけを厳重に警備するようなものです。

私たちが警戒すべき一般的な脅威は以下の通りです。

  • SSHなどのサービスへのブルートフォース攻撃。
  • パッチが適用されていないソフトウェアのセキュリティ脆弱性の悪用。
  • 不要な開かれたネットワークポートを介した不正アクセス。
  • マルウェアまたは悪意のあるコードへの感染。
  • 情報漏洩や権限昇格を許す設定ミス。

詳細な実践:包括的なLinuxサーバーセキュリティチェックリスト

1. システムの定期的な更新

この手順を軽視しないでください。これは非常に基本的ですが、非常に重要です。開発者は常にセキュリティパッチをリリースしています。オペレーティングシステムとサーバー上のすべてのソフトウェアを定期的に更新することで、既知の脆弱性から保護されます。

解決策:

定期的な更新(毎日または毎週)を実行します。Debian/Ubuntuでは、以下のコマンドを使用します。


sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y

CentOS/RHELでは、以下のコマンドを使用します。


sudo dnf update -y
sudo dnf autoremove -y

カーネルを更新した後、変更を有効にするためにサーバーを再起動することをお勧めします。


sudo reboot

2. SSHのセキュリティ:重要なゲートウェイ

SSH (Secure Shell) は、サーバーをリモートで管理するための主要なプロトコルであり、同時にブルートフォース攻撃の「主要な標的」でもあります。適切なSSH設定は、リスクを大幅に軽減するのに役立ちます。

解決策:

SSH設定ファイル/etc/ssh/sshd_configを編集します。編集する前に常にファイルをバックアップしてください。


sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

以下のオプションを変更します。

  • rootアカウントでのログインを無効にする:攻撃者はブルートフォース攻撃を行う際、最初にrootアカウントを狙うことがよくあります。この機能を無効にしましょう。
  • 
    PermitRootLogin no
    
  • デフォルトのSSHポートを変更する(22番から別のポートへ):これは絶対的なセキュリティ対策ではありませんが、ポート22を狙った自動ポートスキャン攻撃の大部分を回避するのに役立ちます。
  • 
    Port 2222 # 22番以外のランダムなポートを選択します。例:2222
    
  • パスワード認証ではなくSSHキー認証を使用する:これが最も強力なSSHセキュリティ方法です。SSHキーはパスワードよりもはるかに長く複雑であり、ブルートフォース攻撃を受けにくいです。
  • 
    PasswordAuthentication no
    PubkeyAuthentication yes
    

    SSHキーペアを作成するには、ローカルマシンでssh-keygenコマンドを使用し、その後公開鍵(.pub)をssh-copy-id user@your_server_ipでサーバーにコピーするか、ユーザーの~/.ssh/authorized_keysファイルに手動でコピーします。

  • ブルートフォース攻撃対策にFail2banをインストールする:Fail2banは非常に便利なツールです。システムログを監視し、SSHのログイン試行が連続して失敗するなど、不審な動作をするIPアドレスを自動的にブロックします。
  • 
    sudo apt install fail2ban -y # Debian/Ubuntu
    # sudo dnf install fail2ban -y # CentOS/RHEL
    
    sudo systemctl enable fail2ban
    sudo systemctl start fail2ban
    

    元の設定に影響を与えずにFail2banをカスタマイズするためのローカル設定ファイルを作成します。

    
    sudo nano /etc/fail2ban/jail.local
    

    以下の内容を追加します(bantimemaxretryは必要に応じて調整してください)。

    
    [sshd]
    enabled = true
    port = 2222 # 変更したSSHポートを正しく設定してください
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 3
    bantime = 1h
    

編集後、SSHサービスを再起動することを忘れないでください。


sudo systemctl restart sshd

そしてFail2banのステータスを確認します。


sudo fail2ban-client status sshd

3. ファイアウォールの設定(UFW/Firewalld)

ファイアウォールは、サーバーへのネットワークアクセスを厳密に制御する最初の防衛線として機能します。ここでの黄金律は、真に必要なポートのみを開放し、それ以外はすべて閉じることです。

解決策:

Ubuntu/DebianではUFW(Uncomplicated Firewall)を、CentOS/RHELではFirewalldを使用します。

UFW(Ubuntu/Debian)の場合:


sudo apt install ufw -y

sudo ufw enable # ファイアウォールを有効にする(注意:SSHポートがすでに開いていることを確認してください)
sudo ufw default deny incoming # すべての着信接続をデフォルトで拒否
sudo ufw default allow outgoing # すべての発信接続をデフォルトで許可

# 必要なポートを許可:
sudo ufw allow 2222/tcp # 変更したSSHポート
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS

sudo ufw status verbose # ステータスを確認

Firewalld(CentOS/RHEL)の場合:


sudo dnf install firewalld -y

sudo systemctl enable firewalld
sudo systemctl start firewalld

sudo firewall-cmd --permanent --zone=public --add-port=2222/tcp # 変更したSSHポート
sudo firewall-cmd --permanent --zone=public --add-service=http # ポート80
sudo firewall-cmd --permanent --zone=public --add-service=https # ポート443

sudo firewall-cmd --reload # 変更を適用
sudo firewall-cmd --list-all # ステータスを確認

4. ユーザーと権限の管理

常に「最小権限の原則」(Principle of Least Privilege)に従ってください。これは非常に重要です。この原則によれば、各ユーザーとサービスには、そのタスクを完了するために必要な権限のみが付与されるべきです。

解決策:

  • 日常業務にはroot以外のユーザーアカウントを使用する:管理タスクを実行する必要がある場合にのみsudoを使用してください。
  • 使用されていないアカウントを削除する:古くて非アクティブなアカウントは、深刻なセキュリティ脆弱性となる可能性があります。それらを放置しないでください。
  • 
    sudo deluser --remove-home username
    
  • 強力なパスワードを設定する:大文字、小文字、数字、特殊文字を組み合わせた長いパスワードの使用を要求します。同時に、ユーザーに定期的なパスワード変更を強制すべきです。
  • ファイルとディレクトリの権限を適切に設定する:機密性の高い設定ファイルは、必要なユーザーのみが読み取れるようにしてください。
  • 
    # 例:所有者のみが読み書き権限を持ち、グループは読み取り権限、他には権限なし
    sudo chmod 640 /etc/ssh/sshd_config
    
    # 例:所有者のみが読み書き実行権限を持ち、グループと他には読み取り実行権限のみ
    sudo chmod 755 /var/www/html
    

5. 不要なサービスを無効にする

サーバー上で動作する各サービスは、攻撃者によって悪用される潜在的なリスクを抱えています。不要なサービスを無効にすることで、攻撃対象領域を大幅に縮小できます。

解決策:

実行中のすべてのサービスを一覧表示します。


sudo systemctl list-units --type=service --state=running

次に、不要なサービスを特定し、停止/無効化します。


sudo systemctl stop <service_name>
sudo systemctl disable <service_name>

例:サーバーをメールサーバーとして使用しない場合、PostfixまたはSendmailを停止できます。同様に、Sambaを使用しない場合は無効にしてください。

6. システムログの確認と監視

システムログには、ログイン、ファイルアクセスからシステムエラーまで、サーバー上のすべての活動が記録されます。ログを定期的に確認することで、異常な動作や攻撃の兆候を早期に発見できます。

解決策:

ログインログを確認します。


cat /var/log/auth.log | grep "Failed password" # Ubuntu/Debian
cat /var/log/secure | grep "Failed password" # CentOS/RHEL

journalctlで概要ログを確認します。


sudo journalctl -xe # 最新のシステムログとエラーの詳細を表示
sudo journalctl -f # リアルタイムでログを監視

大規模なシステムでは、ELKスタックやGrafana Lokiなどの集中型ログ監視ツールを検討すべきです。これにより、ログの管理と分析がはるかに容易になります。

7. 定期的なデータバックアップ

サーバーがどんなに厳重に保護されていても、リスクは常に潜んでいます。定期的なデータバックアップは、セキュリティまたはハードウェアの障害が発生した場合に、運用を回復するための最後の「救命策」です。

解決策:

自動的かつ定期的なバックアップを設定します。rsynctarなどのツール、またはクラウドバックアップソリューションを使用します。バックアップは別の安全な場所に保管してください。


# 例:ウェブディレクトリを別のドライブにバックアップする
sudo rsync -avz /var/www/html/ /mnt/backup_drive/web_backup_$(date +%Y%m%d)/

バックアップが必要なときにスムーズに機能することを確認するために、常にデータ復元プロセスをテストすることを忘れないでください。

結論

Linuxサーバーのセキュリティは「一度行えば終わり」の作業ではありません。これは常に警戒し、知識を更新し、時間とともに調整していく継続的な旅です。この包括的なハードニングチェックリストに従うことで、サーバーに最も堅牢な防御層を装備したことになります。情報セキュリティを常に最優先事項としてください。積極的にシステムを保護することで、将来的に不必要な多くの問題や損害を避けることができます。

Share: