いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.068 / 読者数:857名

こんばんは、うすだです。

最近、酷使しているノートパソコンが、 サスペンドしてもすぐリジュームするようになってしまいました。

サスペンドして収納したはずが、勝手にリジュームするために、 取り出すともわーんと熱くなっていて、がっかり感が漂います。

ですので、長時間の移動の際には、いちいちシャットダウンしています。
もー、不便きわまりないです。

しかし、最初にサスペンドやハイバネーションを考えたひとって、 すごいですよね。今、その便利さを実感しています。

下痢で苦しいときに、かつての健康なじぶんが幸せだったことに気づく、 みたいな感じに似ています。
…というフレーズは、昔にも書いたように思いますが、実は、 ついさっき体験していました。なんだか、体もノートパソコンもぼろぼろです。

まあ気をとり直して、それでは今週も、はりきってまいりましょう!

今週のお題 - Apache のエラーログをメールする

インターネットにおけるたくさんのサービスの中でも、WWW は、 最も重要なものの範疇に含まれると言っても、まったく過言ではないと思います。

その WWW サーバが正しく機能していないと、ホームページが正常に見られなかったり、 ユーザが本来受けられるべきサービスを受けられなかったりといった、 たいへん困った状態に陥ってしまいます。

そんな状態を、あるいはその前兆を、 システム管理者はいち早く知るべきではないかと思います。
とはいえ、ただでさえ多忙なシステム管理者が、頻繁にエラーログを監視することは、 そうそうできるものではございません。

そんなときは、とりあえずメールで通知させることが、王道ではないかと思います。 ログの確認よりもメールのチェックのほうが、実行する頻度が高いですよね。

というわけで今週は、WWW のエラーログをメールでお知らせする方法を、 ご紹介したいと思います。


Linux で WWW と言えば Apache しかないよね、と勝手に断言して、 今週のお題を進めさせていただきます。

さて、Apache では、アクセスログもエラーログも、 プログラムに渡して処理することが可能です。
ですので、スクリプトを書いて、そいつに処理させれば、目的が達せられそうです。

今回作成するスクリプトのパスは、 /usr/local/sbin/errorlogmail.pl としましょう。
すると、httpd.conf の ErrorLog は、以下のように設定します。

  ErrorLog "| /usr/local/sbin/errorlogmail.pl"

これで、エラーログが、errorlogmail.pl の標準入力に渡されます。

次に、肝心の errorlogmail.pl の内容です。
とりあえず、以下のようにしてみました。

  #!/usr/bin/perl
  use strict;

  my $addr = $ARGV[0] ? shift:"root";
  while(1) {
      my $r = sysread(STDIN, my $m, 4096);
      if($m) {
          if(open(MAIL, "|/usr/bin/Mail -s \'[httpd] Error\' $addr")) {
              print MAIL $m;
              close MAIL;
          }
      }
      if($r <= 0) {
          last;
      }
  }

最初に、メールアドレス($addr)を決定します。引数があればそれを使いますが、 なければデフォルト値(root)を用います。

次が、無限ループです。
ここでは、 sysread(システムコールの read です)で標準入力からエラーログを読み込み、 何かが読めたら、Mail コマンドでメールを送信します。
sysread の戻り値($r)が 0 以下の場合は、EOF かエラーと判断して、 無限ループから抜けて終了します。

…という簡単なものです。

上記の errorlogmail.pl を作成し、実行権をつけて、httpd.conf を変更したら、 反映してみましょう。

  # /etc/init.d/httpd configtest
  # /etc/init.d/httpd reload

いきなり試すのが不安な貴兄は、 まずコマンドラインで試してみてもよいかもしれません。

  # echo test | /usr/local/sbin/errorlogmail.pl

いずれにしましても、root 宛にメールが届いたら、おそらく成功です。

宛先を root 以外に指定したければ、errorlogmail.pl の引数に、 メールアドレスを指定してください。

  ErrorLog "| /usr/local/sbin/errorlogmail.pl usu@usupi.org"

こうすると、root ではなく、usu@usupi.org に送られます。


これでめでたしめでたし…と言いたいところですが、 ログファイルに記録されなくなってしまいました。
それでは困りますので、errorlogmail.pl に細工してみましょう。

  #!/usr/bin/perl
  use strict;

  $|=1;  # 追加
  my $addr = $ARGV[0] ? shift:"root";
  while(1) {
      my $r = sysread(STDIN, my $m, 4096);
      if($m) {
          print $m; # 追加
          if(open(MAIL, "|/usr/bin/Mail -s \'[httpd] Error\' $addr")) {
              print MAIL $m;
              close MAIL;
          }
      }
      if($r <= 0) {
          last;
      }
  }

コメントに『追加』とある部分が、追加したところです。
ようは、エラーログを標準出力に出力しているだけです。

変更したら、ErrorLog を、以下のように設定しましょう。

  ErrorLog "| /usr/local/sbin/errorlogmail.pl >> /var/log/httpd/error_log"

ログファイル(/var/log/httpd/error_log)に書き込むため、 リダイレクトを追加します。 (追加書き込みなので >> としてます。> はまずいです。)
ログファイルのパスは、ご使用の環境にあわせてご指定ください。


