システムマネジメントツール(Monit)の導入



魔がさしたとでも言うのでしょうか? 今思えば、あわただしい中で何でそんなことしたのか非常に疑問ではありますが、出勤前にオペミスからApacheを落としてしまい、偶然家族も出払っていて対処できず昼間の半日間サイトがアクセス不能になるというトラブルを起こしてしまいました。別サイトを運営している娘にえらく怒られてしまいました。
今回は人為的なミスですが、何らかの理由でプロセスが異常になってしまう可能性もあるため、対策が必要と思い検討しました。
最初は、遠隔から制御する方法を考えたのですが、外部(どことは敢えて言いませんが)からアクセスできるポート(サービス)はセイキュリティ上かなり規制されているので、ガードを固めてWebからtelnet.cgiを動かすぐらいしかできません。しかし、今回のようなケースではWebそのものが駄目なのでこの方法は使用できません。行き詰ってしまいいろいろググッテいたところ、monitというシステムマネージメントツールがあることがわかり、これを導入することとしました。SuSE9.3にはRPMも用意されているため、簡単にインストールできます。

■Monitとは?

Monitは、UNIXシステムの上のプロセスやファイル、ディレクトリ、デバイスをモニタ・管理するユーティリティであり、プロセスが応答しない場合に再起動したり、リソースを食いすぎていたら停止したりできます。また、Webインタフェースを持っており、ブラウザからプロセスのモニタや制御も可能になっています。
Mointはいろいろな機能を持っていますが、今回はとりあえずデーモンの異常を検知して再起動することと、それをメール通知することを目標にしました。その他の機能については必要に応じて対処することとします。

■Monitのインストール

改めて書くほどのこともないですが、YaSTでインストールするだけです。RPMからインストールすれば起動スクリプトやデフォルトの設定ファイル(/etc/monitrc)はインストールされるので、後は設定していくだけです。
  1. YaST コントロールセンタを起動し、「ソフトウェア」の「ソフトウェアのインストール/削除」を起動する。

  2. 「フィルタ」 を 「検索」 とし検索欄に 「monit」 と入力し 「検索」 ボタンを押す。

  3. 右側に該当するパッケージが出てくるので、チェックマークを入れて 「了解」 を押しておしまい。

■Monitの設定

Monitの設定は、 /etc/monitrc で行います。monitrcに簡単な説明が書いてあり、デーモン毎のサンプルの設定が /usr/share/doc/packages/monit/doc/examples.html にあるのでこれを参考にするとともに、詳細についてはmonit.htmlも参照して設定していきます。

◆共通的な設定

ここでは、Monitの共通的なパラメータとデーモン毎に設定もできるが未設定の場合にデフォルトとして使われるパラメータを設定する。

  1. set daemon

    set daemon 120

    Mointのポーリング間隔を設定。(単位:秒) デフォルトは2分。

  2. set logfile

    set logfile syslog facility log_daemon

    Monitのログファイルの出力方法を指定。上記はsyslogで、/var/log/messagesに出力する場合の例。

  3. set mailserver

    set mailserver mail.aconus.com, mail.example.com port 10025,
       localhost with timeout 15 seconds

    アラーム発生時にメール通知する場合のホスト、ポート、タイムアウト時間を指定。これらのパラメータをセットでカンマ区切りで複数設定可能であり、左側のサーバから順次処理されダウンしていると判断したら次のサーバにすべる。デフォルトは、サーバ:localhost、ポート:25、タイマ:5秒である。
    上記は、まずサーバ:mail.aconus.comにポート:25を使用して送信し、タイムアウト(5秒)したら、次のサーバ:mail.example.comにポート:10025を使用して送信し、タイムアウト(5秒)してしまったら、最後にlocalhostで送信する例である。最後は15秒でタイムアウトする。

  4. set mail-format

    set mail-format {
       from: monit@mail.aconus.com
       subject: $SERVICE $EVENT at $DATE
       message: Monit $ACTION $SERVICE at $DATE on $HOST.
             Yours sincerely,
             monit
    }

    Monitのデフォルトのメールフォーマットを指定する。差出人、タイトル、メッセージ本文を指定できるが、通常は、差出人の変更ぐらいで十分と思われる。なお、下記の環境変数を使用することができる。

    環境変数 概 要
    $EVENT "Changed"、"Checksum failed"等の発生イベント名。
    $SERVICE monitrcで定義されたサービス名。
    $DATE イベント発生日時。
    $HOST 動作ホスト名。
    $ACTION "restart"、"stop"等の実行したアクション名。

  5. set alert

    set alert oyaji@mail.aconus.com

    メールを送信するデフォルトのアドレス。個別に指定しなければ本アドレスに送信される。

  6. set httpd

    set httpd port 2812 (and use address localhost)
        ssl enable
        pemfile /usr/local/certs/monit.pem
        allow localhost
        allow 192.168.1.10
        allow oyaji:hogehoge

    Monitの制御用Webサーバの設定を行う。

    1. 1行目では、Webサーバのポートを指定する。webサーバがバインドするアドレスを指定してアクセス範囲を限定したい場合は、カッコ内のaddressステートメントで指定する。ここでは例は、localhostのみアクセスできるようにlocalhostを指定する場合である。なお、未指定なら全てのローカルアドレスがバインドされるので、家庭内や管理者のクライアントからもアクセスするなら未指定とする。

    2. 2〜3行目は、SSLアクセス(https)使用時に設定するパラメータであるが、鍵と証明書が一体になっている既存のメール用証明書では駄目だったので、/usr/share/doc/paxkages/monit/README.SSL参考にして証明書を作成してみたが、IEは少しおかしな動き(クライアント認証をしようとしてくるが、無視して続行すればログインできる)で何とか使用できるが、FireFoxやNSではアクセスできない等の現象がでてしまい、いろいろやってみたが改善できなかったので設定を中止した。

    3. 4〜5行目は、allowステートメントでアクセスを許可するアドレスを指定する。ネットワーク指定も可能。

    4. 6行目は、Basic認証を使用する場合に、[ユーザ名]:[パスワード]を指定する。この例ではクリアテキストなのでSSL対応したほうがよい。なお、ドキュメントによればmd5等のパスワードファイルも使用できるである。また、アドレスと認証を設定した場合はand条件で動作する。


◆各デーモンの監視設定

デーモン毎のサンプルの設定が/usr/share/doc/paxkages/monit/doc/samples.htmlにあるのでこれを参考にして設定していきます。ApacheとPostfixXの例を以下に示します。

  1. Apacheの設定

    今回は、Apacheの起動監視のみとした。後半のファイル監視を行うことでハッキング対策等(書き換え監視)ができるが、自動アップデートをしているので誤検出するので今回は設定していない。
    主な変更ポイントは、SuSE用にパスを変更、監視するファイル名の変更、二つあるバイチャルサーバの監視用の設定の追加、である。なお、5回連続してタイムアウトした場合は、携帯に送るようにしてみた。(赤字:追加、青字:変更、緑字:削除)

    check process apache with pidfile /var/run/httpd2.pid
     
    group www
      start program = "/etc/init.d/apache2 start"
      stop program = "/etc/init.d/apache2 stop"
      if failed host
    192.168.1.100 port 80
        protocol HTTP request
    /index.html then restart
      if failed host 192.168.1.100 port 443 type TCPSSL
       
    certmd5 12-34-56-78-90-AB-CD-EF-12-34-56-78-90-AB-CD-EF
        protocol HTTP request
    /index.html then restart
     
    if failed host 192.168.1.101 port 80
        protocol HTTP request /index.html then restart
      if failed host 192.168.1.101 port 443 type TCPSSL
        protocol HTTP request /index.html then restart

      if 5 restarts within 5 cycles then timeout
    #    alert foo@bar
        alert
    xxxxxx@docomo.ne.jp on { timeout }
    #  depends on apache_bin
    #  depends on apache_rc

    #check file apache_bin with path /usr/sbin/httpd2
    #  group www
    #  if failed checksum then unmonitor
    #  if failed permission 755 then unmonitor
    #  if failed uid root then unmonitor
    #  if failed gid root then unmonitor
    # 
    alert foo@bar

    #check file apache_rc with path /etc/init.d/apache
    2
    #  group www
    #  if failed checksum then unmonitor
    #  if failed permission
    744 then unmonitor
    #  if failed uid root then unmonitor
    #  if failed gid root then unmonitor
    # 
    alert foo@bar

  2. Postfixの設定

    Postfixはほとんど設定は不要で、おやじは連続タイムアウト時の携帯転送と起動スクリプト監視の無効化を行った。

    check process postfix with pidfile /var/spool/postfix/pid/master.pid
      group mail
      start program = "/etc/init.d/postfix start"
      stop program = "/etc/init.d/postfix stop"
      if failed port 25 protocol smtp then restart
      if 5 restarts within 5 cycles then timeout
    #    alert foo@bar
      alert xxxxxx@docomo.ne.jp on { timeout }
    #  depends on postfix_rc

    #check file postfix_rc with path /etc/init.d/postfix
    #  group mail
    #  if failed checksum then unmonitor
    #  if failed permission 755 then unmonitor
    #  if failed uid root then unmonitor
    #  if failed gid root then unmonitor
    #   
    alert foo@bar

◆起動設定

YaSTでインストールすれば起動スクリプトがインストールされるので、ランレベルエディタで起動設定したが、再起動時にうまく起動できないことがあったりしたので、INIT起動することにしました。

  1. 起動スクリプトを起動しないようにする。

    # insserv -r monit

  2. YaST コントロールセンタを起動し、「システム」の「/etc/sysconfigエディター」を起動する。

  3. 「System」 の 「Monitoring」 の 「MONIT_VIA_INITTAB」 で 設定欄のプルダウンメニューで 「yes」 に変更し 「完了」 ボタンを押す。

  4. 変更された変数の確認ウィンドウが開くので 「了解」 を押しておしまい。

■Monitの動作確認

Monitの動作確認は、実際にデーモンを停止してnetstatで状況をモニタしていると、自動的に復旧し、その後、alertで設定したユーザにメール通知されるので、それを確認すればよい。syslogにもログが吐かれているはずである。


Top Pageへ