システムログファイルの分析作業は、システムを分析する際に最も重要な作業です。事実、システムのメンテナンスやトラブルシューティングを行う場合、一般的には何よりも先にシステムログファイルを確認します。 openSUSE Leap では、システム内で発生した事象をほぼ全て詳細に記録します。また systemd
への移行により、カーネルメッセージとシステムサービスが発するメッセージは、 systemd
内に保管されるようになっています (詳しくは 第11章 「journalctl
: systemd
ジャーナルへの問い合わせコマンド」 をお読みください) 。その他のログファイル (主にシステムアプリケーションが記録するもの) については、従来通り純粋なテキスト形式で記録され、エディタやページャなどを利用すれば簡単に読むことができます。このほか、スクリプトを利用してそれらを処理することもできますので、これにより特定の内容だけを抜き出すこともできます。
/var/log/
内にあるシステムログファイル #Edit sourceシステム関係のログファイルは、必ず /var/log
ディレクトリ内に存在しています。下記の一覧には、 openSUSE Leap 既定のインストール後の環境に現れる、全てのシステムログファイルを示しています。もちろん追加のソフトウエアをインストールすることで、 /var/log
には下記に示していない様々なログファイルが作成されます。また、ファイルやディレクトリによっては 「プレースホルダ」 として用意されるだけで、実際に対応するアプリケーションをインストールしないと、使用されないものもあります。さらに、ほとんどのログファイルは root
でないと読むことができません。
apparmor/
AppArmor のログファイルが配置されます。 AppArmor に関する詳細は、 パートIV「AppArmor による権限の制限」 をお読みください。
audit/
監査フレームワークのログファイルが配置されます。詳しくは パートVI「Linux 監査フレームワーク」 をお読みください。
ConsoleKit/
ConsoleKit
デーモン (どのユーザがログインしてどのような作業を行ったのかを追跡するデーモン) のログファイルが配置されます。
cups/
汎用 Unix 印刷システム (Common Unix Printing System ( cups
)) のアクセスログファイルとエラーログファイルが配置されます。
firewall
ファイアウオール機能のログファイルが配置されます。
gdm/
GNOME ディスプレイマネージャのログファイルが配置されます。
krb5/
Kerberos ネットワーク認証システムのログファイルが配置されます。
lastlog
各ユーザの最終ログイン日時に関する情報を保持するデータベースです。 lastlog
コマンドを使用すると、内容を読むことができます。詳しくは man 8 lastlog
をお読みください。
localmessages
いくつかの起動スクリプトのログメッセージが含まれています。たとえば DHCP クライアントのログなどがあります。
mail*
メールサーバ ( postfix
, sendmail
など) のログファイルが配置されます。
messages
全てのカーネルメッセージやシステムのログメッセージが記録されるファイルで、何らかの問題が発生した場合は、 /var/log/warn
ファイルとともに、最初に確認しておくべきファイルでもあります。
NetworkManager
NetworkManager のログファイルです。
news/
ニュースサーバからのログファイルが配置されるディレクトリです。
chrony/
Network Time Protocol デーモン (chrony
) のログファイルが配置されるディレクトリです。
pk_backend_zypp*
PackageKit (with libzypp
バックエンド) のログファイルです。
samba/
Windows SMB/CIFS ファイルサーバである Samba のログファイルが配置されるディレクトリです。
warn
全てのシステム内の警告およびエラーが記録されるファイルです。何らかの問題が発生した場合は、 systemd
ジャーナルの出力とともに、最初に確認しておくべきファイルでもあります。
wtmp
全てのログイン/ログアウト処理 とリモート接続のデータベースです。 last
コマンドを使用すると、内容を読むことができます。詳しくは man 1 last
をお読みください。
Xorg.数字.log
X.Org の起動時のログファイルです。 X.Org の起動に何らかの問題が発生した場合は、このファイルを参照してください。
なお、ファイル名の 数字 の箇所には、ディスプレイ番号が入ります。たとえば Xorg.0.log
であれば既定のディスプレイ番号である 0
のログファイルになりますし、 Xorg.1.log
であればディスプレイ番号 1
のログファイルになります。また、古い X.Org のログファイルは Xorg.数字.log.old
の形式で保存されます。
なお、 X.Org を root
で起動した場合にのみ、 /var/log/
ディレクトリ内にログが記録されることに注意してください。その他の (一般) ユーザで X.Org を起動した場合は、 ~/.local/share/xorg/
ディレクトリ内にログが保存されます。
YaST2/
全ての YaST ログファイルが含まれるディレクトリです。
zypp/
libzypp
のログファイルが含まれるディレクトリです。パッケージのインストール履歴を読みたい場合は、これらのファイルを参照してください。
zypper.log
コマンドラインインストーラである zypper
のログファイルです。
ログファイルを表示したい場合は、任意のテキストエディタをお使いいただくことができます。それ以外にも、 YaST コントロールセンターから
› と選択していくことで、ログを閲覧するためのシンプルな YaST モジュールを起動することもできます。テキストコンソールでログファイルを閲覧したい場合は、 less
や more
のコマンドを使用します。それ以外にも、 head
や tail
コマンドを使用することで、ログの冒頭や末尾だけを表示することもできます。ログファイルに追記される内容をリアルタイムに読みたい場合は、 tail
-f
コマンドをお使いください。これらのツールの使用方法について、詳しくはそれぞれのマニュアルページをお読みください。
特定の文字列や正規表現を指定してログ内を検索したい場合は、 grep
ツールをお使いください。また、 awk
を使用することで、ログファイルの処理や書き換えなどを行うこともできます。
logrotate
によるログの管理 #Edit source/var/log
以下にあるログファイルは日々増えていくもので、容易に巨大化してしまいます。 logrotate
はそのようなログファイルを管理することができるツールです。ログファイルを自動的にローテーション (新しいログファイルへの切り替え) したり、削除や圧縮、メール送信などを行ったりすることができます。ログファイルは定期的 (毎日, 毎週, 毎月など) に処理することができるほか、特定のサイズに達した際に実行することもできます。
logrotate
は systemd
によって毎日起動されるようになっているため、ログファイルに対する処理は毎日 1 回実行されます。しかしながら、一定のサイズを超過した場合に発動するように設定している場合や、 --force
オプションを指定したりしたような場合は、それ以上に実行することもできます。それぞれのファイルをどのタイミングで直近にローテーションしたいのかを確認するには、 /var/lib/misc/logrotate.status
ファイルをご覧ください。
logrotate
におけるメインとなる設定ファイルは、 /etc/logrotate.conf
です。システムパッケージやシステムプログラムによっては、独自のログファイルを生成するものがあります (たとえば apache2
) が、その場合はそれらのログファイルに対応する設定を /etc/logrotate.d/
ディレクトリ内に配置します。 /etc/logrotate.d/
内の設定は、 /etc/logrotate.conf
から取り込むように設定します。
/etc/logrotate.conf
の例 ## 詳しくは "man logrotate" で表示されるマニュアルページをお読みください # 毎週ログファイルをローテーションする指定 weekly # 4 週分までを保管する設定 rotate 4 # 古いログファイルをローテーションした場合、新しい (空の) ログファイルを作成する指定 # ローテーションしたファイルに対して、ファイル名の末尾に日付を付与する指定 dateext # ログファイルを圧縮したい場合は、下記の行のコメント文字を削除してください # gzip など、他の圧縮形式を使用したい場合は、下記 2 行をコメントアウトしてください compresscmd /usr/bin/bzip2 uncompresscmd /usr/bin/bunzip2 # RPM パッケージによっては、下記のディレクトリ内に設定ファイルを配置するものがあります include /etc/logrotate.d
create
オプションを使用する場合は、 /etc/permissions*
で指定することのできるファイルのモードと所有者に注意する必要があります。これらの設定を変更している場合は、矛盾が起こらないように設定してください。
logwatch
によるログの監視 #Edit sourcelogwatch
はカスタマイズ可能でプラグインにも対応した、ログ監視スクリプトです。システムログを分析して重要な情報を抽出し、必要であれば人間にとってよりやすい形式で報告します。 logwatch
コマンドを使用するには、 logwatch パッケージをインストールしてください。
logwatch
はコマンドラインで直接実行することで、その場でレポートを生成することができるほか、 cron
等を利用することで、定期的に独自のレポートを生成することもできます。レポートは画面に表示することができるほか、ファイルに保存したり特定のアドレスにメールを送信したりすることもできます。特にメール送信については、 cron
などでレポートを自動生成しているような場合に便利な仕組みです。
コマンドラインを使用することで、 logwatch
がレポートを生成すべきサービスの種類や時間範囲のほか、情報の細かさを指定することもできます:
# 昨日からの全てのカーネルメッセージを含む詳細レポートの生成 logwatch --service kernel --detail High --range Yesterday --print # アーカイブされたものを含め、全ての sshd のイベントを含む詳細レポートを生成 logwatch --service sshd --detail Low --range All --archives --print # 2005 年 5 月 5 日から 5 月 7 日までの全ての smartd のメッセージのレポートを、 # root@localhost 宛にメールで送信 logwatch --service smartd --range 'between 5/5/2005 and 5/7/2005' \ --mailto root@localhost --print
--range
オプションは複雑な書式になっています。詳しくは logwatch
--range help
で表示されるヘルプをお読みください。また、問い合わせに使用できる全てのサービスを一覧で表示するには、下記のように入力して実行してください:
>
ls /usr/share/logwatch/default.conf/services/ | sed 's/\.conf//g'
logwatch
は非常に詳しくカスタマイズすることができます。しかしながら、通常は既定値の設定のままで十分です。既定の設定ファイルは /usr/share/logwatch/default.conf/
以下に書かれています。ただし、このディレクトリ内に存在するファイルは、パッケージの更新の際に上書きされてしまう設定になっていますので、変更は行わないでください。カスタマイズを行いたい場合は、 /etc/logwatch/conf/
内に設定を書き込んでください (既定で配置される設定ファイルを雛形としてお使いください) 。 logwatch
のカスタマイズ方法について、詳しくは /usr/share/doc/packages/logwatch/HOWTO-Customize-LogWatch
(英語のみ) をお読みください。具体的には、下記の設定ファイルが存在しています:
logwatch.conf
メインの設定ファイルです。既定で配置されるファイルには、様々なコメント (英語のみ) が記載されています。また、それぞれの設定オプションは、コマンドラインを指定することで上書きすることができます。
ignore.conf
logwatch
で全体的に無視すべき行のフィルタを記述します。
services/*.conf
レポートを作成することのできる各サービスに対して、個別の設定ファイルを保存しておくディレクトリです。
logfiles/*.conf
各サービスでどのログファイルを処理すべきかを示しているファイルです。
root
宛のメールに対する転送設定 #Edit sourceシステムデーモンや cron
ジョブ、 systemd
タイマーなどのアプリケーションは、システム内の root
に対してメールを送信することがあります。また、既定ではそれぞれのユーザに対してローカルのメールボックスが作成され、ログイン時にメールの到着を知らせます。
これらのアプリケーションが送信するメッセージには、システム管理者が即時に対応しなければならないセキュリティレポートやインシデント報告などが含まれる場合があります。このような緊急性の高いメールに素早く気付くことができるよう、これらのメールを各担当者のメールアドレスに転送しておくことを強くお勧めします。
root
ユーザに対するメール転送の設定 #root
ユーザに対するメール転送を設定するには、下記の手順を行います:
まずは yast2-mail パッケージをインストールします:
#
zypper in yast2-mail
対話的な YaST メール設定モジュールを起動します:
#
yast mail
では を選択して、 を押します。
に、メールサーバのアドレスを入力します。必要であれば も設定してください。また、ネットワークを介して機密情報が送信されてしまわないよう、 を にしておくことを強くお勧めします。あとは を押します。
最後に
に転送先のメールアドレスを入力して を押します。これで設定は完了です。通常は なりません 。選択してしまうと、メールを受信して中継するように動作してしまうためです。
を選択してはあとはメールの転送設定が正しく動作していることを確認します:
>
mail root
subject: test test .
メールの転送が完了したかどうかは mailq
コマンドで確認することができます。転送の設定に問題がなければ、 のように出力されるはずです。あとは転送先のメールアカウントにアクセスして、メールが正しく届いていることを確認しておいてください。
なお、管理対象のマシン数とシステムイベントの通知先となる担当者数によって、様々な配信形態が考えられます:
様々なシステムから配信されるメールメッセージを、 1 人の担当者のみがアクセスするメールアカウントに転送する。
別名やメーリングリストの機能を利用して、様々なシステムから配信されるメールメッセージを担当者全員に転送する。
各システムに対して別々のメールアカウントを準備する。
ただし、それぞれの担当者が定期的にメールをチェックしていることが何よりも重要です。このような取り組みを促して重要なイベントを見落とさないようにするため、不必要な情報は送信しないように設定しておくことも重要です。また、アプリケーション側の設定で、関連する情報のみを送信するようにもしておいてください。
システムログに記録されるメッセージを、個別のシステムからネットワーク内の中央に位置するサーバに転送するように設定することができます。これにより、全てのホストが出力したログメッセージを一括で閲覧および管理できるようになるほか、不正攻撃によって特定のホストが乗っ取られてしまったような場合でも、ログを削除して足跡を隠蔽するようなことができなくなります。
中央の syslog サーバにログを集約する設定を行う場合、中央の syslog サーバの設定を行ったあと、各システム (クライアント) の設定を行うことになります。
rsyslog
サーバの設定 #中央に配置する syslog サーバを設定するには、下記の手順を実施します:
設定ファイル /etc/rsyslog.d/remote.conf
をエディタなどで開きます。
設定ファイル内にある UDP Syslog Server
もしくは TCP Syslog Server
のセクションを探すと、下記のような行があるはずです。これらの行のコメント文字 (#) を外します。また、 rsyslogd
に割り当てる IP アドレスとポートをそれぞれ設定します。
TCP の場合の例:
$ModLoad imtcp.so $UDPServerAddress IP1 $InputTCPServerRun ポート2
UDP の場合の例:
| |
|
従来型の syslog では、 UDP プロトコルを利用してネットワーク内にメッセージを転送していました。これにより負荷を減らす効果があるものの、その分だけ信頼性が失われることになります。つまり、高負荷な環境ではログメッセージが記録されない場合があり得ることになります。
そのため、 UDP プロトコルではなく、信頼性の高い TCP プロトコルの使用をお勧めします。
UDPServerAddress
についてTCP の例でも $UDPServerAddress
という設定パラメータを指定していますが、こちらは間違いではありません。名称とは異なり、 TCP と UDP の両方に効果があります。
ファイルを保存してエディタを終了します。
rsyslog
サービスを再起動します:
>
sudo
systemctl restart rsyslog.service
ファイアウオールで対象のポートを開きます。 firewalld
を TCP ポート 514 で動作させる場合は、下記のように入力して実行します:
>
sudo
firewall-cmd --add-port 514/tcp --permanent
>
sudo
firewall-cmd --reload
これで中央側の syslog サーバの設定は完了です。あとはログを送信する側、つまり個別のシステム側の設定を行います。
中央の syslog サーバにログを送信するようマシンを設定したい場合は、下記の手順を実施します:
設定ファイル /etc/rsyslog.d/remote.conf
をエディタなどで開きます。
設定ファイル内に下記のような行 (TCP または UDP) がありますので、これらの行のコメント文字 (#) を外したあと、 remote-host
の箇所を 3.6.1項 「中央の syslog サーバの設定」 で設定した中央の syslog サーバのアドレスに置き換えます。
TCP の場合の例:
# Remote Logging using TCP for reliable delivery # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional *.* @@remote-host
UDP の場合の例:
# Remote Logging using UDP # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional *.* @remote-host
ファイルを保存してエディタを終了します。
rsyslog
サービスを再起動します:
>
sudo
systemctl restart rsyslog.service
あとは syslog のメッセージが正しく転送できていることを確認します:
>
logger "hello world"
上記を実行すると、中央の syslog サーバに hello world
というメッセージが記録されているはずです。
中央の syslog サーバに送信するマシンがほかにもあれば、上記の手順をそれぞれで実施してください。これにより、中央の syslog サーバに情報を集約できるようになります。
ここで説明した基本的な手順は暗号化を設定していないため、信頼のできる内部ネットワーク内でのみ適用可能な手順になっています。信頼のできないネットワークを経由する場合は TLS による暗号化が必須となりますが、これには証明書のインフラを構築する必要があります。
また、ここまでの説明では、遠隔からの全てのメッセージは全て同じに扱われる設定になります。ログの送信元が増えれば増えるほどメッセージも増えていくことになりますので、送信元ごとに別々のファイルに記録したり、メッセージの分類を行ったりなどの作業も必要となることでしょう。
暗号化やフィルタリング、もしくはその他の高度な設定について、詳しくは https://www.rsyslog.com/doc/master/index.html#manual (英語) にある RSyslog のドキュメンテーションをお読みください。
logger
コマンドによるシステムログへの記録 #Edit sourcelogger
はシステムログ内に指定した内容を出力するためのツールです。特にシェルスクリプトなどから、 rsyslogd のシステムログモジュールにメッセージを書き込みたい場合に使用します。たとえば下記のように入力して実行すると、メッセージが /var/log/messages
もしくは systemd
のジャーナル (ログ記録用のサービスを何も動作させていなければ) に書き込まれます:
>
logger -t Test "This message comes from $USER"
ログインしているユーザとホスト名によって異なりますが、ログには下記のような内容が書き込まれます:
Sep 28 13:09:31 venus Test: This message comes from tux