Linux環境にVelociraptorを導入:リアルタイムなエンドポイントDFIRと脅威ハンティング実践ガイド

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

クイックスタート(5分)

Velociraptorを使用すると、数千台規模のLinuxエンドポイントに対して数秒で調査を実行できます。大量の生ログを高価なSIEMへ継続的に転送する代わりに、対象ホスト上で直接ターゲットを絞ったクエリを実行します。ここでは、単一のUbuntu 22.04またはDebian 12マシン上に、テスト用のサーバーとエージェントを約5分で立ち上げる手順を解説します。

1. 静的バイナリのダウンロード

Velociraptorは、外部の共有ライブラリへの依存関係が一切ないスタンドアロンのGoバイナリとして提供されています。GitHubから最新の安定版リリースを取得し、実行権限を付与します。

# 最新のリリースタグを取得してAMD64バイナリをダウンロード
VER=$(curl -s https://api.github.com/repos/velocidex/velociraptor/releases/latest | grep tag_name | cut -d '"' -f 4)
wget -O velociraptor "https://github.com/velocidex/velociraptor/releases/download/${VER}/velociraptor-${VER}-linux-amd64"
chmod +x velociraptor
sudo mv velociraptor /usr/local/bin/
velociraptor version

2. サーバーとクライアントの設定ファイル生成

Velociraptorは、相互TLS(mTLS)と組み込みの暗号鍵を使用してすべてのコンポーネントを認証します。対話型ウィザードを実行して設定ファイルを生成します。

sudo mkdir -p /etc/velociraptor
cd /etc/velociraptor
sudo velociraptor config generate -i

ウィザードでいくつかの設定項目を尋ねられます。ローカルでの簡易セットアップには以下の値を指定してください。

  • Operating System: Linux
  • Path for datastore: /var/lib/velociraptor(アーティファクトのトリアージデータ保存用に最低15GBのディスク容量を確保してください)
  • Frontend URL: https://127.0.0.1:8000/(本番環境では、サーバーの静的IPまたは https://velociraptor.internal.corp:8000/ などのDNSレコードを指定します)
  • GUI Bind Port: 8889
  • GUI Username: admin

ウィザードにより、カレントディレクトリに2つのファイルが生成されます。server.config.yaml にはプライベートCA鍵が含まれているため、サーバー上で厳重に保護してください。client.config.yaml は監視対象の各エンドポイントに配布します。

3. 管理者ユーザーの作成とサーバーの起動

デーモンを起動する前に、ローカル管理者アカウントを作成します。

sudo velociraptor --config /etc/velociraptor/server.config.yaml user add admin --role administrator

プロンプトが表示されたら、強力なパスワード(16文字以上)を入力します。次に、詳細出力モードでフロントエンドサービスを起動します。

sudo velociraptor --config /etc/velociraptor/server.config.yaml frontend -v

ブラウザで https://127.0.0.1:8889 を開きます。自己署名証明書の警告を承認し、作成した管理者認証情報でサインインします。

4. 最初のエンドポイントクライアントの接続

同じマシン上で2つ目のターミナルウィンドウを開き、エンドポイントをシミュレートします。エージェントプロセスを起動します。

sudo velociraptor --config /etc/velociraptor/client.config.yaml client -v

Webコンソールに戻り、Host Search 配下にある虫眼鏡アイコンをクリックします。検索ボックスに * と入力してください。ホストがすぐに一覧に表示され、60秒ごとのアクティブなハートビートチェックインを伴う緑色のテレメトリステータスが確認できます。

詳細解説

従来のEDRプラットフォームは、膨大なテレメトリストリームを中央のクラウドストレージに転送するため、帯域幅のコストが跳ね上がりがちでした。Velociraptorはこのモデルを根本から覆します。Velociraptor Query Language(VQL)を活用することで、計算処理をエンドポイント側へと分散させます。中央サーバーは軽量なクエリ文字列のみを配信し、エンドポイントがメモリ上でリクエストを評価し、ノイズをローカルで除外したうえで、一致したレコードのみをストリーミング返送します。

アーキテクチャの概要

プラットフォームは主に3つのコア要素で構成されています。

  • フロントエンドサーバー: ポート8000を介したエージェントからのmTLS接続を処理し、アーティファクトライブラリを管理し、ポート8889でWeb GUIを提供します。4コア、8GB RAMの単一サーバーで、10,000台の同時接続エンドポイントを容易に処理できます。
  • クライアントエージェント: 軽量なバックグラウンドデーモンです。アイドル時の消費リソースは約15〜25MBのRAMとわずかなCPUのみです。アクティブなハントが実行されると、分離されたgoroutine内でコンパイル済みVQLクエリを実行し、検出結果をアップロードします。
  • Velociraptor Query Language(VQL): DFIRに特化したプラグインによって拡張された表現力豊かなSQL方言です。VQLプラグインは、ELFヘッダーのパース、/proc の探索、raw ext4 inodeの展開、journaldログの解析、さらにはYARAルールを用いたプロセスメモリのスキャンまで実行可能です。

VQLを使用した稼働中エンドポイントへのクエリ実行

クエリの実行にWebコンソールは必須ではありません。CLIから直接稼働中のシステムに対してVQLを実行し、即座にローカルトリアージを実施できます。以下は、アクティブなリッスンポートとそれに対応する親プロセスを一覧表示する例です。

sudo velociraptor --config /etc/velociraptor/client.config.yaml query \
  'SELECT Pid, Name, CommandLine, Laddr.IP AS LocalIP, Laddr.Port AS LocalPort FROM netstat() WHERE Status = "LISTEN"'

Velociraptorは ss や lsof といった標準のユーザーランドバイナリをバイパスします。代わりに、netstat() プラグインがカーネルの擬似ファイル /proc/net/tcp から直接読み取り、開いているソケットを /proc/[pid]/fd/ 内のアクティブなファイルディスクリプタにマッピングします。仮に攻撃者がポート4444のリバースシェルを隠蔽するために /bin/netstat をルートキットで置き換えていたとしても、Velociraptorはそれを確実に検知します。

セッションを横断したユーザーシェルアクティビティの調査

攻撃者は初期侵入を果たした直後、頻繁にワンライナーのbashコマンドを実行します。数十ものユーザープロファイルにまたがる /home/*/.bash_history ファイルを手作業で探索する代わりに、組み込みの Linux.Bash.History アーティファクトを実行します。

sudo velociraptor --config /etc/velociraptor/client.config.yaml query \
  'SELECT * FROM Artifact.Linux.Bash.History()'

このクエリは /etc/passwd を読み取って全ユーザーのホームディレクトリを検出し、コマンド履歴を行番号やエポックタイムスタンプとともに構造化テーブルとしてパースします。

高度な活用法

最初のエージェントが安定してチェックインできるようになったら、アドホックなクエリ実行から本番環境向けのデプロイや自動ハンティングへと移行しましょう。

常駐用systemdサービスのデプロイ

対話型シェルはSSHセッションが切断されると終了してしまいます。本番運用には堅牢なsystemdサービスユニットが必要です。

サーバーホスト上で /etc/systemd/system/velociraptor-server.service を作成します。

[Unit]
Description=Velociraptor DFIR Server
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/velociraptor --config /etc/velociraptor/server.config.yaml frontend
Restart=always
RestartSec=5s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

クライアントエンドポイントには /etc/systemd/system/velociraptor-client.service を配置します。集中的なスキャンを実行している間でもエージェントが本番ワークロードのリソースを枯渇させないよう、cgroupによるリソース制限を追加します。

[Unit]
Description=Velociraptor Endpoint Client
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/velociraptor --config /etc/velociraptor/client.config.yaml client
Restart=always
RestartSec=10s
CPUQuota=15%
MemoryMax=300M

[Install]
WantedBy=multi-user.target

CPUQuota=15% および MemoryMax=300M ディレクティブにより、エンドポイントスキャンのリソース消費を予測可能な範囲に抑えます。負荷の高い正規表現クエリによって偶発的にCPU使用率がスパイクしてもsystemdが制限し、メモリが300MBを超えた場合でもカーネルのOOM Killerがエージェントを安全にリセットします。

sudo systemctl daemon-reload
sudo systemctl enable --now velociraptor-client.service

永続化ハンティング用カスタムVQLアーティファクトの作成

Linuxマルウェアは、多くの場合cronスケジュールを悪用して永続化(Persistence)を確立します。攻撃者はリバースシェルスクリプトを /etc/cron.d/ に配置したり、/var/spool/cron/crontabs/ 配下のユーザークロンタブを改ざんしたりします。

以下は、一般的な外部送信用ネットワークツールやステージングスクリプトがないかcronファイルを走査するカスタムアーティファクトです。これを /etc/velociraptor/custom_artifacts/cron_hunt.yaml として保存します。

name: Custom.Linux.CronIntegrity
description: cronディレクトリをスキャンし、不審なリバースシェル、ダウンローダー、ステージングコマンドを検出します。

sources:
  - query: |
      LET TargetFiles = SELECT OSPath, Size, Mtime
                        FROM glob(globs=["/etc/cron*/**", "/etc/crontab", "/var/spool/cron/crontabs/*"])
                        WHERE NOT IsDir AND Size < 1000000

      SELECT OSPath,
             Size,
             Mtime,
             upload(file=OSPath) AS UploadRef
      FROM TargetFiles
      WHERE read_file(filename=OSPath) =~ "(?i)(curl\s|wget\s|python3?\s+-c|bash\s+-i|sh\s+-i|nc\s+-e|/dev/tcp/)"

WHERE read_file(...) 条件に注目してください。ファイル本文自体を検査し、/dev/tcp/ や curl などの不審なコマンドパターンを検出します。エンドポイントで一致するファイルが見つかると、upload(file=OSPath) によって疑わしいcronファイルのコピーがサーバーのフォレンジックボールトへ自動的にアップロードされます。

作成した新しいアーティファクトをサーバーに読み込みます。

sudo velociraptor --config /etc/velociraptor/server.config.yaml artifacts load /etc/velociraptor/custom_artifacts/cron_hunt.yaml

フリート全体を対象とした脅威ハンティングの実行

ハントの開始は4クリックで完了します。Web GUIで Hunt Manager を開き、+ (New Hunt) ボタンをクリックします。アーティファクト一覧から Custom.Linux.CronIntegrity を選択します。クライアントのレートリミット(例: 毎秒50ホスト)と有効期限(例: 24時間)を設定し、Launch をクリックします。

Velociraptorは永続的なgRPCチャネルを通じてタスクを一斉配信します。5,000台規模のサーバー群であっても、通常30秒未満で初期結果が届き始めます。検出されたファイルはサーバーボールトに格納され、ハッシュ照合やリバースエンジニアリングへ即座に回すことができます。

実践的なセキュリティTips

フォレンジックパイプライン自体の堅牢化は極めて重要です。Velociraptorエージェントは root 権限でコードを実行するため、サーバーは攻撃者にとってラテラルムーブメントの足がかりとなる高価値な標的になります。

1. 管理コンソールのアクセス制限

Web GUIはポート 8889 で動作します。このポートをインターネットに開放したままにしておくと、認証情報へのブルートフォース攻撃を招きます。server.config.yaml 内の GUI.bind_address は 127.0.0.1 のまま維持してください。ダッシュボードへは、管理端末から暗号化されたSSHトンネル経由でアクセスします。

# リモートのポート8889をローカルマシンに転送
ssh -N -L 8889:127.0.0.1:8889 [email protected]

ローカルのブラウザで https://127.0.0.1:8889 を開きます。外部からのポートスキャンでは、ポート8889はクローズまたはフィルタリング中として認識されます。

2. フロントエンド向けLet’s Encrypt証明書の設定

初期テストでは自己署名証明書でも問題ありませんが、本番環境のエージェント通信では信頼された証明書を使用するほうがはるかに安定します。VelociraptorにはACMEクライアントが組み込まれています。パブリックDNSのAレコードをサーバーに向け、HTTP-01チャレンジ用にTCPポート80を一時的に開放したうえで、/etc/velociraptor/server.config.yaml を編集します。

Frontend:
  hostname: velociraptor.security.example.com
  certificate_provider: letsencrypt
  acme_email: [email protected]

3. 大規模収集時におけるネットワーク帯域の調整

LiMEを用いたライブメモリダンプの取得やディスクパーティションのタイムライン収集は、一時的なネットワークスパイクを引き起こします。40台のサーバーが同時に16GBのRAMダンプをアップロードすると、1Gbpsのアップリンクが逼迫し、業務トラフィックに影響を与える恐れがあります。VQLの収集引数でアップロード帯域を直接制限しましょう。

# ホストごとのデータ転送速度を5MB/s(5,000,000バイト/秒)に制限
sudo velociraptor --config /etc/velociraptor/client.config.yaml collect Linux.Memory.Lime \
  --args max_bandwidth=5000000

4. プロアクティブなベースラインハントの構築

重大度「高」のアラートが発生するまで、初回のクエリ実行を先延ばしにしてはいけません。業務への影響が少ない時間帯に定期的な週次ベースラインハントをスケジュールし、フリート全体のスナップショットを取得しておきましょう。

  • SUIDおよびSGIDバイナリ: Linux.Search.Suid を実行し、setuidビットが有効化された不正なroot所有バイナリ(chmod u+s)を検出します。
  • カーネルモジュール: Linux.Sys.KernelModules を実行し、追跡されていないルートキットや隠蔽されたドライバーを特定します。
  • リッスン中のネットワークサービス: 稼働中のTCP/UDPポートをCMDBインベントリと照合し、許可されていないシャドウサービスをあぶり出します。

「先週の火曜日」のベースラインデータを保持しておくことで、3日間を要していた混乱に満ちたインシデントトリアージを、わずか5分の差分解析へと短縮できます。

Share: