108.2 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
108 基本的なシステムサービス |
Objective: |
108.2 システムロギング |
Lesson: |
1 of 2 |
はじめに
ログは、システム管理者の強い味方です。ログとは、起動した瞬間からシステムやネットワークに関するすべてのイベントを時系列順に記録したファイル(通常はテキストファイル)です。したがって、ログに含まれる情報には、認証の失敗、プログラムやサービスのエラー、ファイアウォールでブロックされたホストなど、システムに関するほぼすべてのイベントが含まれます。トラブルシューティング、リソースのチェック、プログラムの異常な動作の検出など、ログはシステム管理者の日々の業務に非常に重要であることが容易に想像できるでしょう。
このレッスンでは、現在のGNU/Linuxディストリビューションで最も一般的なログ記録機構の一つである rsyslog
について説明します。さまざまなログの種類、どこに保存されていてどのような情報を含んでいるか、それらの情報を取得してフィルタリングする方法を学びます。また、ログをIPネットワーク上のあるサーバに保存する方法、ログローテーション、カーネル リング バッファについても説明します。
システムロギング
カーネルやシステム内のさまざまなプロセスが起動して互いに通信し始めると、メッセージという形で多くの情報が生成され、多くの場合はログに記録されます。
ログがなければシステム管理者がサーバーで発生したイベントを見つけることは困難ですから、あらゆるシステムイベントを記録する標準的な集中管理方法を備えることが重要です。ログは、トラブルシューティングとセキュリティに関して極めて有用であり、システム統計を把握して傾向を予測するための信頼できるデータソースになります。
とりあえず systemd-journald
は、次のレッスンで説明するので置いておきます。ロギングは従来、syslog
、syslog-ng
(syslog新世代)、ならびに rsyslog
(r
は ”rocketのように高速” の意)という、3種の専用サービスによって処理されてきました。rsyslog
には(RELPサポートなどの)重要な改良が追加されたので、現在、最も人気のある選択肢になっています。これらのサービスは、他のサービスやプログラムからメッセージを集めて、通常は /var/log
の下のログファイルに保存します。ただし、中には独自にログを処理するサービス(たとえば、Apache HTTPD Webサーバーや、CUPS印刷システム)もあります。また、Linuxカーネルは、ログメッセージを格納するためにメモリ内のリングバッファを使用します。
Note
|
|
ほぼすべての主要なディストリビューションで rsyslog
が事実上標準のロギング機構として使用されているので、このレッスンではそれに焦点を当てます。rsyslog
はクライアントサーバーモデルを使用します。クライアントとサーバーは、同じホストにあっても、異なるホストにあっても構いません。メッセージは規定の形式で送受信され、ネットワーク全体で集中管理された rsyslog
サーバーに保持することができます。rsyslogデーモン(rsyslogd
)は、klogd
(カーネルメッセージを管理する)と連携して動作します。次のセクションでは、rsyslog
とその仕組みについて説明します。
Note
|
デーモンとは、バックグラウンドで実行されるサービスです。デーモン名末尾の |
ログの種類
ログは 変化していく データであるため、通常は /var/log
に置かれます。ログを大まかに分類すると、システムログ と サービスないしアプリケーションプログラムのログ に分類できます。
いくつかのシステムログと、それらが保持する情報を見てみましょう。
Note
|
ログファイルの名前や書き込まれる情報は、ディストリビューションによって異なっています。ここで取り上げている例は、主にDebian系のものです。ディストリビューションによらない標準的なものは明記しています。 |
/var/log/auth.log
-
認証処理に関する活動: ユーザーのログイン、
sudo
の実行、cronジョブ、失敗したログイン試行など。 /var/log/syslog
-
rsyslogd
に集約されたほぼすべてのログを納めるファイル。非常に多くの種類のログが集まるので、/etc/rsyslog.conf
による設定で、他のファイルに分散することもあります。(主にDebian系ディストリビューション) /var/log/debug
-
プログラムからのデバッグ情報。(訳注: ほとんど使われません。)
/var/log/kern.log
-
カーネルからのメッセージ。
/var/log/messages
-
さまざまなサービス(カーネルを除く)からのメッセージ。(主にRedHat系ディストリビューション)
/var/log/daemon.log
-
バックグラウンドで実行されているデーモン(サービス)に関する情報。
/var/log/mail.log
-
メールサービス(postfixなど)に関する情報。
/var/log/Xorg.0.log
-
グラフィックカードに関する情報。
/var/run/utmp
と/var/log/wtmp
-
成功したログインに関する情報。(どのディストリビューションにも共通)
/var/log/btmp
-
失敗したログインに関する情報。例えば、sshへのブルートフォース攻撃など。(どのディストリビューションにも共通)
/var/log/faillog
-
失敗した認証に関する情報。
/var/log/lastlog
-
ユーザーが最後にログインした日時。(どのディストリビューションにも共通)
次に、サービスに関するログの例をいくつか見てみましょう。
/var/log/cups/
-
印刷システム(Common Unix Printing System)のログを格納するディレクトリ。一般的なデフォルトでは、次のログファイルが置かれます:
error_log
、page_log
、access_log
。 /var/log/apache2/
ないし/var/log/httpd
-
Apache Webサーバー のログを格納するディレクトリ。一般的なデフォルトでは、次のログファイルが置かれます:
access.log
、error_log
、other_vhosts_access.log
。 /var/log/mysql
-
MySQLリレーショナルデータベース管理システム のログを格納するディレクトリ。一般的なデフォルトでは、以下のログファイルが置かれます:
error_log
、mysql.log
、mysql-slow.log
。 /var/log/samba/
-
Samba(Windows Serverと互換性のあるファイル、プリント、ディレクトリなどのサービスを提供するサーバー)のログを格納するディレクトリ。一般的なデフォルトでは、以下のログファイルが置かれます:
smbd.log
、nmbd.log
など。
ログの読み出し
ログファイルを読み出すには、まず、rootユーザーであるか、ファイルに対する読み取り権限を持っていることを確認してください。その上で、次のようなさまざまなユーティリティが使用できます。
less
ないしmore
-
ページごとに表示やスクロールを行うページャー。
root@debian:~# less /var/log/auth.log Sep 12 18:47:56 debian sshd[441]: Received SIGHUP; restarting. Sep 12 18:47:56 debian sshd[441]: Server listening on 0.0.0.0 port 22. Sep 12 18:47:56 debian sshd[441]: Server listening on :: port 22. Sep 12 18:47:56 debian sshd[441]: Received SIGHUP; restarting. Sep 12 18:47:56 debian sshd[441]: Server listening on 0.0.0.0 port 22. Sep 12 18:47:56 debian sshd[441]: Server listening on :: port 22. Sep 12 18:49:46 debian sshd[905]: Accepted password for carol from 192.168.1.65 port 44296 ssh2 Sep 12 18:49:46 debian sshd[905]: pam_unix(sshd:session): session opened for user carol by (uid=0) Sep 12 18:49:46 debian systemd-logind[331]: New session 2 of user carol. Sep 12 18:49:46 debian systemd: pam_unix(systemd-user:session): session opened for user carol by (uid=0) (...)
zless
ないしzmore
-
less
やmore
と同じですが、gzip
(logrotate
の標準機能)で圧縮されたログを扱えます。(訳注: ディストリビューションによってはless
の拡張機能が有効になっていて、less
コマンドで圧縮ファイルを読み出せます。)root@debian:~# zless /var/log/auth.log.3.gz Aug 19 20:05:57 debian sudo: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/sbin/shutdown -h now Aug 19 20:05:57 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0) Aug 19 20:05:57 debian lightdm: pam_unix(lightdm-greeter:session): session closed for user lightdm Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event2 (Power Button) Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event3 (Sleep Button) Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event4 (Video Bus) Aug 19 23:50:49 debian systemd-logind[333]: New seat seat0. Aug 19 23:50:49 debian sshd[409]: Server listening on 0.0.0.0 port 22. (...)
tail
-
ファイルの最後の行を表示します(デフォルトは10行です)。tailの威力は
-f
スイッチにあり、新しい行が追加されるとすぐに表示します。root@suse-server:~# tail -f /var/log/messages 2019-09-14T13:57:28.962780+02:00 suse-server sudo: pam_unix(sudo:session): session closed for user root 2019-09-14T13:57:38.038298+02:00 suse-server sudo: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/usr/bin/tail -f /var/log/messages 2019-09-14T13:57:38.039927+02:00 suse-server sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0) 2019-09-14T14:07:22+02:00 debian carol: appending new message from client to remote server...
head
-
ファイルの最初の行を表示します(デフォルトは10行です)。
root@suse-server:~# head -5 /var/log/mail 2019-06-29T11:47:59.219806+02:00 suse-server postfix/postfix-script[1732]: the Postfix mail system is not running 2019-06-29T11:48:01.355361+02:00 suse-server postfix/postfix-script[1925]: starting the Postfix mail system 2019-06-29T11:48:01.391128+02:00 suse-server postfix/master[1930]: daemon started -- version 3.3.1, configuration /etc/postfix 2019-06-29T11:55:39.247462+02:00 suse-server postfix/postfix-script[3364]: stopping the Postfix mail system 2019-06-29T11:55:39.249375+02:00 suse-server postfix/master[1930]: terminating on signal 15
grep
-
指定した文字列を抽出する、フィルタリングユーティリティです。
root@debian:~# grep "dhclient" /var/log/syslog Sep 13 11:58:48 debian dhclient[448]: DHCPREQUEST of 192.168.1.4 on enp0s3 to 192.168.1.1 port 67 Sep 13 11:58:49 debian dhclient[448]: DHCPACK of 192.168.1.4 from 192.168.1.1 Sep 13 11:58:49 debian dhclient[448]: bound to 192.168.1.4 -- renewal in 1368 seconds. (...)
実行例で気づいたかもしれませんが、ログファイルの出力には次の項目が含まれます(訳注: タイムスタンプの書式が異なる例が混ざっていますが、rsyslogではエントリごとに書式を設定する事ができます(LPIC-1範囲外です)。ほとんどの場合は、英語表記の現地時間です。):
-
タイムスタンプ(日時)
-
メッセージを送信したホスト名
-
メッセージを生成したプログラム/サービスの名前
-
メッセージを生成したプログラムのPID
-
実行されたアクションの説明(プログラム/サービスが出力したメッセージ)
テキストではなくバイナリファイルのログがいくつかあり、解析するには専用のコマンドが必要となります(訳注: 重要なツールについては、トピック110.1で説明します。):
/var/log/wtmp
-
who
ないしw
を使用します。root@debian:~# who root pts/0 2020-09-14 13:05 (192.168.1.75) root pts/1 2020-09-14 13:43 (192.168.1.75)
/var/log/btmp
-
utmpdump
ないしlast -f
を使用します。root@debian:~# utmpdump /var/log/btmp Utmp dump of /var/log/btmp [6] [01287] [ ] [dave ] [ssh:notty ] [192.168.1.75 ] [192.168.1.75 ] [2019-09-07T19:33:32,000000+0000]
/var/log/faillog
-
faillog
を使用します。root@debian:~# faillog -a | less Login Failures Maximum Latest On root 0 0 01/01/70 01:00:00 +0100 daemon 0 0 01/01/70 01:00:00 +0100 bin 0 0 01/01/70 01:00:00 +0100 sys 0 0 01/01/70 01:00:00 +0100 sync 0 0 01/01/70 01:00:00 +0100 games 0 0 01/01/70 01:00:00 +0100 man 0 0 01/01/70 01:00:00 +0100 lp 0 0 01/01/70 01:00:00 +0100 mail 0 0 01/01/70 01:00:00 +0100 (...)
/var/log/lastlog
-
lastlog
を使用します。root@debian:~# lastlog | less Username Port From Latest root Never logged in daemon Never logged in bin Never logged in sys Never logged in (...) sync Never logged in avahi Never logged in colord Never logged in saned Never logged in hplip Never logged in carol pts/1 192.168.1.75 Sat Sep 14 13:43:06 +0200 2019 dave pts/3 192.168.1.75 Mon Sep 2 14:22:08 +0200 2019
Note
|
ログファイルを読み出すためのグラフィカルツールもあります。例: |
メッセージをログに記録する仕組み
ログファイルへのメッセージの書き出しは、次のような流れで行われます:
-
アプリケーションやサービスは
/dev/log
(ソケット)に、カーネルは/dev/kmsg
(メモリバッファ) などの特殊なファイルにメッセージを書き込みます。 -
rsyslogd
が、ソケットやメモリバッファから情報を取得します。 -
/etc/rsyslog.conf
や/etc/ryslog.d/
内のファイルに記載されたルールに応じて、rsyslogd
が情報(メッセージ)を指定されたログファイル(通常は/var/log
に置かれる)に書き込みます。
Note
|
ソケットは、プロセス間で情報をやりとりするために使用する特別なファイルです。システム上のすべてのソケットを一覧表示するには、 |
ファシリティ(分類)、プライオリティ(優先度)、アクション(動作)
rsyslog
の設定ファイルは /etc/rsylog.conf
です (ディストリビューションによっては /etc/rsyslog.d/
にもあります)。通常は MODULES
、GLOBAL DIRECTIVES
、RULES
という3つのセクションに分かれています。Debian GNU/Linux 10(buster)の rsyslog.conf
ファイルを見てみましょう — less /etc/rsyslog.conf
を実行します。
rsyslog
はモジュール構造で、組み込む機能を選択することができます。MODULES
セクションでは、rsyslog
に組み込むモジュールを定義します。通常は、ローカルマシンでのロギングのみが有効となっていて、リモートマシンからのログを扱うには設定が必要です。
################# #### MODULES #### ################# module(load="imuxsock") # provides support for local system logging module(load="imklog") # provides kernel logging support #module(load="immark") # provides --MARK-- message capability # provides UDP syslog reception #module(load="imudp") #input(type="imudp" port="514") # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514")
GLOBAL DIRECTIVES
セクションでは、ログやログディレクトリのパーミッションなど、さまざまな設定を行います。
########################### #### GLOBAL DIRECTIVES #### ########################### # # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # # Set the default permissions for all log files. # $FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 # # Where to place spool and state files # $WorkDirectory /var/spool/rsyslog # # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf
RULES
セクションでは、送られてきたログメッセージに応じて、書き込むログファイルを選択するルールを定義します。ログメッセージに含まれる ファシリティ(分類) と プライオリティ(優先度) に応じて、アクション(動作) を指定します。アクションには、主にログファイルの絶対パスを指定します。このセクションに記載されたルールを理解するには、ファシリティとプライオリティの概念を理解する必要があります。ファシリティ には以下のものが定義されていて、ログメッセージを生成するデーモンが適当なものを選択します。たとえば、メールサーバーである postfix
は、mail
ファシリティのログメッセージを生成します。(訳注: syslogはさまざまなシステムで使われていて、システムによって使用できるファシリティが微妙に異なります。)
番号 | キーワード | 説明 |
---|---|---|
|
|
Linuxカーネルメッセージ |
|
|
ユーザーレベルのメッセージ |
|
|
メールシステム |
|
|
システムデーモン |
|
|
セキュリティ上の認証/承認に関するメッセージ |
|
|
syslogdメッセージ |
|
|
ラインプリンタサブシステム |
|
|
ネットワークニュースサブシステム |
|
|
UUCP (Unix-to-Unix Copy Protocol) サブシステム |
|
|
時計デーモン(システムによって異なる) |
|
|
セキュリティ上の認証/承認に関するメッセージ |
|
(rsyslogでは使えません) |
|
|
|
ローカル使用0-7 |
また、各メッセージには プライオリティ(優先度)レベルが割り当てられます。
コード | 重大度 | キーワード | 説明 |
---|---|---|---|
|
Emergency(緊急事態) |
|
システムが使用できない |
|
Alert(警報) |
|
すぐに行動を起こす必要がある |
|
Critical(重大) |
|
危険な状態 |
|
Error(エラー) |
|
エラー状態 |
|
Warning(警告) |
|
警告状態 |
|
Notice(通知) |
|
正常だが注意が必要 |
|
Informational(情報) |
|
情報メッセージ |
|
Debug(デバッグ) |
|
デバッグレベルのメッセージ |
以下は、Debian GNU/Linux 10(Baster)の rsyslog.conf
の一部から、いくつかのルールをサンプルとして取り出したものです:
############### #### RULES #### ############### # First some standard log files. Log by facility. # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # mail.info -/var/log/mail.info mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # # Some "catch-all" log files. # *.=debug;\ auth,authpriv.none;\ news.none;mail.none -/var/log/debug *.=info;*.=notice;*.=warn;\ auth,authpriv.none;\ cron,daemon.none;\ mail,news.none -/var/log/messages
ルールの書式はこうなります: <facility>.<priority>
<action>
<facility>.<priority>
をセレクターと呼び、一致するメッセージを絞り込みます。<facility>
には、カンマで区切って複数のキーワードを指定することができます。<priority>
には、指定したレベルよりも重大なもの(コードが小さいもの)が一致します。例を見ながら掘り下げていきましょう。
auth,authpriv.* /var/log/auth.log
ファシリティが auth
ないし authpriv
のメッセージを、プライオリティに関係なく(*
)、/var/log/auth.log
に書き込みます。
*.*;auth,authpriv.none -/var/log/syslog
すべてのメッセージ(すべてのプライオリティ(*
)と、すべてのファシリティ(*
))を選択しますが、ファシリティが auth
または authpriv
のものを除きます。プライオリティに none
と書くと、直前のファシリティを「除外する」という意味になります。メッセージは /var/log/syslog
に書き込まれますが、パスの前のマイナス記号(-
)はディスクへの書き込み回数を抑えることを指示します。セミコロン(;
)は複数のセレクターを区切るものであり、コンマ(,
)は1つのセレクターに複数のファシリティ(auth,authpriv
)を列挙するための区切りです。
mail.err /var/log/mail.err
この例では、ファシリティが mail
で、プライオリティが error
以上(critical
、alert
、emergency
)のメッセージを、/var/log/mail.err
に書き込みます。
*.=debug;\ auth,authpriv.none;\ news.none;mail.none -/var/log/debug
この例では、すべてのファシティからプライオリティが debug
(=
により指定したレベルのみに限定されます)のメッセージがまず選択されますが、ファシリティ auth
、authpriv
、news
、mail
であるメッセージが除外されて(プライオリティが none
)、/var/log/debug
ファイルに書き込まれます。
logger
コマンド: ログへの手動送信
シェルスクリプトの中や(ログ設定の)テスト中は、logger
コマンドが便利です。logger
コマンドは、ファシリティ user
、プライオリティ notice
で、指定されたメッセージをsyslogに送ります(訳注: デフォルトでは、Debian系は /var/log/syslog
、Redhat系は /var/log/messages
に書き込まれることになります。ファシリティやプライオリティを指定する時には、-p
オプションを使います)。
carol@debian:~$ logger this comment goes into "/var/log/syslog"
/var/log/syslog
ファイルの最後の行を出力するには、tailコマンドに -1
オプションを指定します。
root@debian:~# tail -1 /var/log/syslog Sep 17 17:55:33 debian carol: this comment goes into /var/log/syslog
rsyslog
で集中ログサーバーを作る
説明用に、以下の諸元の新しいホストを作成し、これを集中ログサーバーとしてみましょう。つまり、クライアントのsyslogメッセージを、すべてこのサーバーに送信して、集中的に管理できるようにします。
役割 | ホスト名 | OS | IPアドレス |
---|---|---|---|
集中ログサーバー |
|
openSUSE Leap 15.1 |
192.168.1.6 |
クライアント |
|
Debian GNU/Linux 10 (buster) |
192.168.1.4 |
サーバーを構成することから始めましょう。まず、rsyslog
が稼働していることを確認します:
root@suse-server:~# systemctl status rsyslog rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2019-09-17 18:45:58 CEST; 7min ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 832 (rsyslogd) Tasks: 5 (limit: 4915) CGroup: /system.slice/rsyslog.service └─832 /usr/sbin/rsyslogd -n -iNONE
openSUSEには、リモートロギング用の設定ファイル /etc/rsyslog.d/remote.conf
が付属しています。TCP経由でクライアント(リモートホスト)からのメッセージ受信を有効にしましょう。モジュールをロードし、TCPポート514でサーバーを起動する行のコメントを外します。(訳注: $ModLoad imtcp.so
行と $InputTCPServerRun
行。ここではTCPでログメッセージを送信する例を挙げている。)。
# ######### Receiving Messages from Remote Hosts ########## # TCP Syslog Server: # provides TCP syslog reception and GSS-API (if compiled to support it) $ModLoad imtcp.so # load module ##$UDPServerAddress 10.10.0.1 # force to listen on this IP only $InputTCPServerRun 514 # Starts a TCP server on selected port # UDP Syslog Server: #$ModLoad imudp.so # provides UDP syslog reception ##$UDPServerAddress 10.10.0.1 # force to listen on this IP only #$UDPServerRun 514 # start a UDP syslog server at standard port 514
設定を変更したら、rsyslogサービスを再起動して、サーバーがポート514でリッスンしていることを確認します。(訳注: netstatがインストールされていない場合は、ss -tln
を使用して下さい。トピック109.3で説明しています。)
root@suse-server:~# systemctl restart rsyslog root@suse-server:~# netstat -nltp | grep 514 [sudo] password for root: tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 2263/rsyslogd tcp6 0 0 :::514 :::* LISTEN 2263/rsyslogd
次に、ファイアウォールのポートを開いて設定を再ロードします。(訳注: LPIC-1範囲外です)。
root@suse-server:~# firewall-cmd --permanent --add-port 514/tcp success root@suse-server:~# firewall-cmd --reload success
Note
|
openSUSE Leap 15.0の登場で、古典的な |
テンプレートとフィルター条件
ここまでの設定で、リモートから届いたログメッセージが、ローカルマシンからログメッセージと同様にファシリティとプライオリティに応じたファイルに書き込まれるようになりました。それぞれのログメッセージには、そのログを送ったホスト名が含まれていますから、通常はこれだけの設定で十分です。
ここでは、リモートマシンごとにログを保存するディレクトリを分けるように設定してみましょう。rsyslog
の テンプレート 機能と、フィルター条件 を使います(訳注: いずれもLPIC−1範囲外)。以下の行を、/etc/rsyslog.conf
(または /etc/rsyslog.d/remote.conf
など)に追加します。
$template RemoteLogs,"/var/log/remotehosts/%HOSTNAME%/%$NOW%.%syslogseverity-text%.log" if $FROMHOST-IP=='192.168.1.4' then ?RemoteLogs & stop
- Template
-
最初に指定する template行では、ログファイル名を動的に生成しますします。この行は以下の項目から成っています。
-
templateディレクティブ(
$template
) -
テンプレート名(
RemoteLogs
) -
テンプレート本体(
"/var/log/remotehosts/%HOSTNAME%/%$NOW%.%syslogseverity-text%.log"
) -
オプション(省略)
このテンプレートの名前は
RemoteLogs
であり、その本体は/var/log/remotehosts
から始まるパス名です。%
で挟まれた文字列は プロパティ置換子 と呼び、以下のように展開されます。ルールの中でテンプレートを呼び出すと、置換によって生成された文字列が<action>として扱われます。-
%HOSTNAME%
: 送信元のホスト名 -
`%$NOW$%: 現在時刻(YYYY-MM-DD形式)
-
%syslogseverity-text%
: プライオリティ名
-
- フィルタ条件
-
続く2行は、フィルタ条件と、一致した時のアクションを定義しています:
-
式ベースのフィルタ(
if $FROMHOST-IP=='192.168.1.4'
) -
アクション(
then ?RemoteLogs
、& stop
)
-
1行目は、ログメッセージの送信元リモートホストのIPアドレスが指定のIPアドレスと一致した場合に RemoteLogs
テンプレートを呼び出します。2行目(& stop
)は、メッセージを /var/log/remotehosts/<リモートホスト名>
ディレクトリ内のファイルにのみ書き込み、他のルールを実行しないこと(つまり /var/log/messages
などには書き込まないこと)を示しています。
Note
|
テンプレート、プロパティ、ルールの詳細については、 |
設定を変更したら rsyslog
を再起動し、/var/log
に <リモートホスト名>
ディレクトリがまだできていないことを確認します。
root@suse-server:~# systemctl restart rsyslog root@suse-server:~# ls /var/log/ acpid chrony localmessages pbl.log Xorg.0.log alternatives.log cups mail pk_backend_zypp Xorg.0.log.old apparmor firebird mail.err samba YaST2 audit firewall mail.info snapper.log zypp boot.log firewalld mail.warn tallylog zypper.log boot.msg krb5 messages tuned boot.omsg lastlog mysql warn btmp lightdm NetworkManager wtmp
以上でサーバーの設定を終えました。次にクライアントを設定します。
ここでも、rsyslog
がインストールされて稼働していることを確認します。
root@debian:~# systemctl status rsyslog rsyslog.service - System Logging Service Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: Active: active (running) since Thu 2019-09-17 18:47:54 CEST; 7min ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 351 (rsyslogd) Tasks: 4 (limit: 4915) CGroup: /system.slice/rsyslog.service └─351 /usr/sbin/rsyslogd -n
このサンプル環境では、/etc/hosts
に行 192.168.1.6 suse-server
を追加して、クライアントがサーバーの名前を解決できるようにしています。つまり、クライアントは、名前(suse-server
)ないしIPアドレス(192.168.1.6
)のいずれかでサーバーを参照できます。
クライアントのdebianには /etc/rsyslog.d/
に remote.conf
ファイルが無いので、/etc/rsyslog.conf
に設定を追加します。ファイルの末尾に以下の行を書き込みます。
*.* @@suse-server:514
@@
はTCPでリモートホスト(suse-server
)宛てにログメッセージを送信することを示しています。(訳注: UDPを使用する場合には、@
を指定します)。
最後に、クライアントの rsyslog
を再起動します。
root@debian:~# systemctl restart rsyslog
さて、サーバー suse-server
に戻って、/var/log
ディレクトリに remotehosts
ディレクトリができていることを確認しましょう。
root@suse-server:~# ls /var/log/remotehosts/debian/ 2019-09-17.info.log 2019-09-17.notice.log
テンプレートで指定した /var/log/remotehosts
ディレクトリには、すでに2つのログが書き込まれています。この実習の最後に、クライアントdebianから 手動で ログを送信し、メッセージがログファイルに追加されることを確認しましょう。suse-server
で tail -f 2019-09-17.notice.log
を実行します。
root@suse-server:~# tail -f /var/log/remotehosts/debian/2019-09-17.notice.log 2019-09-17T20:57:42+02:00 debian dbus[323]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher' 2019-09-17T21:01:41+02:00 debian anacron[1766]: Anacron 2.3 started on 2019-09-17 2019-09-17T21:01:41+02:00 debian anacron[1766]: Normal exit (0 jobs run)
クライアント debian
で logger
コマンドを実行します。-t
オプションでメッセージの本文を指定します。
carol@debian:~$ logger -t DEBIAN-CLIENT Hi from 192.168.1.4
サーバー suse-server
のログ末尾に、クライアント debian
から送信したメッセージが表示されます。
root@suse-server:~# tail -f /var/log/remotehosts/debian/2019-09-17.notice.log 2019-09-17T20:57:42+02:00 debian dbus[323]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher' 2019-09-17T21:01:41+02:00 debian anacron[1766]: Anacron 2.3 started on 2019-09-17 2019-09-17T21:01:41+02:00 debian anacron[1766]: Normal exit (0 jobs run) 2019-09-17T21:04:21+02:00 debian DEBIAN-CLIENT: Hi from 192.168.1.4
ログローテーションの仕組み
以下の2つの理由から、ログを定期的に切り替える(ローテーションする)ことが必要です。
-
古いログファイルが必要以上にディスク容量を使用することを防ぐ。
-
操作しやすいように、ログを扱いやすい長さに保つ。
ログローテーションを行うユーティリティは logrotate
といい、ログファイルの名前を変更したり、圧縮したり、システム管理者に電子メールで送信したり、古くなったものを削除するといった処理を行います。ローテーションの際の、古いログファイルに対する命名規則にはさまざまなものが考えられます(たとえば、ファイル名の末尾に日付を追加する)が、整数のサフィックス(接尾辞)を追加するのが最も一般的です。
root@debian:~# ls /var/log/messages* /var/log/messages /var/log/messages.1 /var/log/messages.2.gz /var/log/messages.3.gz /var/log/messages.4.gz
この場合に、次回のログローテーションでは次の処理が行われます:
-
messages.4.gz
が削除されます。 -
messages.3.gz
はmessages.4.gz
に移動(名前変更)されます。 -
messages.2.gz
はmessages.3.gz
に移動(名前変更)されます。 -
messages.1
を圧縮してmessages.2.gz
とします。 -
messages
はmessages.1
に移動されます。空のmessages
が作成され、新しいログエントリを登録する準備が整います。
後で logrotate
のディレクティブ(指示子)を説明しますが、3世代目よりも古いログファイルが圧縮されるのに対し、2つの新しいログファイルは圧縮されないことに注意しましょう。またここでは、毎週ログを切り替えるものとして、前の週のログを読むには messages.1
を参照し、過去4〜5週間のログを保持するものとします。
logrotate
は、自動化プロセス、すなわちcronによって毎日実行される /etc/cron.daily/logrotate
スクリプトから実行されます。設定ファイルは /etc/logrotate.conf
であり、このファイルには目的や簡単な説明を示すコメントと共にいくつものグローバルオプション(ディレクティブ)が含まれています。
carol@debian:~$ sudo less /etc/logrotate.conf # see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d (...)
/etc/lorotate.d
ディレクトリには、(ログを利用する)パッケージ用の設定ファイルが置かれています。これらのファイルには、それぞれのパッケージに固有の設定として、ローテーションするログファイル名と、その処理方法が指定されています。これらのファイルは /etc/logrotate.conf
の後に読み込まれるので、ここで指定するオプションはグローバルオプションよりも優先されます。/etc/logrotate.d/rsyslog
ファイルの一部を見てみましょう:
/var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc.d rsyslog rotate > /dev/null endscript }
ディレクティブとその値は、空白ないしはイコール(=
省略可能)で区切ります。postrotate
と endscript
の間の行は、そのままコマンドとしてローテーション処理の最後に実行されます。行毎に説明しましょう:
rotate 4
-
4週間分のログを保持します。
weekly
-
毎週ログファイルをローテートする。
missingok
-
ログファイルが存在していない場合でもエラーとせず、処理を続行する。
notifempty
-
ログが空の場合は、ローテーションを行わない。
compress
-
gzip
(デフォルト)でログファイルを圧縮する。 delaycompress
-
直近のログファイルの圧縮を、次のローテーションサイクルに延期する(compressを指定した場合にのみ有効)。プログラムに使用中のログファイルを閉じることを指示できず、現在のログファイルへの書き込みが続く可能性がある場合に指定します。
sharedscripts
-
postrotate を指定した場合に、そのスクリプトの実行方法を指定するもので、指定しているログファイルの数にかかわらず(例えば
/var/log/*
など)、スクリプトを1回だけ実行します。なお、ローテーションを必要とするファイルが1つも無い場合には、スクリプトは実行されません。また、スクリプトがエラーで終了した時は、後続のコマンドは実行されません。 postrotate
-
postrotate スクリプトの開始を示します。
invoke-rc.d rsyslog rotate > /dev/null
-
ログローテーションが完了した後に
/bin/sh
で実行されるコマンド、すなわち postrotate スクリプトの本体です。(訳注:invode-rc.d
コマンドは、SysV Init形式の起動スクリプト(トピック101.2)を実行するコマンドです。) endscript
-
postrotate スクリプトの終わりを示します。
Note
|
ディレクティブの一覧とその説明は、 |
カーネル リング バッファ
カーネルは起動時にいくつものメッセージを生成しますが、その時点ではまだ rsyslogd
が起動していませんから、カーネルのメッセージを記録するための仕組みが必要です。そのために カーネルリングバッファ(kernel ring buffer) という固定サイズのデータ構造が用意されています。固定サイズなので、いっぱいになると古いメッセージが新しいメッセージで上書きされて消えていきます。
dmesg
コマンドは、カーネルリングバッファの内容を出力します。バッファのサイズはかなり大きく、出力が長くなることが多いので、grep
でフィルタリングして使用するのが一般的です。たとえば、USBデバイスに関連するメッセージを検索するには、次のようにします:
root@debian:~# dmesg | grep "usb" [ 1.241182] usbcore: registered new interface driver usbfs [ 1.241188] usbcore: registered new interface driver hub [ 1.250968] usbcore: registered new device driver usb [ 1.339754] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001, bcdDevice= 4.19 [ 1.339756] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 (...)
演習
-
以下のシナリオで使うコマンドは何ですか?
やりたいこと コマンド /var/log/syslog.7.gz
を読む/var/log/syslog
を読む/var/log/syslog
から、単語renewal
をフィルタする/var/log/faillog
を読む/var/log/syslog
を実時間で読む -
適切なログメッセージになるように、以下の要素を並び替えて下さい:
-
debian-server
-
sshd
-
[515]:
-
Sep 13 21:47:56
-
Server listening on 0.0.0.0 port 22
正しい順番:
-
-
それぞれの処理を実現するために、
/etc/rsyslog.conf
に指定するルールはどうなりますか?-
ファシリティが
mail
で、プライオリティがcrit
以上のメッセージを、/var/log/mail.crit
に送る。 -
ファシリティが
mail
で、プライオリティがalert
とemergency
メッセージを、/var/log/mail.urgent
に送る。 -
ファシリティが
cron
およびntp
のものを除き、プライオリティに関係なく、すべてのメッセージを/var/log/allmessages
に送る。 -
必要なすべての設定が行われているものとして、TCPのデフォルトポートを使用して、ファシリティが
mail
であるすべてのメッセージを、IPアドレス192.168.1.88
のリモートホストに送信する。 -
ファシリティに関係なく、プライオリティが
warning
であるメッセージを、/var/log/warnings
に、ディスクへの書き込み回数を抑えながら書き込む。
-
-
以下に示す
/etc/logrotate.d/samba
の一節をみて、それぞれのオプションを説明してください。carol@debian:~$ sudo head -n 11 /etc/logrotate.d/samba /var/log/samba/log.smbd { weekly missingok rotate 7 postrotate [ ! -f /var/run/samba/smbd.pid ] || /etc/init.d/smbd reload > /dev/null endscript compress delaycompress notifempty }
オプション 意味 weekly
missingok
rotate 7
postrotate
endscript
compress
delaycompress
notifyempty
発展演習
-
“テンプレートとフィルター条件” 節では、フィルター条件として 式ベースのフィルター を説明しました。
rsyslogd
では プロパティベースのフィルター を使うこともできます。表中の 式ベースのフィルター を、プロパティベースのフィルター に変換してください。式ベースのフィルター プロパティベースのフィルター if $FROMHOST-IP=='192.168.1.4' then ?RemoteLogs
-
omusrmsg
はrsyslog
の 組み込み モジュールで、ユーザーがログイン中の端末にログメッセージを送信します。すべてのファシリティの emergency メッセージを、root
と一般ユーザーcarol
に送信するルールはどうなりますか?
まとめ
このレッスンでは、以下の事柄を学びました:
-
ロギングはシステム管理にとって非常に重要です。
-
rsyslogd
は、ログを整理整頓するためのユーティリティです。 -
サービスによっては、(
rsyslog
を使わずに)独自のログ管理を行うものがあります。(Apache HTTPD Web Serverなど) -
大まかに言えば、ログは、システムログとサービス(アプリケーション)ログに分類できます。
-
ログの読み取りに便利なユーティリティがあります:
less
、more
、zless
、zmore
、grep
、head
、tail
。 -
ログファイルのほとんどはプレーンテキストファイルですが、少数ながらバイナリログも存在します。
-
rsyslogd
は、特別なファイル(ソケットやメモリバッファ)から、ログを取り出して処理します。 -
rsyslogd
は、/etc/rsyslog.conf
または/etc/rsyslog.d/*
のルールを使ってログを分類します。 -
ユーザーは、
logger
ユーティリティでログに独自のメッセージを書き込めます。 -
rsyslog
を使用すると、ローカルネットワーク全体のすべてのログを集中ログサーバーに保持できます。 -
ログファイル名を動的に指定するには、テンプレート機能を使用します。
-
ログローテーションの目的は2つ: 古いログファイルが必要以上にディスク容量を使用することを防ぐことと、操作しやすいようにログを扱いやすい長さに保つことです。
演習の解答
-
以下のシナリオで使うコマンドは何ですか?
やりたいこと コマンド /var/log/syslog.7.gz
を読むzmore
またはzless
/var/log/syslog
を読むmore
またはless
/var/log/syslog
から、単語renewal
をフィルタするgrep
/var/log/faillog
を読むfaillog -a
/var/log/syslog
を実時間で読むtail -f
-
適切なログメッセージになるように、以下の要素を並び替えてください。
-
debian-server
-
sshd
-
[515]:
-
Sep 13 21:47:56
-
Server listening on 0.0.0.0 port 22
正しい順序は次のとおりです。
Sep 13 21:47:56 debian-server sshd[515]: Server listening on 0.0.0.0 port 22
-
-
それぞれの処理を実現するために、
/etc/rsyslog.conf
に指定するルールはどうなりますか?-
ファシリティが
mail
で、プライオリティがcrit
以上のメッセージを、/var/log/mail.crit
に送る。mail.crit /var/log/mail.crit
-
ファシリティが
mail
で、プライオリティがalert
とemergency
のメッセージを、/var/log/mail.urgent
に送る。mail.alert /var/log/mail.urgent
-
ファシリティが
cron
およびntp
のものを除き、プライオリティに関係なく、すべてのメッセージを/var/log/allmessages
に送る。*.*;cron.none;ntp.none /var/log/allmessages
-
必要なすべての設定が行われているものとして、TCPのデフォルトポートを使用して、ファシリティが
mail
であるすべてのメッセージを、IPアドレス192.168.1.88
のリモートホストに送信する。mail.* @@192.168.1.88:514
-
ファシリティに関係なく、プライオリティが
warning
であるメッセージを、/var/log/warnings
に、ディスクへの書き込み回数を抑えながら書き込む。*.=warning -/var/log/warnings
-
-
以下に示す
/etc/logrotate.d/samba
の一節をみて、それぞれのオプションを説明してください。carol@debian:~$ sudo head -n 11 /etc/logrotate.d/samba /var/log/samba/log.smbd { weekly missingok rotate 7 postrotate [ ! -f /var/run/samba/smbd.pid ] || /etc/init.d/smbd reload > /dev/null endscript compress delaycompress notifempty }
オプション 意味 weekly
ログファイルを毎週ローテーションする。
missingok
ログファイルが存在していない場合でもエラーとせず、処理を続行する。
rotate 7
7週間分の古いログを保持する。
postrotate
ログをローテーションした後に、次の行からのスクリプトを実行する。
endscript
postrotate スクリプトの終わりを示す。
compress
gzip
でログを圧縮する。delaycompress
compress
と組み合わせて、圧縮を次のローテーションサイクルに延期する。notifyempty
ログが空の場合は、ローテーションを行わない。
発展演習の解答
-
“テンプレートとフィルター条件” 節では、フィルター条件として 式ベースのフィルター を説明しました。
rsyslogd
では プロパティベースのフィルター を使うこともできます。表中の 式ベースのフィルター を、プロパティベースのフィルター に変換してください。式ベースのフィルター プロパティベースのフィルター if $FROMHOST-IP=='192.168.1.4' then ?RemoteLogs
:fromhost-ip, isequal, "192.168.1.4" ?RemoteLogs
-
omusrmsg
は、ユーザー端末にログメッセージを送信する、rsyslog
の 組み込み モジュールです。すべてのファシリティの emergency メッセージを、root
と一般ユーザーcarol
に送信するルールはどうなりますか?*.emerg :omusrmsg:root,carol