NSCAを使った分散監視のインストール

 LS−GLでも以前RedHat系でやったことのあるNagiosの分散監視を試みた。
  分散監視の概念は、Nagios(ここではリモートホストと呼ぶ)で収集した監視データをそこで処理せず別のNagios(ここでは監視ホストあるいはモ ニタリングホストと呼ぶ)に転送してそこで表示や通知、統計処理をさせるという方法であり、大規模ネットワークやファイヤーウォール越えの監視に有効なも ののようである。
 NSCA(Nagios service monitor agent)はこのリモートからセントラルへのパッシブなデータの転送処理を担当するものであり、これを使った分散監視の構成は以下のようなものである。

NSCAの稼働イメージ

 これを試すに当たっては、少なくとも二個のNagiosが動いているパソコンが必要となる。
 うち一台は、これまで作ってきたNagiosをインストールしたLS−GLをセントラルホストとして使うこととするが、リモート用のもう一台は今回新たに作成する必要がある。
 このための端末は、かってDebianを入れて作業用端末として使っていたthinkpad 240を使うこととして、

 a.Nagiosをここにあるやり方でインストール
   ステータスマップなどの設定は使わないのでしない。
   監視項目もテスト用のため自分の監視と一つ程度のホスト(今回はインターネットルーター)とする。
 b.Debianは端末モードでインストールしているのでapach2はインストールされていない。
   apache2をインストールする。これは必須ではないがNagiosの稼働確認には
   あった方が便利である。

により設定し、ブラウザでNagiosの動作確認をおこなった。

 分散監視の設定方法は、以前試した方法によったが、バージョンの違いもあり多少異なるので要点を以下に述べる。

1.NSCAのインストール(この項は監視ホスト、リモートホスト共同じ操作をする。)
  NSCAはlibmcryptを使うのでまずこれをインストール
  ・ここから最新のlibmcrypt-2.5.7.tar.gzをダウンロード
  ・# tar zxvf libmcrypt-2.5.7.tar.gz で適当なディレクトリーで解凍
  ・# cd libmcrypt-2.5.7 で移動して
  ・# ./configure
    ・# make
  ・# make check
      ==================
      All 2 tests passed
      ==================
    となればOKかなぁ

  ・# make install
     ----------------------------------------------------------------------
     Libraries have been installed in:
        /usr/local/lib

     If you ever happen to want to link against installed libraries
     in a given directory, LIBDIR, you must either use libtool, and
     specify the full pathname of the library, or use the `-LLIBDIR'
     flag during linking and do at least one of the following:
        - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
          during execution
        - add LIBDIR to the `LD_RUN_PATH' environment variable
          during linking
        - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
        - have your system administrator add LIBDIR to `/etc/ld.so.conf'

     See any operating system documentation about shared libraries for
     more information, such as the ld(1) and ld.so(8) manual pages.
     ----------------------------------------------------------------------

  ・/etc/ld.so.confの最終行に/usr/local/lib を追記 
  ・# ldconfig で設定を反映させる。

  次にNSCAのインストール
  ・ここからnsca-2.7.2.tar.gz をダウンロード
  ・# tar zxvf nsca-2.7.2.tar.gz で適当なディレクトリーに解凍
  ・# cd nsca-2.7.2 で移動して
  ・# ./configure
     *** Configuration summary for nsca 2.7.2 07-03-2007 ***:

      General Options:
      -------------------------
      NSCA port:  5667
      NSCA user:  nagios
      NSCA group: nagios

     Review the options above for accuracy.  If they look okay,
     type 'make all' to compile the NSCA daemon and client.



  ・# make all
     *** Compile finished ***

     If the compile finished without any errors, you should
     find client and server binaries in the src/ subdirectory.

     Read the README file for more information on installing
     the binaries, creating configuration files, and using
     the server and client.

  ・# ls src で結果を確認する。
     Makefile     netutils.c  nsca.c     send_nsca.c
     Makefile.in  nsca        send_nsca  utils.c

  ・nsca.cfgとsend_nsca.cfgの修正
   nsca.cfg
####################################################
# Sample NSCA Daemon Config File
# Written by: Ethan Galstad (nagios@nagios.org)
#
# Last Modified: 04-03-2006
####################################################

# PID FILE
# The name of the file in which the NSCA daemon should write it's process ID
# number.  The file is only written if the NSCA daemon is started by the root
# user as a single- or multi-process daemon.

pid_file=/var/run/nsca.pid

# PORT NUMBER
# Port number we should wait for connections on.
# This must be a non-priveledged port (i.e. > 1024).

server_port=5667

# SERVER ADDRESS
# Address that NSCA has to bind to in case there are
# more as one interface and we do not want NSCA to bind
# (thus listen) on all interfaces.

#server_address=192.168.1.1

# NSCA USER
# This determines the effective user that the NSCA daemon should run as. 
# You can either supply a username or a UID.
#
# NOTE: This option is ignored if NSCA is running under either inetd or xinetd

nsca_user=nagios

# NSCA GROUP
# This determines the effective group that the NSCA daemon should run as. 
# You can either supply a group name or a GID.
#
# NOTE: This option is ignored if NSCA is running under either inetd or xinetd

nsca_group=nagiocmd nagiosから修正。関係はなさそう

# NSCA CHROOT
# If specified, determines a directory into which the nsca daemon
# will perform a chroot(2) operation before dropping its privileges.
# for the security conscious this can add a layer of protection in
# the event that the nagios daemon is compromised. 
#
# NOTE: if you specify this option, the command file will be opened
#       relative to this directory.

#nsca_chroot=/var/run/nagios/rw

# DEBUGGING OPTION
# This option determines whether or not debugging
# messages are logged to the syslog facility.
# Values: 0 = debugging off, 1 = debugging on

debug=1 0から修正。当初データ伝送が上手くいかず確認のためセット。実運用では0に修正

# COMMAND FILE
# This is the location of the Nagios command file that the daemon
# should write all service check results that it receives.

command_file=/usr/local/nagios/var/rw/nagios.cmd

# ALTERNATE DUMP FILE
# This is used to specify an alternate file the daemon should
# write service check results to in the event the command file
# does not exist.  It is important to note that the command file
# is implemented as a named pipe and only exists when Nagios is
# running.  You may want to modify the startup script for Nagios
# to dump the contents of this file into the command file after
# it starts Nagios.  Or you may simply choose to ignore any
# check results received while Nagios was not running...

alternate_dump_file=/usr/local/nagios/var/rw/nsca.dump

# AGGREGATED WRITES OPTION
# This option determines whether or not the nsca daemon will
# aggregate writes to the external command file for client
# connections that contain multiple check results.  If you
# are queueing service check results on remote hosts and
# sending them to the nsca daemon in bulk, you will probably
# want to enable bulk writes, as this will be a bit more
# efficient.
# Values: 0 = do not aggregate writes, 1 = aggregate writes

aggregate_writes=1 何故か0から訂正。理由は分らない。

# APPEND TO FILE OPTION
# This option determines whether or not the nsca daemon will
# will open the external command file for writing or appending.
# This option should almost *always* be set to 0!
# Values: 0 = open file for writing, 1 = open file for appending

append_to_file=1 これも上と同じ

# MAX PACKET AGE OPTION
# This option is used by the nsca daemon to determine when client
# data is too old to be valid.  Keeping this value as small as
# possible is recommended, as it helps prevent the possibility of
# "replay" attacks.  This value needs to be at least as long as
# the time it takes your clients to send their data to the server.
# Values are in seconds.  The max packet age cannot exceed 15
# minutes (900 seconds).  If this variable is set to zero (0), no
# packets will be rejected based on their age.

max_packet_age=30

# DECRYPTION PASSWORD
# This is the password/passphrase that should be used to descrypt the
# incoming packets.  Note that all clients must encrypt the packets
# they send using the same password!
# IMPORTANT: You don't want all the users on this system to be able
# to read the password you specify here, so make sure to set
# restrictive permissions on this config file!

password=nagios これは必須

# DECRYPTION METHOD
# This option determines the method by which the nsca daemon will
# decrypt the packets it receives from the clients.  The decryption
# method you choose will be a balance between security and performance,
# as strong encryption methods consume more processor resources.
# You should evaluate your security needs when choosing a decryption
# method.
#
# Note: The decryption method you specify here must match the
#       encryption method the nsca clients use (as specified in
#       the send_nsca.cfg file)!!
# Values:
#
#     0 = None    (Do NOT use this option)
#       1 = Simple XOR  (No security, just obfuscation, but very fast)
#
#       2 = DES
#       3 = 3DES (Triple DES)
#    4 = CAST-128
#    5 = CAST-256
#    6 = xTEA
#    7 = 3WAY
#    8 = BLOWFISH
#    9 = TWOFISH
#    10 = LOKI97
#    11 = RC2
#    12 = ARCFOUR
#
#    14 = RIJNDAEL-128
#    15 = RIJNDAEL-192
#    16 = RIJNDAEL-256
#
#    19 = WAKE
#    20 = SERPENT
#
#    22 = ENIGMA (Unix crypt)
#    23 = GOST
#    24 = SAFER64
#    25 = SAFER128
#    26 = SAFER+
#

decryption_method=3

   send_nsca.cfg
####################################################
# Sample NSCA Client Config File
# Written by: Ethan Galstad (nagios@nagios.org)
#
# Last Modified: 02-21-2002
####################################################

# ENCRYPTION PASSWORD
# This is the password/passphrase that should be used to encrypt the
# outgoing packets.  Note that the nsca daemon must use the same
# password when decrypting the packet!
# IMPORTANT: You don't want all the users on this system to be able
# to read the password you specify here, so make sure to set
# restrictive permissions on this config file!

password=nagios ホストにあわす

# ENCRYPTION METHOD
# This option determines the method by which the send_nsca client will
# encrypt the packets it sends to the nsca daemon.  The encryption
# method you choose will be a balance between security and performance,
# as strong encryption methods consume more processor resources.
# You should evaluate your security needs when choosing an encryption
# method.
#
# Note: The encryption method you specify here must match the
#       decryption method the nsca daemon uses (as specified in
#       the nsca.cfg file)!!
# Values:
#     0 = None    (Do NOT use this option)
#       1 = Simple XOR  (No security, just obfuscation, but very fast)
#
#       2 = DES
#       3 = 3DES (Triple DES)
#    4 = CAST-128
#    5 = CAST-256
#    6 = xTEA
#    7 = 3WAY
#    8 = BLOWFISH
#    9 = TWOFISH
#    10 = LOKI97
#    11 = RC2
#    12 = ARCFOUR
#
#    14 = RIJNDAEL-128
#    15 = RIJNDAEL-192
#    16 = RIJNDAEL-256
#
#    19 = WAKE
#    20 = SERPENT
#
#    22 = ENIGMA (Unix crypt)
#    23 = GOST
#    24 = SAFER64
#    25 = SAFER128
#    26 = SAFER+
#

encryption_method=3 ホストにあわす

  ・各種ファイルの配置
  監視ホスト リモートホスト
バイナリ
ファイル
/usr/local/nagios/bin/nsca /usr/local/nagios/libexec/send_nsca
定義ファイル /usr/loca/nagios/var/nsca.cfg /usr/local/nagios/var/send_nsca.cfg
  cfgファイルはetc/でも良いような気がする。

  ・監視ホストでのnsca起動手続き(これはシステムにより異なる。Debian etchの場合)
      /etc/inetd.confに下記を追加
#:NSCA
nsca       stream  tcp     nowait  nagios  /usr/sbin/tcpd /usr/local/nagios/bin/nsca       -c /usr/local/nagios/var/nsca.cfg --inetd
   # /etc/init.d/openbsd-inetd restart
   ポートの追加 /etc/serviceの該当場所に nsca   5667/tcp  # NACA for Nagios を追記
   このポート追加は念のためリモート側にも追加したが不要かもしれない。

  ・動作確認をしたかったがNSCA単体での方法が分らなかった。Nagios含め実施

2.Nagiosの設定
 a.リモートホスト側
   ・nagios.cfg
    enable_notifications=0
    obsess_over_services=1
    ocsp_command=submit_check_result

   ・localhost.cfgの末尾に記載。command.cfgでも良さそう。
    define command{
            command_name    submit_check_result
            command_line    /usr/local/nagios/libexec/submit_check_result $HOSTNAME$                    '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$'
            }
   ・/usr/local/nagios/libexec/submit_check_resultを下記内容で追記。パーミッションを実行許可
#!/bin/sh

return_code=-1

case "$3" in
        OK)
                return_code=0
                ;;
        WARNING)
                return_code=1
                ;;
        CRITICAL)
                return_code=2
                ;;
        UNKNOWN)
                return_code=-1
                ;;
esac

/usr/bin/printf "%s\t%s\t%s\t%s\n" "$1" "$2" "$return_code" "$4" | /usr/local/nagios/bin/send_nsca -H 192.168.0.71 -c /usr/local/nagios/var/send_nsca.cfg

 b.監視ホスト側
  ・nagios.cfg
     execute_service_checks=1
     accept_passive_service_checks=1
     retain_state_information=0
     use_retained_program_state=0

  ・localhost.cfgの定義
     新しい雛型passive-serverを追加
     define host{
             name                            passive-server
             use                              generic-host
             check_period                     24x7
             max_check_attempts               10
     #        check_command                   check-host-alive チェックをしない
             notification_period              workhours
             notification_interval            120
             notification_options             d,u,r
             contact_groups                   admins
             register                         0
             }

    実際のホスト定義
    define host{
              use                     passive-server
             host_name                thinkpad
             alias                    RemoteNagios
             address                  192.168.0.64
             parents                 LS-GL
             }

    define host{
             use                      passive-server
             host_name                router
             alias                    BBR-4HG
             address                  192.168.0.254
             parents                  LS-GL
             }


    サービス定義の一般雛型generic-service2追加
    define service{
             name                             generic-service2
             active_checks_enabled            0
             passive_checks_enabled          1
             parallelize_check                1
             obsess_over_service              1
             check_freshness                  1
              notifications_enabled           1
             event_handler_enabled            1
             flap_detection_enabled          1
             failure_prediction_enabled      1
             process_perf_data                1
             retain_status_information       1
             is_volatile                      0
             register                         0
             }
    個別雛型passive-service追加
    define service{
             name                             passive-service
             use                              generic-service2
             check_period                     24x7
             max_check_attempts               4
             normal_check_interval            5
             retry_check_interval             1
             contact_groups                  admins
             notification_options             w,u,c,r
             notification_interval            60
             notification_period              24x7
             freshness_threshold              120
             register                         0
             }

    実際のサービス定義
    define service{
             use                              passive-service
             host_name                        thinkpad
             service_description              PING
             check_command                    service-is-stale
             }

    define service{
             use                              passive-service
             host_name                        thinkpad
             service_description              Root Partition
             check_command                    service-is-stale
             }

    define service{
             use                              passive-service
             host_name                        router
             service_description              PING
             check_command                    service-is-stale
             }

   ・command.cfgの最下行に追記
     ########################################################
     # Add freshness_check
     ########################################################
     define command{
             command_name    service-is-stale
             command_line    /usr/local/nagios/libexec/staleservice.sh
             }
   ・/usr/local/nagios/libexec/staleservice.shの作成、実行形式にchmod
     #!/bin/sh

     /bin/echo "CRITICAL: Service results are stale!"

     exit 2

3.動作確認
 この設定を行った後、両サーバーのNagiosを起動したが、リモート監視については全く動いた形跡がなかった。
 色々調べてみた結果、大きくは次の二つであり、何とか解決することが出来た。
 a.監視サーバー側のnscaが起動していなかった。
   これは/etc/inetd.confをじっくり見ているうちに気がついた。TCPWrapperの有無しが間 違っていた事によるものであり、修正して回復。回復前は、/var/log/daemon.logなどのログ類を見てみるが何の反応もしていなかった。
   リモート側の送信動作をより確実とするため# /usr/local/nagios/bin/send_nsca -H 192.168.0.71 -c /usr/local/nagios/var/send_nsca.cfg と直接コマンドを打ってみても何の反応もしなかった。
   しかし、回復後は
   Apr 12 17:46:06 test nsca[2329]: connect from 192.168.0.64 (192.168.0.64)

 b.リモートホスト側submit_check_resultの不備
   上の対策でデータ伝送は出来るようになったが、状態表示が正常とならない。
    このため、前述のnsca.cfgでdebug=1としてログの内容を増やしてみた。submit_check_resultを調べている内にTAB キーでカーソルを移動しないといけないのにスペースキーで移動していたのでスクリプトが後判断して全て不正常の結果を送ってきていた。メッセージの内容は 以下の通りである。

   tail /var/log/deamon.log 異常時 Return Code: '-1'となっている。

   Apr 12 17:44:26 test nsca[2316]: End of connection...
   Apr 12 17:46:06 test nsca[2329]: connect from 192.168.0.64 (192.168.0.64)
   Apr 12 17:46:06 test nsca[2329]: Handling the connection...
    Apr 12 17:46:06 test nsca[2329]: SERVICE CHECK -> Host Name: 'thinkpad', Service         Description: 'PING', Return Code: '-1', Output: 'PING OK - Packet loss = 0%, RTA = 0.18 ms'
   Apr 12 17:46:06 test nsca[2329]: End of connection...

   正常時の表示
   Apr 12 20:04:43 test nsca[3829]: connect from 192.168.0.64 (192.168.0.64)
   Apr 12 20:04:43 test nsca[3829]: Handling the connection...
    Apr 12 20:04:43 test nsca[3829]: SERVICE CHECK -> Host Name: 'thinkpad', Service         Description: 'Root Partition', Return Code: '0', Output: 'DISK OK - free space: / 886 MB     (32% inode=74%):'
   Apr 12 20:04:43 test nsca[3829]: End of connection...

4.各種監視画面
 a.正常受信
リモートホストからの正常受信
 パッシブ監視のマークがパッシブ受信マークとなっている。

 b.上の状態の時のステータスマップ
上の状態のステータスマップ

 c.フレッシュネスチェックで異常となった例
フレッシュネスチェック異常
 ステータス情報欄にstaleservice.shで設定したCRITICAL: Service results are stale!が表示されている。


(参考)

リモート側Nagiosのlocalhost.cfg におけるhost 定義
define host{
        use                     linux-server
        host_name               thinkpad
        alias                   localhost
        address                 127.0.0.1
        }

define host{
        use                     linux-server
        host_name               router
        alias                   BBR-4HG
        address                 192.168.0.254
        }


サービス定義
define service{
        use                             local-service         ; Name of service template to use
        host_name                       thinkpad
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
        }

define service{
        use                             local-service         ; Name of service template to use
        host_name                       thinkpad
        service_description             Root Partition
        check_command                   check_local_disk!20%!10%!/
        }

define service{
        use                             local-service
        host_name                       router
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
        }
 この時の監視画面
リモートホスト表示


ホームページトップ  LinkStationトップ