Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
前回までは、サーバー全体の定期スキャンを自動化する方法を学びました。しかし、定期スキャンには「実行されるまでのタイムラグ」という弱点があります。
もし、開発者がマルウェアを含んだライブラリやファイルを誤ってプッシュしてしまったら? 次のスキャンを待っている間に、他の開発者がそのコードをプルし、被害が拡大してしまいます。
今回は、Gitサーバーの Git Hooks を活用し、汚染されたコードの受理をその場で拒否する「水際対策」を構築します。
※事前に clamd が起動している必要があります。
Git連携では、ファイルをディスクに書き出さず、メモリ上でスキャンする「ストリームモード」を多用します。まずは以下のコマンドで動作を確認しましょう。
# 標準入力経由でスキャンが通るか確認
echo "test scan" | clamdscan - --stream
正常に終了すれば、Git連携の準備は完了です。
Gitの pre-receive フックは、サーバー側でリポジトリの内容が更新される直前に実行されます。
リポジトリ内の hooks/pre-receive を編集します。リポジトリ全体ではなく「今回プッシュされたファイル」だけを狙い撃ちにするのが、パフォーマンス維持のコツです。
#!/bin/bash
set -uo pipefail
# 1. プッシュされた新旧のリビジョン情報を取得
while read oldrev newrev refname; do
# 2. 新旧の差分(ファイル名のみ)を抽出
files=$(git diff --name-only $oldrev $newrev)
for file in $files; do
# 3. 特定のファイル内容を抽出し、ストリーム経由でスキャン
if ! git show $newrev:"$file" | clamdscan - --stream --no-summary --quiet; then
# エラー出力は標準エラー(>&2)に流すのがUnixの作法
echo "##################################################" >&2
echo " [ERROR] Malware detected in file: $file" >&2
echo " The push has been rejected by ClamAV." >&2
echo "##################################################" >&2
exit 1
fi
done
done
exit 0
chmod +x hooks/pre-receive で実行権限を付与してください。また、フックスクリプト自体が改ざんされないよう、サーバー上のリポジトリ管理権限を適切に制限しておくことも重要です。
差分ファイルが大量にある場合や、巨大なバイナリファイル(画像や圧縮アーカイブ)が含まれる場合、スキャンに時間がかかります。
解決方法:
clamdscan の --max-filesize オプションでスキャン対象サイズに上限を設ける。差分スキャン(git diff)を採用することで負荷は最小限に抑えられますが、同時プッシュが多い環境ではCPU消費に注意が必要です。
解決方法:
第4回で学んだnice や ionice を、フック内のコマンドにも適用することを検討してください。
第5回では、開発パイプラインの入り口をガードするGit連携を学びました。
pre-receive フックで、ウイルス混入を未然に防ぐ。git diff を活用し、プッシュされた差分のみを効率的にスキャンする。開発フローにセキュリティを組み込む「シフトレフト」は、現代のインフラ運用において非常に強力な武器になります。
しかし、データの入り口はGitだけではありません。不特定多数がブラウザからファイルを送ってくるWebサーバーこそ、最も攻撃に晒される場所です。
次回は「運用編・Webサーバー」として、PHPやPython等のアプリと連携し、ファイルアップロードの瞬間に「隔離・検査」を行う設計とコード例を解説します。
ご覧いただきありがとうございました。