【Linux】dmesgの内容をリアルタイムに監視・キーワード検知する方法
Linuxでハードウェアの認識状態やネットワークの不穏な挙動を調べるときに使う dmesg コマンド。
起動時のログだけでなく、たまに以下のような「外部からの攻撃や不審な通信か?」と思われるカーネルログが記録されていることがあります。
TCP: Treason uncloaked! Peer XX.XX.XX.XX shrinks window XX Repaired.
(※実際には古いTCPスタックの挙動やパケットロスによるバグの可能性もありますが、見慣れないIPアドレスがあると不気味ですよね)
これらをリアルタイムに監視したいとき、どうすればいいのでしょうか?「/var/log/dmesg を見ても起動時の古い情報しか残っていない…」と悩む人に向けて、正しい監視方法を解説します!
1. なぜ「/var/log/dmesg」には残っていないのか?
まず知っておきたいのが、ログファイルの役割の違いです。
-
/var/log/dmesg: システムが「起動した瞬間」のログのみが記録されるファイルです。そのため、日付が古かったり、起動後に発生したイベント(USBの抜き差しやネットワークのログなど)は追記されません。 -
カーネルバッファ:
dmesgコマンドが本来見に行っているのは、メモリ上の「カーネルバッファ」というリアルタイムな領域です。
起動後の動的なログをファイルで監視したい場合は、/var/log/dmesg ではなく、rsyslog によって出力されるシステムログ を見る必要があります。
2. リアルタイムに監視する3つのアプローチ
dmesg(カーネルログ)を監視・キーワード指定して検知したい場合、以下の3つの方法が現実的です。
方法①:シンプルに「dmesg -w」や「tail -f」で常時監視する
最も手軽なのは、コマンドのオプションやシステムログを直接流しっぱなしにする方法です。
-
dmesgコマンドのフォワード機能(おすすめ):
Bashdmesg -w # または dmesg --followこれを使うと、画面が終了せずに新しいカーネルログがリアルタイムに追記されていきます。
-
システムログを追う: カーネルログは通常
/var/log/messages(Ubuntu等では/var/log/syslog)にも転送されているため、以下でも代用できます。Bashtail -f /var/log/messages | grep "Treason"
方法②:【本命】rsyslogでキーワード指定して自動化する
「特定のキーワードが出たら、別ファイルに切り出したり、アラートを飛ばしたい」という場合は、想定通り rsyslog を使うのが最もスマートです。
/etc/rsyslog.d/ 配下に新しく設定ファイル(例: kernel-alert.conf)を作成し、以下のように記述します。
# 「Treason」という文字が含まれるカーネルログを特定のファイルに隔離する
:msg, contains, "Treason" /var/log/kernel_attack.log
これならシステム側が自動でフィルタリングしてくれるため、無駄なリソースを使わずにスマートにキーワード監視が実現できます。
方法③:cron+リダイレクトで定期出力する
「rsyslogの設定をあまりいじりたくない」という場合の、力技のアプローチです。 以下のようなシェルスクリプトを cron で数分おきに回す方法です。
#!/bin/bash
# 現在のdmesgの内容をファイルに上書き、または追記してキーワード抽出
dmesg | grep "Treason" > /var/log/dmesg_monitor.txt
ただし、この方法だと「何分前までのログか」の管理(重複検知の防止など)が少し面倒になるため、やはり恒久的に運用するなら方法②(rsyslog)や、ログ監視ツール(LogwatchやHinemos、Zabbixなど)に messages を見せるのが王道です。
まとめ
-
/var/log/dmesgは起動時のみ。リアルタイムなログはメモリ上にある。 -
画面上でサクッと見たいなら
dmesg -w。 -
キーワードを指定して自動で検知・隔離したいなら
rsyslogでルールを書くのがベスト!
不審なログが気になるときは、ぜひ rsyslog や dmesg -w を活用して動向を追ってみてください。
