「ログの見かた」~初心者でもよくわかる!VPSによるWebサーバー運用講座(1)

さくらのVPSを使った、初心者向けの記事「VPSによるWebサーバー構築講座」を半年前に公開しました。さくらのVPSを使ってWebサーバーを構築し、WordPressをインストールするまでの手順を解説しました。

しかし、サーバーは構築が完了したらそこで終わりではなく、稼働し続けている間はメンテナンスをしていかなければいけないし、安全に運用するにはセキュリティにも気をつかわなければなりません。
そこで、VPS構築講座の続編として「運用編」をお届けします。いったんWebサーバーとして稼働しはじめたサーバーについて、継続してサービスを続けていけるように運用のノウハウをお届けします。
運用編の連載は5回に分けて行う予定ですが、まず初回は「ログファイルの見かた」について触れたいと思います。
ログファイルについて大きく2種類のログをご紹介します。

  1. WebサーバーApacheのログの見かた
  2. ssh関連のログの見かた

サーバーでWordPressが稼働中。でも本当に動いているの?稼働状況はどうやったら知ることができる?

サーバー上にWordPressをインストールして、順調に動いている間は良いのですが、トラブルが起こったらどう対処していいか分からない、という方は多いと思います。
ブラウザからサイトにアクセスしても、何も表示されずタイムアウトになったり、画面が真っ白になったり、何やら良く分からないエラーメッセージが表示されたり...
トラブルの種類はいろいろですが、何か起こったらまずは問題分析のためにログファイルを見てみましょう。
WebサーバーApacheのアクセスログファイルを見ると、サーバー上に置いているhtmlファイルやphpファイルなどのWebコンテンツを構成するファイルが実際にアクセスされているかどうかを調べることができます。

ブラウザでWebサイトにアクセスすると、サーバー上で稼働しているApacheがHTMLコンテンツをブラウザに返しますが、それと同時にアクセス記録を残します。
その記録が残されるファイルがログファイルです。この記録を調べることで、「本当にサーバーにHTTPアクセスがあったかどうか」「リクエストに対して正常に応答できているか」などの情報が分かります。

ログファイルを実際に見てみましょう。
RLoginなどのsshクライアント(Macの場合はターミナル)でVPSにsshログインします。

$ su -
パスワード: (パスワードを入力する)
# cd  /var/log/httpd
# ls
access_log                           
error_log
access_log-20150719
error_log-20150719
access_log-20150726
error_log-20150726 

su でルートユーザーにスイッチしたあと、 /var/log/httpd ディレクトリに移動します。
ここでls コマンドを実行するとファイル一覧が表示されます。目的のログファイルはaccess_logです。
access_log-20150719 といった日付つきファイルは、過去のログファイルです。一週間単位でファイル名が切り替わり、日付つきファイル名が作られるしくみになっています。

tail -f コマンドで中を覗いてみましょう。

# tail -f access_log

プロンプトが表示されず入力待ちのような状態になります。sshクライアントをこのままにして、ブラウザでVPS上のコンテンツ
http://xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx はあなたのVPSのIPアドレス)
にアクセスしてみてください。
アクセスがあるとそれに応じて、sshクライアントにリアルタイムでログが記録されていくのが分かると思います。tail -f はログファイルに追加された内容があればリアルタイムに表示してくれる便利なコマンドです。
もしログが記録されていかなければ、tail コマンドで開いているファイルが間違っているか、ブラウザでアクセスしているURLが間違っているかだと思います。確認して下さい。

アクセスログにはhtmlphpファイルにアクセスされた記録のほかに、cssjpg画像など、コンテンツを構成するすべてのファイルについてログが記録されます。したがって、通常はブラウザからの1回のアクセスで複数行のログが記録されることになります。

ログで記録される情報について詳しく見てみましょう。

リクエスト元IPアドレス リクエストを送ったパソコンや携帯端末のIPアドレスが記録されます。
アクセスされた日時 サーバーがリクエストを受け取り、HTMLコンテンツを返した日時になります。
アクセスされたファイル サーバー上のどのファイルにアクセス要求があったかが分かります。
ステータスコード 200の場合は「正常」です。
これが404だったらNotFound、つまりファイルが見つからなかったというエラーになるし、500だったらInternalServerErrorになります。
他にもいろいろな値があります。こちらに詳しく書かれています。
HTTPステータスコード - Wikipedia
UserAgent アクセスしてきたデバイスの情報が分かります。OSやブラウザの種類、バージョンなどが書かれています。

