オープンソースのアンチウイルスエンジンであるClamAVは、メールゲートウェイやファイルサーバ、Webアプリの添付ファイル検査など幅広い場面で利用されている。常駐型スキャナである clamd の挙動は /etc/clamav/clamd.conf に集約されており、ここをきちんと理解するかどうかでスキャン精度・リソース消費・セキュリティレベルが大きく変わってくる。
本稿では、Debian/Ubuntu系で clamav-daemon パッケージをインストールした際に自動生成される標準的な clamd.conf を題材に、各ディレクティブが何を制御しているのかを順番に見ていく。設定の数はかなり多いので、機能カテゴリごとにまとめて解説する。
ソケットと接続まわり
clamd はクライアント(clamdscan、clamav-milter、Webアプリなど)からの接続を受けて検査を行うデーモンである。その入口となる通信設定がここにあたる。
LocalSocket /var/run/clamav/clamd.ctl
FixStaleSocket true
LocalSocketGroup clamav
LocalSocketMode 666
- LocalSocket: デーモンが待ち受けるUNIXドメインソケットのパス。TCPではなくローカル通信のみで使うなら、これを指定するだけで十分。デフォルトは無効。
- FixStaleSocket: 前回の異常終了で残ったソケットファイルを起動時に削除するかどうか。
trueにしておかないと再起動に失敗するケースがあるため、基本は有効推奨。 - LocalSocketGroup: ソケットファイルのグループ所有者。
clamavグループに含まれているプロセスからアクセスさせる、といった制御に用いる。 - LocalSocketMode: ソケットのパーミッション。
666は誰でも読み書き可能となるため、運用環境ではグループに絞った660等を検討したい。
ReadTimeout 180
CommandReadTimeout 30
SendBufTimeout 200
MaxConnectionQueueLength 15
MaxQueue 100
IdleTimeout 30
- ReadTimeout: クライアントからのデータが何秒間来ない場合に接続を切るか(デフォルト120秒)。大きな添付ファイルをストリーム送信する用途では長めに設定する。
- CommandReadTimeout: 接続後、最初のコマンドを受け取るまでのタイムアウト。デフォルト30秒。
- SendBufTimeout: 送信バッファが詰まったとき、何ミリ秒待つか。デフォルト500ms。
- MaxConnectionQueueLength: 受け入れ待ちの接続キュー長。デフォルト200。
- MaxQueue: スキャン待ち行列の最大長。
MaxThreadsの2倍以上を目安に。 - IdleTimeout: アイドルになったクライアント接続を切るまでの秒数。デフォルト30秒。
プロセス・スレッド制御
User clamav
MaxThreads 12
Foreground false
ExitOnOOM false
SelfCheck 3600
- User: デーモンを実行するユーザ。root権限で起動した後、ここで指定したユーザに権限降格される。
clamavは標準的な専用ユーザ。 - MaxThreads: 同時に走るスキャンスレッド数。デフォルト10。CPUコア数とメモリに応じて調整する。1スレッドにつき数百MB単位のメモリを消費する点に注意。
- Foreground:
trueにするとデーモンがバックグラウンドへフォークしない。systemdで管理する場合に向く。 - ExitOnOOM: libclamavがメモリ不足を報告した際にデーモンを停止するか。
falseだと動き続けようとする。 - SelfCheck: シグネチャデータベースの整合性を自動チェックする間隔(秒)。デフォルト600秒。新しいシグネチャの読み込みもこのタイミングで行われる。
一時ファイルとデータベース
TemporaryDirectory ... # コメントアウト
DatabaseDirectory /var/lib/clamav
OfficialDatabaseOnly false
LeaveTemporaryFiles false
- TemporaryDirectory: 解凍などで使う作業ディレクトリ。Debianパッケージではコメントアウトされており、環境変数
TMPDIR/TMP/TEMPで上書きできるようになっている。 - DatabaseDirectory: シグネチャ(
main.cvd、daily.cvd、bytecode.cvd)が置かれるディレクトリ。freshclamの出力先と一致させる必要がある。 - OfficialDatabaseOnly: ClamAVプロジェクト公式以外のサードパーティシグネチャ(SaneSecurity、Securiteinfo等)を読み込むかどうか。
falseで読み込みを許可。 - LeaveTemporaryFiles: 解凍した一時ファイルを残すか。デバッグ用途以外では
false。
ログ出力
LogFile /var/log/clamav/clamav.log
LogTime true
LogFileUnlock false
LogFileMaxSize 0
LogSyslog false
LogFacility LOG_LOCAL6
LogClean false
LogVerbose false
LogRotate true
ExtendedDetectionInfo true
Debug false
- LogFile: ログ出力先。空にするとファイル出力を行わない。
- LogTime: 各ログ行に時刻を付与する。
falseだとタイムスタンプなしで読みにくくなるので、有効化推奨。 - LogFileUnlock: ログファイルの排他ロックを無効化。複数プロセスで同一ログを共有しないなら
falseのままでよい。 - LogFileMaxSize: ログファイルの最大サイズ。
0で無制限(無効化)。logrotate等の外部ローテータと組み合わせる場合は0が便利。 - LogSyslog: syslog経由でも出力するか。
- LogFacility: syslogファシリティ。デフォルト
LOG_LOCAL6。 - LogClean: 検査をパスした「クリーンな」ファイルもログに残すか。出力量が爆発するため通常は
false。 - LogVerbose: 詳細ログを出すか。トラブルシュート時のみ
trueに。 - LogRotate: clamd内部でのログローテーションを行うか。
LogFileMaxSizeを指定しているときに意味を持つ。 - ExtendedDetectionInfo: 検出時にファイルサイズやハッシュ値も併記する。インシデント追跡に有用。
- Debug: libclamavレベルのデバッグメッセージを出力。通常は
false。
Prelude SIEM連携
PreludeEnable no
PreludeAnalyzerName ClamAV
- PreludeEnable: Prelude SIEMへIDMEF形式でアラートを送るかどうか。Preludeを使っていなければ
noのまま。 - PreludeAnalyzerName: Prelude側で識別される解析器名。
スキャン対象とフォーマット別オプション
ここからが「何をどう検査するか」の中核となる設定群である。
ScanMail true
ScanArchive true
ScanPE true
ScanELF true
ScanOLE2 true
ScanPDF true
ScanHTML true
ScanSWF true
ScanXMLDOCS true
ScanHWP3 true
各ファイル種別に対する解析を有効化するスイッチ。
- ScanMail: mbox/Maildir形式のメールファイルをパースし、添付を取り出して検査する。
- ScanArchive: Zip/Rar/7z/tar/gz等のアーカイブを展開して中身を検査する。
- ScanPE: Windows実行形式(Portable Executable)を解析。アンパッカーが内蔵されており、UPXなどで圧縮された実行体も展開して検査できる。
- ScanELF: Linux/UNIX系の実行形式(ELF)を解析。
- ScanOLE2: Microsoft Office旧形式(.doc/.xls/.ppt)や
.msiを解析。 - ScanPDF: PDF内部の埋め込みオブジェクトやJavaScriptを解析。
- ScanHTML: HTML/JavaScriptを正規化して検査。難読化された悪性スクリプトに対して効果的。
- ScanSWF: Adobe Flash(SWF)ファイルを解析。
- ScanXMLDOCS: OOXML系(.docx/.xlsx/.pptx)など、XMLベースの文書を解析。
- ScanHWP3: 韓国製ワープロ「Hangul Word Processor」のHWP3形式を解析。標的型攻撃で利用されるため搭載されている。
ScanPartialMessages false
HeuristicScanPrecedence false
AlgorithmicDetection true
- ScanPartialMessages: RFC1341で定義された分割メッセージを検査する。誤検知や攻撃面の拡大要因になり得るため通常は
false。 - HeuristicScanPrecedence: ヒューリスティック検出にシグネチャより優先権を持たせるか。CPU節約になるが網羅性が落ちる。
- AlgorithmicDetection: 古い名称で、現在の
HeuristicAlertsに相当。複雑なマルウェアやエクスプロイトに対するアルゴリズム検出を有効化する。
アーカイブ・暗号化・OLE2のアラート
ArchiveBlockEncrypted false
OLE2BlockMacros false
PartitionIntersection false
これらは旧バージョンの設定名で、新しいClamAV(0.101以降)では Alert プレフィックスに置き換えられている。
- ArchiveBlockEncrypted: パスワード保護されたZIPやRARを「Heuristics.Encrypted」として検出する。マルウェア配布で多用される手法のため、用途次第では有効化を検討。
- OLE2BlockMacros: VBAマクロを含むOffice文書を検出する。マクロウイルス対策の入口。
- PartitionIntersection: DMG(macOSのディスクイメージ)でパーティションが重なっている異常構造を検出。
フィッシング検出
PhishingSignatures true
PhishingScanURLs true
PhishingAlwaysBlockSSLMismatch false
PhishingAlwaysBlockCloak false
- PhishingSignatures: シグネチャベースのフィッシングメール検出。
- PhishingScanURLs: メール本文中のURLを検査して、表示テキストとリンク先の不一致などを検出。
- PhishingAlwaysBlockSSLMismatch: HTTPリンクがHTTPSへリダイレクトされた際の証明書ミスマッチを常にアラート扱いにする。誤検知が増えるため通常は
false。 - PhishingAlwaysBlockCloak: 数値IPで偽装されたURLなど、クローキング手法を必ずブロック。同じく誤検知リスクあり。
DLP(Data Loss Prevention)
StructuredDataDetection false
- StructuredDataDetection: クレジットカード番号や社会保障番号(SSN)といった構造化された機密情報を検出するDLPモジュール。
trueにするとStructuredMinCreditCardCountなどのパラメータと組み合わせて閾値を制御できる。
PUA(不審アプリケーション)
DetectPUA false
- DetectPUA: アドウェアやリモートツールなど「ウイルスではないがグレーゾーン」のアプリケーション(Possibly Unwanted Application)を検出する。誤検知の温床にもなるため、業務環境では
IncludePUA/ExcludePUAで対象を絞り込んで使うことが多い。
ファイル走査の範囲
MaxDirectoryRecursion 15
FollowDirectorySymlinks false
FollowFileSymlinks false
CrossFilesystems true
- MaxDirectoryRecursion: ディレクトリを何階層まで降りるか。デフォルト15。
- FollowDirectorySymlinks / FollowFileSymlinks: シンボリックリンクを追跡するか。
trueにすると無限ループや想定外の領域走査に繋がりかねないため、原則false。 - CrossFilesystems: マウントポイントを越えて走査するか。
/procや/sysを巻き込みたくない場合はfalseを検討。
サイズ・再帰・時間のリミット
ここはパフォーマンスとセキュリティのトレードオフが直接効いてくる、最も慎重に扱うべき領域。
MaxScanTime 120000
MaxScanSize 100M
MaxFileSize 25M
MaxRecursion 16
MaxFiles 10000
MaxPartitions 50
MaxIconsPE 100
MaxRecHWP3 16
MaxEmbeddedPE 10M
MaxHTMLNormalize 10M
MaxHTMLNoTags 2M
MaxScriptNormalize 5M
MaxZipTypeRcg 1M
StreamMaxLength 25M
- MaxScanTime: 1ファイルあたりの最大スキャン時間(ミリ秒)。デフォルト120秒。
0で無制限だが、悪意ある爆弾ファイルに対するDoS耐性が失われる。 - MaxScanSize: アーカイブ展開後を含む、1ファイルあたりの累計スキャンサイズ上限。デフォルト400M。
- MaxFileSize: これより大きい単体ファイルはスキップ。デフォルト100M(ClamAVの技術的上限は2GB)。
- MaxRecursion: アーカイブのネスト展開深度。デフォルト17。Zip-of-Zip-of-Zip攻撃の防御に効く。
- MaxFiles: 1コンテナ内で展開・走査するファイル数の上限。デフォルト10000。
- MaxPartitions: 生ディスクイメージ内で走査するパーティション数の上限。
- MaxIconsPE: PEファイル内で解析するアイコン数の上限。アイコン解析はフィッシング判定に使われる。
- MaxRecHWP3: HWP3パーサの再帰深度上限。
- MaxEmbeddedPE: 別ファイル内に埋め込まれたPEを抽出・検査する最大サイズ。
- MaxHTMLNormalize / MaxHTMLNoTags: HTML正規化処理の入力・出力サイズ上限。
- MaxScriptNormalize: スクリプト正規化対象の最大サイズ。
- MaxZipTypeRcg: ZIPの内容に基づくタイプ再判定の対象サイズ。
- StreamMaxLength: STREAMコマンドで受け取るデータの最大長。MTA側の添付サイズ上限と合わせるのが定石。
PCRE関連
PCREMatchLimit 10000
PCRERecMatchLimit 5000
PCREMaxFileSize 25M
PCRE(Perl互換正規表現)はシグネチャ内で利用されるが、悪意あるパターン入力に対して計算量爆発を起こしうる。これらの上限はその防御策。
- PCREMatchLimit: マッチ関数呼び出し回数の上限。
- PCRERecMatchLimit: 再帰呼び出し回数の上限。
- PCREMaxFileSize: PCREサブシグネチャを実行する対象ファイルの最大サイズ。
0で無効化。
バイトコード(高度な検出ロジック)
Bytecode true
BytecodeSecurity TrustSigned
BytecodeTimeout 60000
ClamAVのバイトコード機構は、シグネチャ言語では表現しきれない複雑な検出ロジックを動的にロードして実行するための仕組みである。
- Bytecode: バイトコードシグネチャを読み込むか。無効化すると検出漏れが増えるため
true推奨。 - BytecodeSecurity: 信頼レベル。
TrustSigned(公式署名付きを信頼、それ以外はサンドボックス)とParanoid(全て厳格チェック)が選べる。 - BytecodeTimeout: 1バイトコード実行のタイムアウト(ミリ秒)。
その他のスキャン挙動
ExtendedDetectionInfo true
AllowAllMatchScan true
ForceToDisk false
DisableCertCheck false
DisableCache false
- AllowAllMatchScan:
ALLMATCHSCANコマンドを許可する。1つのファイルに複数マッチするシグネチャを全て返すモード。 - ForceToDisk: ネスト展開時にメモリではなくディスクへ書き出す。ディスクI/Oは増えるが、
LeaveTemporaryFilesと組み合わせたデバッグや、メモリ節約に有効。 - DisableCertCheck: PEファイルのAuthenticode証明書チェーン検証を無効化する。デジタル署名された安全なファイルの誤検知対策で使われることがあるが、安全側に倒すなら
false。 - DisableCache: 検査結果のキャッシュ(同一ハッシュのファイルを再走査しない仕組み)を無効化する。再走査の挙動を確実にしたいテスト時以外は
falseのまま。
オンアクセススキャン
OnAccessMaxFileSize 5M
- OnAccessMaxFileSize:
clamonaccを併用したリアルタイム(オンアクセス)スキャンにおけるファイルサイズ上限。デフォルト5M。リアルタイム監視は応答性が命なので、バッチスキャンのMaxFileSizeよりも小さく抑えるのが普通。
設定を見直す際の指針
clamd.conf は項目数が多くて圧倒されがちだが、運用上重要なのはおおむね以下のレイヤである。
- 接続設定(
LocalSocket,LocalSocketModeなど)—— 誰がスキャナを呼べるかという入口の話。 - リソース上限(
MaxThreads,MaxScanSize,MaxFileSize,MaxRecursion)—— DoS耐性とスループットを左右する。 - 検出機能のON/OFF(
Scan<em>系、Detect</em>系、Phishing*系)—— 自社が扱うコンテンツに合わせて取捨選択する。 - ログとアラート(
LogFile,LogClean,ExtendedDetectionInfo)—— インシデント発生時の追跡に直結する。 - データベース(
DatabaseDirectory,SelfCheck,OfficialDatabaseOnly)——freshclam側との整合と更新頻度を意識する。
特に MaxFileSize を業務要件に合わせず初期値のままにしていると、大きなアーカイブが無検査で素通りしてしまうケースがある。逆に MaxThreads を大きくし過ぎるとメモリを食い潰してOOMで死ぬ。本番投入前に、想定する最大ファイルサイズと同時接続数を整理してから値を決めたい。
設定変更後は clamdscan --reload または systemctl reload clamav-daemon で反映できる。シンタックスエラーがあると黙ってデフォルト動作に戻されることがあるので、clamd --debug を一度走らせて警告が出ていないか確認する習慣をつけておくとよい。


コメント