Analyzing Linux Logs

Linux ログには多くの情報が蓄積されていますが、問題はそれをどのように抽出するかです。

このセクションでは、これらのツールの使用方法と、SolarWinds® Loggly®などのログ管理ソリューションがログ分析プロセスの自動化と合理化にどのように役立つかを紹介します。

Grepで検索する

ログを分析する最も簡単な方法の1つは、grepを使ってプレーンテキストの検索を行うことです。

簡単な検索を行うには、検索文字列の後に検索したいファイルを入力します。

$ grep "user hoover" /var/log/auth.logpam_unix(sshd:session): session opened for user hoover by (uid=0)pam_unix(sshd:session): session closed for user hoover

この検索では、完全に一致したものを含む行が返されることに注意してください。

正規表現

正規表現 (regex) とは、ファイル内の特定のテキスト パターンを見つけるための構文です。 正規表現は、単純なテキスト検索よりもはるかに柔軟性が高く、単純な文字列のマッチングだけでなく、さまざまなテクニックを使用することができます。

例えば、ポート 4792 での認証の試みを見つけたいとします。 単純に「4792」と検索するとポートにマッチしますが、タイムスタンプやURL、その他の数字にもマッチします。

$ grep "4792" /var/log/auth.logAccepted password for hoover from 10.0.2.2 port 4792 ssh274.91.21.46 - - "GET /scripts/samples/search?q=4792HTTP/1.1" 404 545 "-" "-”

これを防ぐには、「port」と空のスペースが先行する 4792 のインスタンスのみを返す正規表現を使用します。 これには positive lookbehind と呼ばれるテクニックを使います。

$ grep -P "(?<=port\s)4792" /var/log/auth.logAccepted password for hoover from 10.0.2.2 port 4792 ssh2

サラウンド検索

サラウンド検索を使用すると、マッチした行の前後の行数が返されます。 これにより、イベントに至るまで、またはイベントの直後に起こったイベントを追跡することで、各イベントのコンテキストを提供します。

例えば、無効なユーザー名でログインを試みたユーザーを検索し、その周辺の結果を表示してみます。 ログインに失敗したユーザーは、リバース マッピングのチェックにも失敗していることがわかります。 これは、クライアントが有効な逆方向のDNSレコードを持っていないことを意味し、公衆インターネット接続ではよくあることです。

$ grep -B 3 -A 2 'Invalid user' /var/log/auth.logApr 28 17:06:20 ip-172-31-11-241 sshd: reverse mapping checking getaddrinfo for 216-19-2-8.commspeed.net failed - POSSIBLE BREAK-IN ATTEMPT!Apr 28 17:06:20 ip-172-31-11-241 sshd: Received disconnect from 216.19.2.8: 11: Bye Bye Apr 28 17:06:20 ip-172-31-11-241 sshd: Invalid user admin from 216.19.2.8Apr 28 17:06:20 ip-172-31-11-241 sshd: input_userauth_request: invalid user admin Apr 28 17:06:20 ip-172-31-11-241 sshd: Received disconnect from 216.19.2.8: 11: Bye Bye 

Tail

Tail は、ファイルからの最新の変更をリアルタイムで表示することができる別のコマンド ライン ツールです。 これは、サービスの再起動やコード変更のテストなど、進行中のプロセスを監視するのに便利です。 また、tailを使ってファイルの最後の数行を表示したり、grepと組み合わせてログファイルの出力をフィルタリングすることもできます。

$ tail -f /var/log/auth.log | grep 'Invalid user'Apr 30 19:49:48 ip-172-31-11-241 sshd: Invalid user ubnt from 219.140.64.136Apr 30 19:49:49 ip-172-31-11-241 sshd: Invalid user admin from 219.140.64.136

grep と正規表現に関する完全な紹介はこのガイドの範囲外ですが、このセクションの最後に詳しいリソースがあります。

parse

Cut

cut コマンドを使用すると、区切りのあるログからフィールドを解析することができます。

例えば、このログからユーザーを解析するとしましょう。

pam_unix(su:auth): authentication failure; logname=hoover uid=1000 euid=0 tty=/dev/pts/0 ruser=hoover rhost= user=root

このように cut コマンドを使用して、8 番目にマッチしたものを得ることができます。 この例はUbuntuシステムでのものです。

