Linuxサーバ運用マニュアル

サービスの状態をチェックしよう!

定常運用において,サービスのチェックは重要です。普段は正常に稼動しているサービスは,何らかの障害で,突然停止するかもしれません。定期的にチェックを行なっていれば,障害の早期発見につながり,復旧までの時間も短縮できます。また,定期的なチェックにおいて,どの程度まで突っ込んでチェックするかというのもポイントです。詳しくチェックし過ぎると管理者の負担も大きいですし,逆に適当なチェックを行なうと障害を見落とす可能性があります。システム管理の専従者ならともかく,SOHOなどの環境では他の業務に影響が出ない程度に詳しくチェックすることが大切です。

定常時のサービスのチェック方法

具体的にチェックするものは,アプリケーションの動作,アプリケーションのログ,プロセスの状態,ログインサービスなどです。アプリケーションの動作チェックは,定常のチェックでは特にデバッグモードなどを使用するのではなく,たとえばWWWサーバのチェックならWWWブラウザでホームページを表示する,メールサーバのチェックなら日常のメールのやりとりがそのままチェックになるなど,クライアントとしてサービスを利用する形程度にします。

アプリケーションのログは,アプリケーション毎に決まったログに出力されるものと,syslogに出力されるものがあります。syslogに出力されるものは,grepを用いて必要な部分を抽出するのが有効です。

sendmailのログチェック(syslogに出力されるもの)
Linux> grep sendmail /var/log/syslog | tail

May 19 14:01:33 gauntlet sendmail[5836]: OAA05836: SYSERR(root): mailer prog died with signal 213
May 19 14:03:52 gauntlet sendmail[5853]: OAA05853: SYSERR(root): mailer prog died with signal 213
May 19 14:37:06 gauntlet sendmail[6322]: OAA06322: SYSERR(root): mailer prog died with signal 213
May 19 15:38:36 gauntlet sendmail[6948]: PAA06948: SYSERR(root): mailer prog died with signal 213
Apacheのログチェック(アプリケーション毎にログが出力されるもの)
Linux> tail /usr/local/var/apache/log/access.log

10.0.1.254 - - [21/Nov/1998:15:03:09 +0900] "GET /~joe/crack/navy_m1.txt HTTP/1.0" 200 2749
10.0.1.254 - - [21/Nov/1998:15:05:18 +0900] "GET /~joe/hack/hack.htm HTTP/1.0" 200 4201
10.0.1.254 - - [21/Nov/1998:15:06:06 +0900] "GET /~joe/hack/hack/index.htm HTTP/1.0" 200 18544
10.0.1.254 - - [21/Nov/1998:15:12:16 +0900] "GET /joe/travel/travel.htm HTTP/1.0" 404 280

プロセスの状態のチェックは,psとgrepを利用します。このとき重要なのは,正常に運用できている状態でどんなプロセスが動いているかを調べておくことです。比較対象がなくては,チェックになりません。

以下に,プロセス状態のチェックの例を紹介します。

プロセス状態のチェック(sendmail)
Linux> ps aux | grep sendmail

root      3283  0.0  1.0   932   316  p0 S   18:56   0:00 grep sendmail

以下に,サービス毎のチェック対象をまとめておきます。

使用しているアプリケーションはASHの場合の例なので,設定やバージョンにあわせてログの出力先などをチェックして下さい。また,inetd起動型のプロセスの場合はセッションが繋がっていない間はプロセスは起動していないので,psを入力してもプロセス名は表示されないので注意してください。

定常運用におけるサービス毎のチェック対象
サーバアプリケーションプロセス名ログの出力先(例)
メールサーバsendmailsendmail/var/log/syslog
/var/log/messagesなど
WWWサーバApachehttpd/usr/local/var/apache/log/access.log
プロキシサーバDeleGatedelegated/usr/local/etc/delegate/log/8080.httpなど
FTPサーバwu-ftpftpd/var/log/syslog
/var/log/messagesなど
ファイルサーバSambasmbd
nmbd
/usr/local/samba/var/log.smb
/usr/local/samba/var/log.nmb
ダイヤルアップサーバmgettymgetty/var/log/mgetty.ttyS0
COMポート番号によりttySnのn(数字)は決まる

ログをチェックする際のポイント

ログをチェックする際に,ただ漠然とログを眺めていっても効率はあまりよくありません。効率よくログをチェックするためには,アプリケーションから出力されるエラーメッセージをキーワードにしてgrepでログを抽出します。エラーメッセージはアプリケーション毎に違う形で出力されるので,キーワードはアプリケーション毎に変えていく必要があります。

以下に,ログ抽出方法の例を紹介します。grepに-iオプションをつけて実行すると,大文字小文字を区別せず検索するので,ヒット率が上がるので,活用しましょう。

ログ抽出の例(syslogから「sendmail」「err」と書かれた行を抽出)
Linux> grep -i sendmail /var/log/syslog | grep -i err | less

Dec  6 23:15:30 gauntlet sendmail[87]: NOQUEUE: SYSERR(root): getrequests: accept: No route to host
Dec 20 01:23:57 gauntlet sendmail[87]: NOQUEUE: SYSERR(root): getrequests: accept: Connection reset by peer
Jan 10 21:59:03 gauntlet sendmail[87]: NOQUEUE: SYSERR(root): getrequests: accept: No route to host
May 17 16:06:04 gauntlet sendmail[7694]: QAA07694: SYSERR(root): mailer prog died with signal 213

