インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

セキュリティ実践CVE fail2ban aide 講座33

公開

Linuxエンジニア養成講座 第33回|全36回・フェーズ4「サーバー構築と運用」の6回目(6/9回目)です。
前回: 第32回で Prometheus + node_exporter による監視を体験し、「ユーザーが気づく前にエンジニアが検知する」という監視の設計思想を学びました。
今回学ぶこと: CVE の読み方、セキュリティアップデート、fail2ban による攻撃緩和、aide によるファイル改ざん検知を実践します。

前回の予告で「CVE の読み方、dnf update --security によるセキュリティアップデート、fail2ban や aide を使ったセキュリティ対策を扱います。第3回で学んだセキュリティ意識の基本を、具体的なツールと手順で実践する回です」とお伝えしました。第3回ではパスワード管理や情報の取り扱いといった「意識」を学びましたが、今回はその意識を「ツールと手順」で具体化します。

この記事を読み終えると、以下のことができるようになります。

  • CVE 番号の意味を理解し、dnf updateinfo でセキュリティ通知を確認できる
  • dnf update --security でセキュリティアップデートの対象を把握できる
  • fail2ban を導入し、SSH ブルートフォース攻撃への自動防御を設定できる
  • aide でファイルのベースラインを作成し、改ざん検知の仕組みを構築できる
目次
  1. なぜセキュリティ運用が必要か
  2. CVE の読み方とセキュリティアップデート
    1. CVE とは
    2. セキュリティ通知の確認
    3. セキュリティアップデートのドライラン
    4. dnf-automatic で自動化する
    5. 現場のヒヤリハット: 「動いているから」でアップデートを放置
  3. fail2ban で SSH ブルートフォース攻撃を防ぐ
    1. インストールと起動
    2. 現在の jail 状態を確認する
    3. sshd jail の設定
  4. aide でファイル改ざんを検知する
    1. aide の仕組み
    2. インストール
    3. ベースラインの初期化
    4. チェックの実行
    5. 改ざん検知のテスト
    6. ベースラインの定期更新
  5. やってみよう
  6. クリーンアップ
  7. まとめと次回予告
  8. 理解度チェック

なぜセキュリティ運用が必要か

サーバーを構築して終わりではありません。なぜ運用フェーズでもセキュリティを意識し続ける必要があるのか、考えてみてください。

ソフトウェアの脆弱性は日々発見されています。昨日まで安全だったサーバーが、今日公開された脆弱性によって攻撃対象になることがあります。攻撃者は自動ツールでインターネット上の脆弱なサーバーを探し回っており、パッチが当たっていないサーバーを見つけると即座に攻撃を仕掛けてきます。

攻撃が成功すると何が起きるでしょうか。ユーザーの個人情報やクレジットカード情報が漏洩する。ランサムウェアで業務データが暗号化され事業が停止する。情報漏洩の規模によっては賠償金と信用失墜で企業の存続すら危うくなります。セキュリティ運用は「技術的な作業」ではなく、ユーザーのデータを守り、事業を存続させるための責任です。パッチ1つの放置が、最悪の場合、会社を潰しかねません。

セキュリティは「一度設定すれば終わり」ではなく、継続的に守り続ける運用です。そのためには複数の防御層を組み合わせる「多層防御」の考え方が重要です。今回学ぶ3つのツールは、この多層防御の中でそれぞれ異なる役割を担います。

  • CVE / セキュリティアップデート: 脆弱性の特定と修正 — 既知の脆弱性にパッチを当てる
  • fail2ban: 攻撃の自動緩和 — ブルートフォース攻撃を検知して自動的にブロックする
  • aide: 侵害の検知 — ファイルが改ざんされていないか定期的に確認する

これらの対策に共通する設計思想がアタックサーフェス(攻撃対象面)の最小化です。アタックサーフェスとは、攻撃者がシステムに侵入できる「入口」の総面積のことです。

