なぜ内部の可視性を優先するのか
数年前、私のサーバーの1つが午前2時に執拗なSSHブルートフォース攻撃を受けました。Fail2Banのようなツールでログイン失敗をブロックするのは確実な第一歩ですが、すでにペイロードが入り込んでしまっている場合には役に立ちません。標準的なLinux用アンチウイルスツールは、まるで「大きなハンマー」のように大雑把で、現代の攻撃で使われる巧妙でカスタマイズされたスクリプトを見逃してしまうことが多々あります。
そこで登場するのがYARAです。セキュリティ研究者のための「スイスアーミーナイフ」とも呼ばれるYARAは、特定のテキストやバイナリのパターンに基づいてマルウェアファミリーを特定することを可能にします。
攻撃者が1バイトのジャンクコードを加えるだけで変更できてしまうような、静的なファイルハッシュを探すだけではありません。代わりに、16進数のシーケンスや特有の文字列、不審な挙動といった特定の特性を追い詰めるのです。本番環境において、YARAは隠れたバックドアや不正なクリプトマイナー(仮想通貨マイニングソフト)を発見するために必要な、外科手術のような精密さを提供します。
サーバーにYARAを導入する
ほとんどのモダンなディストリビューションの公式リポジトリには、YARAが含まれています。最新のパフォーマンス向上とモジュールサポートの恩恵を受けるために、バージョン4.5.0以上を使用することをお勧めします。
Ubuntu/Debianへのインストール
パッケージリストを更新し、将来的な自動化のためにPythonライブラリと共にコアバイナリをインストールします。
sudo apt update
sudo apt install yara python3-yara -y
CentOS/RHELへのインストール
YARAパッケージを見つけるには、EPELリポジトリを有効にする必要があります。
sudo dnf install epel-release -y
sudo dnf install yara -y
バージョンを確認して、インストールを検証しましょう。これはバイナリがPATHに含まれ、準備ができているかを手早く確認する方法です。
yara -v
初めてのYARAルールを作成する
YARAルールは「ロジックに基づいた指紋」のようなものだと考えてください。通常、ドキュメント用のMeta、検索基準となるStrings、そしてトリガーロジックを定義するConditionの3つのセクションで構成されます。ここでは、一般的なPHPウェブシェルの検知ルールを作成してみましょう。攻撃者は脆弱なウェブフォームを悪用した後、アクセスを維持するためにこれらを設置することがよくあります。
webshell_detect.yarという名前で新しいファイルを作成します。
nano webshell_detect.yar
ファイルに以下のロジックを記述します:
rule Detect_PHP_Webshell {
meta:
description = "ウェブシェルで使用される基本的なPHPバックドア文字列を検知します"
author = "TechnicalEditor"
date = "2024-05-20"
strings:
$php_tag = "<?php"
$eval = "eval(base64_decode("
$system = "system($_GET["
$shell_exec = "shell_exec("
condition:
$php_tag and ($eval or $system or $shell_exec)
}
このルールは、PHPの開始タグと、evalやsystemといった危険な関数が組み合わさったファイルをフラグ立てします。攻撃者は潜伏するためにスクリプトの名前をimage.phpやstyle.css.phpに変更することがよくありますが、このルールはファイル名を無視し、内部の悪意あるコンテンツのみに焦点を当てます。
ファイルと実行中のプロセスのスキャン
ハンティングは2つの方法で行えます。NVMeドライブ上の静的ファイルをスキャンする方法と、実行中のプロセスの揮発性メモリを検査する方法です。
ファイルシステムのスキャン
ウェブのルートディレクトリを監査するには、YARAでディレクトリを指定します。サブディレクトリを再帰的にスキャンするには、-rフラグを使用します。
yara -r webshell_detect.yar /var/www/html/
500〜1,000個のファイルがある標準的なサイトであれば、このスキャンは通常2秒以内に完了します。非常に効率的です。
実行中のプロセスのスキャン
高度な脅威はメモリ内にのみ存在し、物理ディスクに痕跡を残さないことがよくあります。YARAはプロセスID(PID)にアタッチして、その割り当てられたメモリ空間をスキャンできます。これはファイルレスマルウェアを検出する際の救世主となります。
特定の不審なプロセスをスキャンするには:
# 'top' や 'ps' で確認した実際のPIDに 1234 を置き換えてください
sudo yara webshell_detect.yar 1234
侵害が疑われるものの、どのプロセスが汚染されているか不明な場合は、以下のシンプルなループを使用して、実行中のすべてのPIDをチェックします。2>/dev/nullの部分は重要です。これにより、YARAが保護されたカーネルプロセスにアクセスしようとした際に発生する権限エラーを非表示にできます。
for pid in $(ps -ef | awk '{print $2}' | grep -v PID); do
sudo yara webshell_detect.yar $pid 2>/dev/null
done
検証と継続的な監視
手動スキャンはインシデント対応には有効ですが、あなたが眠っている間にサーバーの安全を守るのは自動化です。検証済みのコミュニティルール一式を、/tmpや/dev/shmのようなリスクの高いパスに対して実行するcronジョブを設定することをお勧めします。
コミュニティの知見を活用する
すべてのルールをゼロから書くのは大変な作業です。GitHubのYARA-Rulesプロジェクトは宝の山です。そこにはルートキット、ランサムウェア、Moneroマイナーなどのための数千ものシグネチャが含まれています。リポジトリをサーバーに直接クローンして利用できます。
git clone https://github.com/Yara-Rules/rules.git /opt/yara-rules
Cronによる自動化
/usr/local/bin/yara_check.shに、結果を集約するためのシンプルなシェルスクリプトを作成します。このスクリプトは、一致が見つかった場合にのみ結果をログに記録するため、ログが空のレポートで埋め尽くされるのを防ぎます。
#!/bin/bash
RULES="/opt/yara-rules/malware_index.yar"
SCAN_DIR="/tmp"
LOG_FILE="/var/log/yara_scan.log"
# スキャンを実行し、一致した結果をログに追記する
/usr/bin/yara -r $RULES $SCAN_DIR >> $LOG_FILE 2>&1
if [ -s $LOG_FILE ]; then
echo "警告: YARAが一致を検出しました!" | mail -s "セキュリティアラート" [email protected]
fi
これをcrontabに追加して、毎日午前2時に実行されるようにスケジュールします。
0 2 * * * /usr/local/bin/yara_check.sh
結論
YARAは、多くの市販のセキュリティスイートでは到底及ばないレベルの制御を可能にします。特定のワークロードにおいて何が「悪意あるもの」かを正確に定義することで、ファイアウォールや従来のシグネチャベースの検知をバイパスする脅威を捉えることができます。まずは基本的な文字列から小さく始めましょう。慣れてきたら、コミュニティ主導のフィードを統合して、Linuxフリート(サーバー群)のための堅牢で自動化された防御システムを構築してください。