何かトラブルがあったとき、アクセスログファイルをチェックすると分かることがあるかも知れません。
例えば、
ブラウザからWebサーバーへHTTPアクセスしているはずなのに、access_logに記録が残らない。
ということであれば、
「リクエストがサーバーに届いていない。ネットワークに問題があるか、DNSの設定が間違っているのかも? Apacheは起動してる?」
という推測ができますし、
ブラウザからアクセスしても画面が正しく表示されない。
ということであれば、
「アクセスログのステータスコードが4xx系や5xx系などエラーを示す値になっていないか?」
をチェックして、詳細なエラー原因を特定することができます。また、リクエストしたURL中のファイル名と、アクセスログ中の「アクセスされたファイル」の欄のファイル名を比較して、アクセスされたパスが正しくApacheに解釈されているかどうか確認することができます。

トラブル時以外にも、ログファイルを見ることは役に立ちます。
先ほど触れたように、ログファイルは一週間たつと日付つきのファイルに退避されますが、作られた過去のアクセスファイルのサイズを比較して、例えばあるときから極端にファイルサイズが大きくなっている場合は、急にアクセス数が増えたと推測することができます。単にサイトの人気が出てアクセスが増えただけならば良いのですが、心当たりの無い大量のリクエストが来ている場合は、悪意ある者からのDoS攻撃を受けているかも知れません。
また、ログファイルの中を調べてみたときに特定IPアドレスからのリクエスト数が多いとか、特定ページへのリクエストが極端に多い場合も、何らかの攻撃を受けている可能性があります。
サーバーを運用していて「何か様子がおかしいな」と思ったらログを見る習慣をつけましょう。原因を特定する糸口になることがあります。

さらに、access_logファイルをパソコンにダウンロードして、パソコン上で解析できるソフトウェアもあります。
これらのソフトを使えば、「特定のページがどれくらい参照されているか」などの統計情報や、「特定のIPアドレスからどのページが参照されたか」などのトレース情報を得ることができます。
Apacheのアクセスログを解析するフリーソフト4種

怪しいユーザーがサーバーにログインしていないかどうかをチェックする

次に、sshに関連するログ情報を紹介します。
過去にサーバーにsshログインしてきたユーザーの履歴情報をを調べることができます。lastコマンドです。

$ last
vpsuser  pts/0        zz2012407308d2ed Fri Jul 31 11:12   still logged in
vpsuser  pts/1        180-146-31-167f1 Mon Jul 20 15:10 - 20:18  (05:08)
vpsuser  pts/1        180-146-31-167f1 Fri Jul 17 14:40 - 22:29  (07:48)
root     pts/0        180-146-31-167f1 Fri Jul 17 14:25 - 18:09  (03:44)
reboot   system boot  2.6.32-504.1.3.e Fri Jul 17 14:24 - 15:15 (14+00:51)

lastコマンドで、いつ誰がsshログインしたかを最近のログインから順に確認することができます。

ユーザーごとに、最近のログイン日時を調べるには、lastlogコマンドを使います。

$ lastlog
Username         Port     From             Latest
root             pts/0    180-146-31-167f1 Fri Jul 17 14:25:21 +0900 2015
bin                                        **Never logged in**
・・・
vpsuser          pts/0    zz2012407308d2ed Fri Jul 31 11:12:29 +0900 2015
apache                                     **Never logged in**

サーバーに登録されている各ユーザーについて、最も最近にログインした日時を確認できます。

心当たりが無いユーザーがログインしていないでしょうか? また、rootユーザーが直接sshログインすることを禁止する設定にしている場合、その設定をした日時からrootの直接ログインは無いはずです。しかし意に反してrootユーザがログインした形跡が残ってないでしょうか?

身に覚えのないアクセスがあった場合、すでにそのサーバーには悪意ある何者かが侵入し、バックドア(他の手段を使って侵入できる裏口)などをしかけてサーバーを乗っ取っているかも知れません。
このような場合には、乗っ取られた特定ユーザーのログインを禁止したり、ユーザーそのものを削除しても、ひきつづきバックドアを経由して侵入されてしまうので、サーバーを正常な状態に戻すことは不可能に近く、手遅れになっている可能性が高いです。
そうなってしまったときは残念ながら、攻撃されたサーバーを使い続けようとせずに新しい新規のサーバーを構築しなおした方が確実にサーバーをクリーンアップできます。

Webサーバー運用講座の第1回目は以上です。
第2回目はsshを公開鍵認証を使ってログインする方法を解説します。
「よく分かる公開鍵認証」~初心者でもよくわかる!VPSによるWebサーバー運用講座(2) - さくらのナレッジ

おしらせ