このシリーズで学んできたセキュリティ対策を振り返ると、すべてアタックサーフェスの縮小につながっています。

  • 第20回 firewalld — 不要なポートを閉じる = 入口を減らす
  • 第27回 sshd ハードニング — パスワード認証を無効化、root ログイン禁止 = 入口を狭める
  • 第28回 SELinux — プロセスのアクセス範囲を制限 = 侵入後の被害を限定
  • 今回: CVE パッチ = 既知の入口を塞ぐ、fail2ban = 残った入口への攻撃を緩和、aide = 侵入されたことを検知

セキュリティ対策の本質は「攻撃者が使える入口を減らし、残った入口を守り、万が一突破されても気づける」ことです。

アタックサーフェスの最小化。左列に攻撃の入口(開いたポート、未修正の脆弱性、パスワード認証、無制限のアクセス)、右列に対策(firewalld、CVEパッチ、sshdハードニング、SELinux)を対比。さらにfail2banで攻撃を緩和し、aideで侵入を検知する

CVE の読み方とセキュリティアップデート

もしセキュリティアップデートをしなかったら何が起きるか、考えてみてください。脆弱性が公開されると、攻撃者はその脆弱性を悪用するツールを作成します。パッチが適用されていないサーバーは、その攻撃に対して無防備な状態です。

CVE とは

CVE(Common Vulnerabilities and Exposures)は、ソフトウェアの脆弱性を一意に識別するための番号体系です。「CVE-2024-1234」のように「CVE-年-番号」の形式で付与されます。ある脆弱性について話すときに「あの Apache のバグ」ではなく「CVE-2024-XXXX」と言えば、世界中のエンジニアが同じ脆弱性を指していると確認できます。

CVE にはそれぞれ深刻度(Critical / Important / Moderate / Low)が付いています。深刻度が高いほど、攻撃された場合の影響が大きいことを意味します。

セキュリティ通知の確認

AlmaLinux では dnf updateinfo コマンドでセキュリティ通知を確認できます。まず、現在利用可能なセキュリティアップデートの概要を見てみます。

alma-main で実行:

実行コマンド:

$ sudo dnf updateinfo summary

実行結果:

更新情報の概要: 利用可能
    93 セキュリティー通知
        32 重要セキュリティー通知
        60 中レベルセキュリティー通知
         1 低レベルセキュリティー通知
     1 バグ修正通知

93件のセキュリティ通知が利用可能で、そのうち32件が「重要」(Important)です。「重要」は、リモートからの攻撃や権限昇格など影響の大きい脆弱性を意味します。

個別のセキュリティ通知を確認するには list security を使います。

実行コマンド:

$ sudo dnf updateinfo list security | head -10

実行結果:

ALSA-2025:23343 中レベル/セキュリティ binutils-2.35.2-67.el9_7.1.x86_64
ALSA-2025:23343 中レベル/セキュリティ binutils-gold-2.35.2-67.el9_7.1.x86_64
ALSA-2026:1350  中レベル/セキュリティ curl-7.76.1-35.el9_7.3.x86_64
ALSA-2025:22175 重要/セキュリティ   expat-2.5.0-5.el9_7.1.x86_64
...(以下多数)

「ALSA-2025:23343」がアドバイザリ ID です。この ID で AlmaLinux のセキュリティアドバイザリページを検索すると、対応する CVE 番号や詳細な説明を確認できます。

セキュリティアップデートのドライラン

セキュリティアップデートを適用する前に、どのパッケージが更新されるかを確認します。--assumeno を付けると、実際にはインストールせずにトランザクションの概要だけを表示します。

実行コマンド:

$ sudo dnf update --security --assumeno

実行結果(抜粋):

インストール    10 パッケージ
アップグレード  67 パッケージ
ダウンロードサイズの合計: 144 M
操作が中断されました。

--assumeno により「操作が中断されました」と表示され、実際のアップデートは行われません。本番環境では、このドライランでどのパッケージが更新されるかを確認してから、メンテナンスウィンドウ(計画停止時間)の中で実際のアップデートを適用するのが一般的です。

dnf updateinfo の詳しいオプションは man dnf の「UPDATEINFO COMMAND」セクションで確認できます。

dnf-automatic で自動化する

手動で dnf update --security を実行する運用は、忘れるリスクがあります。本番環境では dnf-automatic パッケージを使って、セキュリティアップデートのチェックを自動化するのが一般的です。