今度こそ、めでたしめでたし…と言いたいところですが、 普段からエラーログにたくさん出力されている環境では、このままですと、 メールが大量に送られてきてしまいます。

その中でも多いのが、こういうやつではないかと思います。

  File does not exist: /home/httpd/html/robots.txt

ここでは、File does not exist 云々というエラーログを、 ログファイルだけに記録して、メールでは通知しないようにしてみましょう。
そのためには、errorlogmail.pl を、以下のように変更します。

  #!/usr/bin/perl
  use strict;

  $|=1;
  my $addr = $ARGV[0] ? shift:"root";
  while(1) {
      my $r = sysread(STDIN, my $m, 4096);
      if($m) {
          print $m;
          next if $m =~ /File does not exist:/; # 追加
          if(open(MAIL, "|/usr/bin/Mail -s \'[httpd] Error\' $addr")) {
              print MAIL $m;
              close MAIL;
          }
      }
      if($r <= 0) {
          last;
      }
  }

コメントに『追加』とある部分が、今回追加したところです。
読み込んだ文字列に、"File does not exist:" が含まれていれば、 メールしないようにしています。それだけです。


以上、Apache のエラーログをメールする方法を、ご紹介しました。

Apache の再設定(reload)や再起動(restart)などの際にも、 メールが送信されますので、けっこう便利なんじゃないかと思います。

とはいえ、このままでは、1行メールがたくさん送られてきちゃいます。
このあたりは、今週の宿題で、なんとかしてみたいと思います。

宿題の答え

先週の宿題は、

  tcp_wrapper を使って、不正なポートのアクセスを検出しましょう。

でした。

ここでは、telnet に対する不正アクセスの検出を、行ってみます。
(つまり、ここでは、telnet は使っていません。)

xinetd の場合は、以下の内容の /etc/xinetd.d/telnet を用意します。

  # default: off
  # description: telnet server
  service telnet
  {
      disable = yes
      flags = REUSE
      socket_type = stream
      wait = no
      user = root
      server = /bin/cat
  }

ミソは、server に /bin/cat を指定しているところ…でしょうか。
そして、telnet を有効にします。

  # chkconfig telnet on

inetd の場合は、/etc/inetd.conf に以下を追加(あるいは変更)します。

  telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  /bin/cat

そして、inetd に知らせます。

  # kill -HUP `cat /var/run/inetd.pid`

それから、いずれの場合も、/etc/hosts.deny に、以下を追加します。

  cat: ALL

これで、telnet へのアクセスがあると、syslog に記録されるようになります。 (/var/log/messages や /var/log/secure などをご覧ください。)

他のサービスに対しても同じ設定を追加する際には、 同様に /bin/cat を指定すれば、hosts.deny を変更する必要がなくなります。

今週の宿題

今週の宿題は、

  Apache のエラーログをメールする際に、ある程度集約させて、メール
  の数を減らしてください。

です。

今週のお題の延長です。
たとえば、reload すると、環境にもよりますが、わたしの環境では、

  Apache/2.2.0 (Fedora) configured -- resuming normal operations
  Digest: generating secret for digest authentication ...
  Digest: done

というエラーログが、1行につき1通、つまり3通のメールで通知されます。
おそらく1〜2秒の間に上記が出力されると思いますので、数秒の間なら、 その間待って、1通でまとめて通知してくれー!! と思います。

…というのを、実は、本題でやるつもりだったのですが、 Perl の select がソケットにしか機能しないため、うまくいきませんでした。

とりあえず、本題はメールいっぱい版で逃げましたが、ちょっとうるさいですよね。 というわけで、来週までになんとかがんばります。
(でも Perl でだめだったら、C で逃げたいと思います。(ごめんなさい))

あとがき

わたしの場合、本業がプログラマーで、システム管理は3の次くらいなのですが、 それでも、イライラすることがあります。というか今もイライラしています。 イライライライラ…。

この間、通販の冊子に、イライラしたときの対処法が載っていました。
さらっとご紹介します。(オルビスの「La」2006年夏の臨時増刊号より)

  • 深呼吸してみる
  • 100点満点を目指さない
  • その場を離れてみる
  • 新聞をびりびり破く
  • とにかく体を動かす
  • ビタミンB・C、カルシウムを摂る
  • リラックスタイムをもつ
  • 開き直ってみる

これでイライラ解消できれば苦労はしねーよと、 夫婦で突っ込みを入れてしまいましたが、少なくともすぐ試せるものは、 試してみてもいいんじゃないか、という気もしました。

というわけで、まずは深呼吸からはじめてみようと思います。
みなさんも、イライラしたときに、お試しください。
また、これが効くよ、という呪文みたいな対処法をご存知でしたら、 是非ご教示ください。

 

今週も、ここまで読んでいただき、ありがとうございました。
それでは、来々週に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−栗日記ぎゃらりー、近くをお越しの際は是非!!
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://www.fumido.co.jp/kuriniki/ (栗日記ぎゃらりー)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本