$ grep "authentication failure" /var/log/auth.log | cut -d '=' -f 8root

Awkでのフィルタリングと解析

フィルタリングにより、全文検索をする代わりに、特定のフィールドの値で検索することができます。 これにより、ログメッセージの他の部分からの望ましくないマッチを無視することができるため、ログ分析がより正確になります。 フィールド値で検索するためには、まずログを解析するか、少なくともイベント構造に基づいて検索する方法が必要です。

Awk は強力なコマンド ライン ツールで、完全なスクリプト言語を提供しているため、フィールドのフィルタリングや解析をより効果的に行うことができます。 たとえば、失敗したすべてのログイン試行からユーザー名を抽出したいとします。 私たちのログは次のような形式になっています。

Mar 24 08:28:18 ip-172-31-11-241 sshd: input_userauth_request: invalid user guest 

ここでは、awkコマンドの使い方を説明します。 まず、正規表現の/sshd.*invalid user/を使って、sshdのinvalid userの行にマッチさせます。 次に、 { print $9 } を使って、デフォルトの区切り文字 (スペース文字) を使って 9 番目のフィールドを表示します。

$ awk '/sshd.*invalid user/ { print $9 }' /var/log/auth.logguest

Filtering on Errors With Awk

人々がログで見たいと思う最も一般的なものの 1 つがエラーです。

この問題を解決するには、2つの方法があります。 まず、rsyslogの設定を変更し、ログファイルに重大度を出力することで、読みやすく、検索しやすくすることができます。 rsyslogの設定で、以下のようなpri-textを持つテンプレートを追加します。

"<%pri-text%> : %timegenerated%,%HOSTNAME%,%syslogtag%,%msg%n"

この例では、以下のような形式で出力されます。 このメッセージのseverityが「err」であることがわかります:

<authpriv.err> : Mar 11 18:18:00,hoover-VirtualBox,su:, pam_authenticate: Authentication failure

awkを使ってエラーメッセージだけを検索することができます。

$ awk '/.err>/ {print}' /var/log/auth.log<authpriv.err> : Mar 11 18:18:00,hoover-VirtualBox,su:, pam_authenticate: Authentication failure

コマンドライン ツールは小さなファイルをすばやく検索するのには便利ですが、大きなファイルや複数のシステムにまたがる場合にはうまく機能しません。 大量のログデータを素早く検索するには、ログ管理システムの方がはるかに効果的です。

ログ 管理システムでの検索

ログ管理システムは、大量のログ ファイルのコレクションを分析および検索するプロセスを簡略化します。 ログ管理システムは、syslog イベント、SSH ログ、および Web サーバー ログなどの一般的なログ フォーマットを自動的に解析することができます。 また、各フィールドにインデックスを付けることで、ギガバイト、テラバイト単位のログデータを素早く検索することができます。 また、Apache Luceneのようなクエリ言語を使用して、grepよりも柔軟な検索を、regexよりも簡単な検索構文で実現しています。

例えば、ここではクラウドベースのログ管理サービスであるSolarWinds® Loggly®を使ってDebianサーバからログを収集しています。 以下は、自動的にユーザー フィールドを解析する sshd からのログ メッセージの例です。

Loggly によって解析されたログイン試行の失敗です。

非標準的なフォーマットのためのカスタム解析を行うこともできます。 派生フィールドを使用して、レイアウトを定義することで、メッセージの解析されていない部分を解析することができます。 これにより、解析されていないデータを1つの文字列として扱うのではなく、個々のフィールドにインデックスを付けることができます。

Loggly のフィールド エクスプローラーで派生フィールドを表示します。

ログ管理システムでエラーにフィルターをかける

ログ管理システムは、ログを自動的に解析するので、エラーにフィルターをかけるのが簡単です。 多くの場合、目的のフィールドをクリックして値を入力するだけで、結果のログをフィルタリングすることができます。

SolarWinds Logglyで重大度が「エラー」のsyslogメッセージにフィルタリングする。

Grepと正規表現! (Ryans Tutorials)

The GNU Awk User’s Guide (GNU)

Using Grep + Regex (Regular Expressions) to Search Text in Linux (DigitalOcean)

See it. Analyze it. Inspect it. 解決する

重要なことを見る。

START FREE TRIAL

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です