dnf-automatic は systemd timer で毎日自動実行されます(第24回で学んだ仕組みです)。デフォルト設定ではアップデートのダウンロードのみを行い、適用は手動で行う安全な構成になっています。設定ファイルは /etc/dnf/automatic.conf です。今回はインストールしませんが、「セキュリティアップデートの自動化にはこのツールがある」と覚えておいてください。

現場のヒヤリハット: 「動いているから」でアップデートを放置

ヒヤリハット: セキュリティアップデートを半年間放置して攻撃された

ある現場で、テスト用サーバーのセキュリティアップデートを「テスト環境だから」と半年間放置していました。ある日、そのサーバーから不審な通信が発生していることが監視で検知されました。調査の結果、半年前に公開された CVE の脆弱性を突かれてマルウェアが仕込まれていたことがわかりました。

テスト環境であっても、社内ネットワークに接続されていれば踏み台にされる可能性があります。「動いているから」「テスト環境だから」でアップデートを後回しにするのは危険です。定期的なセキュリティアップデートの適用は、サーバー運用の基本中の基本です。

fail2ban で SSH ブルートフォース攻撃を防ぐ

もし fail2ban がなかったら、SSH に何回でもパスワードを試せるとしたらどうなるか考えてみてください。攻撃者は辞書攻撃やブルートフォース攻撃で、何万通りものパスワードを自動で試行します。たとえパスワードが複雑でも、試行回数に制限がなければ突破される可能性は時間とともに高まります。

fail2ban は、ログを監視して認証失敗を検知し、一定回数失敗した IP アドレスを自動的にブロック(ban)するツールです。第20回で学んだ firewalld のルールを自動で追加・削除することで、攻撃元の通信を遮断します。

インストールと起動

fail2ban は EPEL リポジトリに含まれています。第19回で EPEL は導入済みなので、そのままインストールできます。

alma-main で実行:

実行コマンド:

$ sudo dnf install -y fail2ban

インストールが完了したら、サービスを起動して自動起動を有効にします。第13回で学んだ systemctl の操作です。

実行コマンド:

$ sudo systemctl start fail2ban
$ sudo systemctl enable fail2ban

実行結果:

Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /usr/lib/systemd/system/fail2ban.service.

起動状態を確認します。

実行コマンド:

$ systemctl status fail2ban --no-pager -l

実行結果(抜粋):

● fail2ban.service - Fail2Ban Service
     Active: active (running)

active (running) と表示されていれば正常に起動しています。

現在の jail 状態を確認する

fail2ban では、監視対象のサービスごとに「jail」(監獄)という単位で設定を管理します。インストール直後は jail が1つも有効になっていません。

実行コマンド:

$ sudo fail2ban-client status

実行結果:

Status
|- Number of jail:      0
`- Jail list:

jail が0件です。SSH を保護するために sshd の jail を設定していきます。

sshd jail の設定

fail2ban の設定ファイルは /etc/fail2ban/jail.conf にデフォルト値がありますが、直接編集してはいけません。パッケージのアップデートで上書きされるためです。カスタム設定は /etc/fail2ban/jail.d/ ディレクトリに個別のファイルを作成します。

実行コマンド:

$ sudo tee /etc/fail2ban/jail.d/sshd.conf << 'EOF'
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 600
findtime = 600
EOF

各パラメータの意味は以下のとおりです。

  • enabled = true: この jail を有効にする
  • port = ssh: 監視対象のポート(ssh は 22/tcp を意味する)
  • maxretry = 3: 認証失敗が3回に達したら ban される
  • bantime = 600: ban の期間(秒)。600秒 = 10分間ブロックする
  • findtime = 600: この期間内(600秒)に maxretry 回失敗したら ban する

つまり「10分間に3回パスワードを間違えたら、10分間その IP からの SSH 接続をブロックする」という設定です。

設定を反映するために fail2ban を再起動します。

実行コマンド:

$ sudo systemctl restart fail2ban

sshd jail が有効になったか確認します。

実行コマンド:

$ sudo fail2ban-client status sshd

実行結果:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 0
|  `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd + _COMM=sshd-session
`- Actions
   |- Currently banned: 0
   |- Total banned: 0
   `- Banned IP list:

sshd jail が有効になりました。Currently failed: 0 は現在の認証失敗回数、Currently banned: 0 は現在ブロック中の IP 数を示しています。Journal matches の行は、fail2ban が systemd のジャーナルから sshd の認証ログを読み取っていることを意味します。

fail2ban のコマンドや設定の詳細は man fail2ban および man jail.conf で確認できます。

aide でファイル改ざんを検知する

もし攻撃者がシステムファイルを書き換えたとして、それに気づく方法はあるか考えてみてください。設定ファイルが1行変更されていても、目で見ただけでは気づけません。

aide の仕組み

aide(Advanced Intrusion Detection Environment)は、ファイルの改ざんを検知するツールです。仕組みはシンプルです。

  • 初期化: 現在のシステムファイルのハッシュ値(指紋のようなもの)をデータベースに記録する。これを「ベースライン」と呼ぶ
  • チェック: ベースラインと現在のファイルのハッシュ値を比較する。1ビットでも変更があれば検知する

つまり「正常な状態を記録しておき、変化があったら報告する」という仕組みです。攻撃者がバックドアを仕込んだり、設定ファイルを改ざんしたりした場合に、次回のチェックで差分として検出されます。

インストール

aide は BaseOS リポジトリに含まれています。EPEL は不要です。

alma-main で実行:

実行コマンド:

$ sudo dnf install -y aide

ベースラインの初期化

aide をインストールしたら、まず現在のシステムの状態をベースラインとして記録します。

実行コマンド:

$ sudo aide --init

実行結果(末尾のみ抜粋):

End timestamp: 2026-04-04 17:42:47 +0900 (run time: 0m 13s)

システム全体のファイルをスキャンするため、十数秒かかります。初期化が完了すると、/var/lib/aide/aide.db.new.gz にデータベースが生成されます。

aide がチェック時に参照するのは /var/lib/aide/aide.db.gz です。初期化で生成されたファイルをこの名前にコピーします。

実行コマンド:

$ sudo cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

初期化時のファイルを aide.db.new.gz として生成し、チェック用のファイル aide.db.gz とは別にしている理由は、意図しない上書きを防ぐためです。管理者が明示的にコピーすることで、「この状態をベースラインとして採用する」という意思決定を挟む設計になっています。

チェックの実行

ベースラインと現在の状態を比較します。

実行コマンド:

$ sudo aide --check

ベースラインを記録した直後なので、変更は検出されずに正常終了します。

改ざん検知のテスト

aide が本当にファイルの変更を検出できるか確認してみます。テスト用のファイルを /etc ディレクトリに作成し、aide --check を実行します。

実行コマンド:

$ sudo touch /etc/test-aide

実行コマンド:

$ sudo aide --check

今度は差分が検出されます。出力には /etc/test-aide が「added」(新規追加)として報告されます。aide はベースライン作成時に存在しなかったファイルが追加されたことを検知しています。

テスト用ファイルを削除しておきます。

実行コマンド:

$ sudo rm /etc/test-aide

ベースラインの定期更新

aide を運用する上で重要な点があります。ベースラインは定期的に更新する必要があるということです。

セキュリティアップデートを適用するとシステムファイルが変わります。正規のパッケージ導入でも設定ファイルが追加されます。こうした正当な変更がベースラインに反映されていなければ、aide --check のたびに大量の差分が報告され、本当の改ざんとの区別がつかなくなります。

運用の流れは以下のとおりです。

  • セキュリティアップデートやパッケージ導入などの正規の変更を行った後に aide --init を実行してベースラインを再作成する
  • 差分を確認して問題がなければ cp aide.db.new.gz aide.db.gz で新しいベースラインを採用する
  • 第24回で学んだ cron を使って、aide --check を定期実行することも有効

aide の設定ファイル(/etc/aide.conf)では、監視対象のディレクトリやチェック項目をカスタマイズできます。詳細は man aide および man aide.conf で確認してください。

やってみよう

ここまでの内容を使って、以下の2つの課題に取り組んでみてください。

