十回目の投稿です。今回は、各種ログファイルをリアルタイムで監視する方法を紹介します。
運用監視業務ではお馴染みのログ監視ですが、実際に体験するとなると、専用の監視ツールを
導入する必要があるなど、やや敷居が高いように感じます。ただ、簡易的なログ監視であれば、
Linux系ディストリビューションに標準的に備わっているユーティリティにて体験できることを
確認します。
◆ 準備
リアルタイムログ監視の方法について紹介する前に、今回用いるLinux関連のコマンドに
ついて補足しておきます。
【コマンドの概要】
tailコマンドとgrepコマンドについて説明します。
・tail
ファイルの内容を末尾から表示するコマンドです。ログファイルの末尾、つまり新しく
記録されたログを確認する場合に重宝します。代表的なオプションは次のとおりです。
・-n: 表示する行数を指定するためのオプションです。このオプションのあとに数字を
指定すると、対象ファイルの末尾からその数字分の行数が表示されます。
・-f: ファイルへの追記内容を表示させるためのオプションで、今回はこれを用います。
このオプションのあとに、リアルタイム監視対象のファイルを指定します。
・grep
ファイルや標準入力の内容から、特定の文字列を抽出するためのコマンドです。業務
内容によらず、非常に使用頻度の高いコマンドだと思います。今回は、ログファイル
から特定のログを抽出するために使用します。用いるオプションは次の2つです。
・-f: 抽出したい文字列を特定のファイルから読み込むためのオプションです。この
オプションのあとに、抽出したい文字列が記載されたファイルを指定します。
・--line-buffered: 出力をバッファしないようにするためのオプションです。使い方は
後述しますが、これがないと正確なリアルタイムログ監視ができません。
【コマンドの使用例】
概要だけでは分かりづらいため、コマンドの使用例を2つ説明します。
・ファイルの末尾一行を表示する
tailコマンドに「-n」オプションをつけて実行すると、対象ファイルの末尾一行のみが
表示されます。例えば「/etc/passwd」に対し、次のコマンドを実行することで、OSに
追加した直近のアカウントを確認できます。
$ tail -n 1 /etc/passwd
・ファイルの内容をリアルタイムで表示する
tailコマンドに「-f」オプションをつけて実行すると、対象ファイルのリアルタイム表示が
始まります。適当なファイル「sample.txt」に対して次の実行してみます。
$ tail -f sample.txt
リアルタイム表示が始まるため、適当な内容をsample.txtに追記してみると、その内容
含め、sample.txtの中身が表示されることが確認できます。
grepコマンドを組み合わせた実践的な使い方については、次節で紹介します。
◆ sshdログのリアルタイム監視
実際にリアルタイムログ監視を行ってみます。今回は、sshのデーモンであるsshdのログ
ファイルを監視し、不正アクセスなどを想定した認証の失敗を検出してみます。Fedora
系のディストリビューションでは、デフォルトのsshdのログファイルは「/var/log/secure」
であり、このファイルをtailコマンドにて表示します。
【手順】
① 抽出対象文字列ファイルの作成(サーバ側)
ログファイルには様々な情報が記録されるため、専用の監視ツールを用いなければ可読性が
低下します。今回は簡単のため、すべてのログを監視せず、sshの認証失敗時に出力される
ログのみを監視します。sshの認証失敗時には、文字列「Failed」がログに記載されるため、
この文字列が記載されたファイル(今回は/tmp/error.txtとします)を用意しておき、監視の
際に用いることとします。
# echo "Failed" >> /tmp/error.txt
② ssh接続の準備(サーバ側)
クライアント側からssh接続するために、必要に応じてサーバ側で設定を行います。
具体的には、sshdデーモンの起動やファイアウォールなどによる通信の許可設定などです。
③ ログ監視の開始(サーバ側)
sshdのログファイルをtailコマンドで表示させ、サーバ側でリアルタイムログ監視を開始
します。このとき、ログファイルの内容をパイプでgrepコマンドに渡し、error.txtに記載
された内容にマッチするもののみ表示させるようにしています。また、--line-buffered
オプションにより、標準出力をバッファさせない(溜め込ませない)ように制御します。
このオプションをつけないと、次の手順④で発生させたログが、その後の手順⑤で
リアルタイムに抽出/表示されなくなります。より具体的には、認証に失敗する度に
コンソールに表示されるといった挙動とならなくなってしまいます(一度認証に失敗
してもコンソールに表示されず、二度三度失敗することで、それらの失敗がまとめて
一度に表示される挙動となり、リアルタイムとは言えなくなります)。
# tail -f /var/log/secure | grep --line-buffered -f /tmp/error.txt
④ ssh接続(クライアント側)
クライアント側でサーバ側にssh接続します。このとき、意図的に誤ったパスワードを
入力し、認証に失敗してみます。
$ ssh -p <ポート番号> <サーバ側のユーザ名>@<サーバ側のIPアドレス>
⑤ ログ確認(サーバ側)
サーバ側に戻り、ログ監視を行っているプロンプトを確認します。認証に失敗したログ
(今回は不正アクセスを想定)が正しく監視できていることが分かります。
⑥ 後処理(サーバ側)
tailコマンドを中断し、監視を終了します。必要に応じて、sshdデーモンの停止やファイア
ウォールなどによる通信の許可設定を行います(②で設定した内容を元に戻す作業です)。
単純ではありますが、ログのリアルタイム監視ができることが確認できました。
◆ その他のコマンド/ユーティリティによるリアルタイムログ監視の実現
tailコマンドだけでも最低限のリアルタイムログ監視はできますが、tailコマンド以外の
コマンドやユーティリティによるリアルタイムログ監視の方法も紹介します。コマンドや
ユーティリティの利用に制限がない場合は、本節の内容も参考にしてみてください。
・tailf
基本的には「-f」オプションをつけたtailコマンドと同じですが、対象ファイルへの
アクセスは追加で書き込みがない限り行われないため、リソース負荷を抑えること
できるという特徴を持ちます(参考1、参考2)。利用には、util-linuxパッケージの
導入が必要です。
・multitail
複数のファイルをリアルタイムで監視できます。コンソールを分割して別々のファイルを
表示したり、複数のファイルをマージして表示したりすることができます(参考3)。
・less +F
ファイルの中身を表示するlessコマンドを使う方法です。lessでファイルを表示後、「F」を
入力すると監視モードに移りますが、「+F」オプションつけて実行すると、監視モードを
初期状態としてlessコマンドを実行できます。監視モード中は、「Ctr+C」を入力することで
通常の表示モードに入り、リアルタイム監視をしながら文字列を検索するといったことが
できます。ただし、複数ファイルを表示したり、出力をgrepに渡してリアルタイムでログを
抽出するといったことは(おそらく)できません。
◆ 感想など
tailコマンドだけでも思いの外いろいろできることを学びました。普段使っている監視ソフトの
ありがたみを感じるとともに、それらの内部処理を考える機会となりました。
◆ 参考
・【参考1】https://www.commandlinux.com/man-page/man1/tailf.1.html
・【参考2】https://kcfran.com/2022/06/18/linux-command-tail-tailf/
・【参考3】https://rcmdnk.com/blog/2016/03/06/computer-linux-mac/
以上です。