エラーメッセージが頻繁に出力されていた場合,サービスの不具合や不正アクセスの疑いがありますので、原因の調査をしましょう。全部チェックするのは大変ですが、エラーの数をチェックするだけでも、ある程度の効果はあります。

以下に,ログチェックの際のキーワードをまとめておきます。

ログチェックのキーワード
キーワード内容
warning
err
abort
エラー全般
定義ファイルのミスなど
timeout
timed out
ネットワークの通信異常
サーバの高負荷状態など
refused
reject
not permitted
denied
アクセス制御の設定ミス
何らかの不正アクセスなど
fail
incorrect
invalid
パラメータの設定ミス
不正なパスワード入力など
/phf
/php
/test-cgi
CGIの不正利用
null connection
eof received
ポートスキャン
authentication failed
repeated login failures
login incorrect
辞書アタック
passwdパスワードファイルへの不正アクセス

ポートスキャン,辞書アタックなどは,サーバへの不正アクセスの一種です。これらについては,今後詳しい説明をしていきます。

ログインサービスのチェック

ログイン履歴のチェック

/var/log/wtmpには,ユーザーのログイン履歴が特殊な形式で記録されています。このログイン履歴は,lastコマンドで参照することができます。lastコマンドは,標準出力にログを流しつづけるので,lessなどにパイプしてやるのがよいでしょう。また,lastlogは先頭が最新で,後ろのほうに行くにしたがって古いログとなっています。ログイン履歴を調査して,不審なユーザーがログインしていないかチェックしましょう。

ログイン履歴の確認
Linux> last | less

joe         ftp          pc22.lo.ash.or.j Mon May 31 02:59 - 03:00  (00:01)
joe         ttyp0        pc23.lo.ash.or.j Wed May 26 00:59 - 01:05  (00:06)
yanagi      ttyS0        115200           Tue May 25 06:02 - 06:09  (00:07)
hasimoto    ttyp0        pc22.lo.ash.or.j Tue May 21 22:48 - 23:19  (00:31)

また,ユーザー毎のログイン履歴を抽出して定期的にユーザーに送付し,ログイン履歴の確認をとりましょう。パスワードが盗難され,本人以外の誰かがログインしている可能性があります。lastコマンドの引数にユーザー名を渡してやると,ユーザー毎のログイン履歴を抽出できます。

ユーザー毎のログイン履歴の確認
Linux> last yanagi | less

yanagi    ttyS0        115200           Tue May 25 06:02 - 06:09  (00:07)
yanagi    ttyS0        115200           Sun May 16 21:02 - 21:16  (00:13)
yanagi    ttyS0        115200           Sun May 16 00:28 - 00:33  (00:05)
yanagi    ttyS0        115200           Fri May 14 05:56 - 06:02  (00:06)

また,wtmpファイルは基本的にハードディスクの容量がいっぱいになるまで,内容が追加されつづけるので,定期的にバックアップをとりログを切り替えましょう。

wtmpファイルのバックアップとクリア
Linux> mv /var/log/wtmp /var/log/wtmp.backup
Linux> cp /dev/null /var/log/wtmp

lastコマンドは,wtmpファイルのバックアップを直接参照することはできないので,以下のように切り替えて参照します。

wtmpファイルのバックアップの参照
Linux> mv /var/log/wtmp /var/log/wtmp.real
Linux> mv /var/log/wtmp.backup /var/log/wtmp
Linux> last | less

バックアップの参照が終わったら,wtmpファイルのオリジナルを
忘れずに元に戻しておく。

Linux> mv /var/log/wtmp /var/log/wtmp.backup
Linux> mv /var/log/wtmp.real /var/log/wtmp

mgettyのログ

mgettyのログには,ユーザー名の情報は記載されていませんが,ダイヤルアップを受けた時間,モデムの状態などが記録されています。lastlogと比較して,ダイヤルアップ時間とログイン時間に違いがないか確認します。もし,「ダイヤルアップされていないのにダイヤルアップユーザーがログインしていた」りすれば,不正アクセスやwtmpファイルの改ざんの可能性があります。

ダイヤルアップ受付履歴の確認
Linux> grep -i connect /var/log/mgetty.ttyS0 | less

05/25 04:38:58 yS0  waiting for ``CONNECT'' ** found **
05/25 06:01:44 yS0  waiting for ``CONNECT'' ** found **
05/25 06:32:50 yS0  waiting for ``CONNECT'' ** found **
05/26 03:05:02 yS0  waiting for ``CONNECT'' ** found **

モデムの状態をチェックします。mgettyのログからエラーメッセージを抽出し,モデムに異常がないかチェックします。モデムに異常があった場合には,モデムのケーブルが抜けていないか確認する,モデムをハードウェア的にリセットするなどの対処を行ないましょう。

モデムの状態の確認
Linux> grep -i warning /var/log/mgetty.ttyS0 | less

03/13 08:59:25 yS0  WARNING: DSR is off - modem turned off or bad cable?
03/13 09:00:11 yS0  WARNING: DSR is off - modem turned off or bad cable?
03/13 09:05:58 yS0  WARNING: DSR is off - modem turned off or bad cable?
03/13 09:06:43 yS0  WARNING: DSR is off - modem turned off or bad cable?

次回予告

これまでに、さまざまなチェック方法などを説明してきました。ただし、人力でやるには手間がかかりすぎ、ミスも発生します。そこでそれを自動化する方法を考えましょう。

と,いうわけで次回は「cronで自動化しよう!」です。

(ASHマルチメディア研究会/joe,高柳)