課題1: dnf updateinfo summary を実行し、セキュリティ通知の件数を確認してください。重要セキュリティー通知は何件ありますか。

実行コマンド:

$ sudo dnf updateinfo summary

出力の中から「重要セキュリティー通知」の件数を確認してください。環境やタイミングによって件数は異なります。

課題2: fail2ban-client status sshd を実行し、Currently bannedBanned IP list を確認してください。

実行コマンド:

$ sudo fail2ban-client status sshd

設定直後であれば Currently banned: 0 のはずです。もし ban されている IP があれば、それはこの演習中に認証を複数回失敗した IP です。fail2ban-client unban --all で全 IP の ban を解除できます。

クリーンアップ

今回導入した fail2ban と aide はサーバー運用で継続的に使うツールのため、アンインストールせずに残しておきます。fail2ban は systemd で管理されているため、サーバー再起動後も自動で起動します。

aide のテスト用ファイル /etc/test-aide は、前のセクションで削除済みです。

まとめと次回予告

今回のポイントを3つにまとめます。

  • CVE / セキュリティアップデートは脆弱性の「特定と修正」。dnf updateinfo で通知を確認し、dnf update --security でパッチを適用する
  • fail2ban は攻撃の「緩和」。ログを監視して認証失敗を検知し、攻撃元の IP を自動でブロックする
  • aide は侵害の「検知」。ベースラインと現在のファイルのハッシュ値を比較し、改ざんがあれば報告する

第3回で「パスワード管理」「情報の取り扱い」というセキュリティの意識を学びました。今回はその意識を、CVE の確認・攻撃の自動緩和・ファイル改ざん検知という具体的なツールと手順で実践しました。セキュリティは「意識」と「仕組み」の両輪です。意識があっても仕組みがなければ守れず、仕組みがあっても意識がなければ運用できません。

多層防御の考え方も重要です。脆弱性のパッチ適用、攻撃の自動ブロック、改ざんの検知。1つの層が突破されても次の層で防ぐ。この重ね合わせがサーバーの安全性を高めます。

次回は第34回「Git基本操作」です。git init / add / commit / diff / log / branch の基本操作を学び、/etc 配下の設定ファイルを Git で管理する実践を行います。今回の aide が「ファイルの変化を検知する」ツールだとすれば、Git は「ファイルの変更履歴を記録し、いつでも過去の状態に戻せる」ツールです。

理解度チェック

今回の内容を○×形式で確認します。

問1: CVE は、ソフトウェアの脆弱性を一意に識別するための番号体系である。

→ ○。CVE(Common Vulnerabilities and Exposures)は「CVE-年-番号」の形式で脆弱性を識別する。世界共通の番号体系であり、エンジニア間で脆弱性を正確に特定するために使われる。

問2: dnf update --security --assumeno を実行すると、セキュリティアップデートが即座に適用される。

→ ×。--assumeno はドライランオプションで、トランザクションの概要を表示するだけで実際のアップデートは行わない。本番環境ではまずドライランで影響範囲を確認するのが基本。

問3: fail2ban は、認証失敗を一定回数繰り返した IP アドレスを自動でブロックする。

→ ○。fail2ban はログを監視して認証失敗を検知し、maxretry で設定した回数を超えた IP を bantime の期間だけブロックする。

問4: fail2ban の設定をカスタマイズするには、/etc/fail2ban/jail.conf を直接編集する。

→ ×。jail.conf はパッケージのアップデートで上書きされるため、直接編集してはいけない。カスタム設定は /etc/fail2ban/jail.d/ ディレクトリに個別のファイルを作成する。

問5: aide は、ベースライン(初期状態のハッシュ値)と現在のファイルを比較することで改ざんを検知する。

→ ○。aide は --init で記録したベースラインと --check 時のファイルのハッシュ値を比較し、変更があれば差分を報告する。

問6: aide のベースラインは一度作成すれば、その後更新する必要はない。

→ ×。セキュリティアップデートやパッケージ導入などの正規の変更を行うとシステムファイルが変わるため、ベースラインを定期的に更新しないと大量の差分が報告され、本当の改ざんとの区別がつかなくなる。

前の記事
次の記事