自分のLinuxサーバーで何か変なことが起きていないか——そう感じたとき、何から調べればいいか分からなかった経験はありませんか。
負荷が急に上がった、見覚えのないネットワーク接続がある、CPU使用率が説明できないほど高い。こういった兆候が出たとき、最初にやるべきことは「今サーバーで何が動いているか」を正確に把握することです。
この記事では、Linuxサーバーで不審なプロセスや外部接続を調査するための基本コマンド(ps・ss・lsof)と、攻撃者が残しがちな痕跡パターンを現場目線で解説します。特別なツールを導入しなくても、標準コマンドだけで初動調査の大部分をカバーできます。

なぜ侵害直後の調査スピードが重要か
マルウェアやバックドアの多くは、侵入後に次の3つのことをします。
・外部と通信する: C2(コマンド&コントロール)サーバーへの接続を確立し、追加の命令を待ちます
・常駐化する: cronやsystemdサービスに自身を登録し、再起動後も生き続けようとします
・痕跡を消す: ログを改ざんしたり、正規プロセスに偽装したりします
侵害が進むほど調査は難しくなります。「変だな」と感じた段階でできるだけ早く現状を記録しておくことが、後の対応を大きく左右します。ここで紹介する調査はサーバーを止めずに実施できます。
まず全プロセスを把握する(ps)
psコマンドは稼働中のプロセスを一覧表示します。最初に使うオプションは aux です。
# すべてのプロセスをユーザー・CPU・メモリ情報付きで表示 ps aux # プロセスツリーを表示(親子関係を視覚化) ps auxf # 特定の文字列を含むプロセスを絞り込む ps aux | grep -i bash
1. 確認すべきポイント
表示結果で注目するのは次の項目です。
・USER列: rootやwww-dataなど本来その権限を持つべきでないユーザーが実行しているプロセスはないか
・COMMAND列: 意味不明な文字列、長い16進数文字列、実行パスが /tmp や /dev/shm になっているもの
・%CPU列: 長時間CPUを占有しているプロセス(クリプトジャッキングの典型パターン)
・START / TIME列: 長時間稼働しているのに覚えがないプロセス
2. プロセスの実体ファイルを確認する
プロセスのPIDが分かったら、そのプロセスが実際にどのファイルから起動されているかを確認します。攻撃者は ls や cron などの正規コマンドに偽装することがあります。
# PIDが1234のプロセスの実体を確認(シンボリックリンク先が本体) ls -la /proc/1234/exe # プロセスが参照しているすべてのファイルを確認 ls -la /proc/1234/fd/ # プロセスのコマンドラインをそのまま取得 cat /proc/1234/cmdline | tr ' ' ' '
/tmp や /var/tmp、/dev/shm に実体があるプロセスは侵害の強い指標です。正規のサービスがこれらの場所に実行可能ファイルを置くことはほぼありません。
ネットワーク接続を調べる(ss・netstat)
ssコマンド(socket statistics)は、Linuxサーバーが確立しているネットワーク接続をリアルタイムで表示します。netstatは古いディストリビューションでの代替として使えます。
# すべての接続(TCP・UDP)をプロセス情報付きで表示 ss -tulnp # 現在通信中(ESTABLISHED)の接続のみ ss -tnp state established # 外部IPへの接続をリスト化(調査スナップショット) ss -tnp | grep ESTAB > /tmp/connections_$(date +%Y%m%d_%H%M%S).txt # netstatでの代替(iprouteパッケージが入っていない環境用) netstat -tulnp
3. C2通信の兆候を見分ける
外部接続で注目すべきパターンは次のとおりです。
・見覚えのない外部IPへのESTABLISHED接続: whoisでそのIPの所在国やASNを確認します
・高いポート番号(49152番~)への外向き接続: C2通信でよく使われます
・既知サービス以外のLISTENポートが増えている: バックドアが待ち受けポートを開設していることがあります
・短い間隔での定期的な外部接続: ビーコン通信(C2へのハートビート)の可能性があります
4. 接続先IPの評判を手軽に調べる
# whoisでIPの所有組織を確認 whois 192.0.2.100 # AbuseIPDBやVirusTotalでの確認(ブラウザから実施) # https://www.abuseipdb.com/check/192.0.2.100
取得した接続先IPは、AbuseIPDBやVirusTotalのWebインタフェースで評判を確認できます。社内に分析環境がなくても、ブラウザから数分で調べられます。
開いているファイルとポートを確認する(lsof)
lsof(list open files)はLinuxの「すべてはファイル」という哲学の産物です。ネットワークソケット、デバイスファイル、削除済みファイルを開いているプロセスまで、あらゆる「開かれたリソース」を表示します。
# すべての開いているネットワーク接続を表示 lsof -i # 特定のポートを使っているプロセスを確認 lsof -i :4444 # 削除済みなのにまだ開いているファイルを表示(ファイルレス型マルウェア検知) lsof | grep '(deleted)' # 特定ユーザーが開いているファイル lsof -u www-data
5. 削除済みバイナリの発見と保全
攻撃者は実行後すぐにファイルを削除し、メモリ上だけで動き続けるマルウェアを使うことがあります。lsof | grep '(deleted)' がこのパターンを検出します。
検出した場合は、そのプロセスのバイナリをメモリから復元して保全しておくと、後の解析に役立ちます。
# PID=2345の削除済みバイナリをメモリから復元(証拠保全用途) cp /proc/2345/exe /tmp/recovered_$(date +%Y%m%d).bin sha256sum /tmp/recovered_$(date +%Y%m%d).bin
攻撃者が残す主な痕跡パターン
現場でよく見るパターンをまとめます。一致するものが複数あるほど侵害の可能性が高まります。
| 調査コマンド | 不審な兆候 | 考えられる原因 |
|---|---|---|
| ps aux | /tmp・/dev/shm配下に実体があるプロセス | マルウェア本体(実行後削除の直前) |
| ps auxf | httpd/apacheの子プロセスでシェルが起動 | Webシェル経由のコマンド実行 |
| ss -tnp | 見覚えのない外部IPへのESTABLISHED接続 | C2通信・データ窃取 |
| lsof -i :xxxx | 既知サービス以外のLISTENポート | バックドアのリスナー |
| lsof | grep deleted | 削除済みファイルを開いているプロセス | ファイルレスマルウェア・痕跡消去型 |
| crontab -l | 見覚えのないジョブ、URLフェッチ | 常駐化・再感染スクリプト |
cronとsystemdサービスの確認も忘れずに
プロセスを終了させても、cronやsystemdサービスに登録されていると再起動のたびに復活します。必ずセットで確認してください。
# rootを含むすべてのユーザーのcronを確認 for user in $(cut -f1 -d: /etc/passwd); do echo "--- $user ---" crontab -u "$user" -l 2>/dev/null done # システムcronディレクトリを確認 ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ # 最近変更・追加されたsystemdサービスを確認(/etc/passwdより新しいファイル) find /etc/systemd/ /usr/lib/systemd/ -name "*.service" -newer /etc/passwd -ls # 有効化されているsystemdサービス一覧 systemctl list-unit-files --state=enabled
中小企業でも今日からできること
インシデントが起きてから慌てないために、普段から基準を作っておくことが重要です。
・スナップショットを定期保存する: ss -tnpとps auxの結果を週1回cronで記録しておくと、「いつから変わったか」を追いやすくなります
・パッケージマネージャーのログを確認する: rpm -qa --last(RHEL系)やgrep install /var/log/dpkg.log(Debian系)で、身に覚えのないパッケージが入っていないかチェックします
・ログイン履歴を定期確認する: last -Fで過去のログイン履歴を日時付きで確認します。知らないIPからの成功ログインは要調査です
・調査コマンドの改ざんを疑う: 高度な攻撃者はpsやssコマンドを差し替えて自プロセスを隠します。疑いが強い場合は静的リンクされたツール(Busyboxなど)を別メディアから実行します
Linuxのプロセス管理やシェルスクリプトの基礎を学びたい方は、姉妹サイトLinuxMaster.JPもあわせてご参照ください。調査スクリプトを自作する際の土台になります。
よくある誤解と注意点
・「プロセスを消せば解決」は危険: プロセスを終了させただけでは再起動後に復活します。cronやsystemdへの登録削除、バイナリ本体の削除まで行わないと意味がありません
・「ウイルス対策ソフトが入っているから安心」は過信: Linuxのマルウェアはファイルレス型が増えており、パターンマッチング型のAVでは検知できないケースがあります
・ログを鵜呑みにしない: /var/logのログは改ざん可能です。平常時からリモートログサーバーへ転送する設計にしておくと、侵害後も正しい証跡が残ります
・「100%これが原因」と決めつけない: 調査で不審な点を発見しても、それが侵害の原因か症状かは慎重に判断してください。誤った対処で証拠を消してしまうリスクがあります

本記事のまとめ
Linuxサーバーの不審なプロセスや外部接続を調査するには、まずps・ss・lsofという標準コマンドで現状を把握することが出発点です。
・ps auxfでプロセスツリーと実体パスを確認し、/tmp・/dev/shm配下のプロセスに注意する
・ss -tnpで外部へのESTABLISHED接続とLISTENポートを洗い出す
・lsof | grep deletedでファイルレス型マルウェアの痕跡を探す
・cronとsystemdサービスも必ずチェックして再感染経路を断つ
・平常時から定期スナップショットを取り、基準との差分で異常を検知する
調査に慣れてきたら、WazuhのようなHIDS(ホスト型侵入検知システム)を導入すると、異常なプロセスやファイル変更をリアルタイムで自動検知できるようになります。手動調査と自動監視を組み合わせることで、侵害の早期発見精度が大きく向上します。
PR
詳解 インシデントレスポンス(Steve Anson/石川朝久訳)
不審プロセスの特定からフォレンジック証拠の保全・解析まで、インシデント対応の現場で使える手順を体系的に解説した実践書です。調査フローを一通り把握したい方に特におすすめです。
