SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 12 de abril de 2010

Instalar MemCached (32bits) en Solaris 10

Introducción
En esta ocasión vamos a ver cómo instalar y configurar MemCached en Solaris 10, en 32bits. En otro post vimos cómo Instalar MemCached en Solaris 10 en 64bits, debéis tener en cuenta que si lo instalamos en 32bits no podremos poner un tamaño de caché superior a 4Gb, a parte de esto, no tenemos más limitaciones.

La instalación de MemCached necesita de la biblioteca LibEvent, por lo tanto, primero deberemos descargar y compilarla. En nuestro ejemplo vamos a utilizar la siguiente estructura:
$MEMCACHED_HOME=/opt/memcached/32
$LIBEVENT_HOME=/opt/memcached/libevent/32
Y crearemos el usuario <memcached> y el project <user.memcached&gt para gestionar el uso de recursos dentro del sistema. Además, haremos que nuestro servidor de MemCached esté ejecutado -y controlado- mediante SMF, por lo tanto, podremos incluirlo como servicio requerido.

Para aquellos que no tenéis la posibilidad de compilar los paquetes, os he dejado uno listo para instalar -en el path </opt/memcached> en Solaris 10 SPARC de MemCached 1.4.5 32bits y Solaris 10 X86 de MemCached 1.4.5 32bits

Instalación de LibEvent (32Bits)
$ wget http://www.monkey.org/%7Eprovos/libevent-1.4.13-stable.tar.gz
$ gtar zxpf libevent-1.4.13-stable.tar.gz
$ cd libevent-1.4.13-stable
$ ./configure --enable-static --prefix=/opt/memcached/libevent/32
$ make
# make install
Comprobamos que todo se ha instalado correctamente y que no tenemos dependencias fallidas
$ ldd /opt/memcached/libevent/32/lib/libevent.so
        libnsl.so.1 =>   /lib/libnsl.so.1
        librt.so.1 =>    /lib/librt.so.1
        libresolv.so.2 =>        /lib/libresolv.so.2
        libsocket.so.1 =>        /lib/libsocket.so.1
        libc.so.1 =>     /lib/libc.so.1
        libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1
        libscf.so.1 =>   /lib/libscf.so.1
        libaio.so.1 =>   /lib/libaio.so.1
        libdoor.so.1 =>  /lib/libdoor.so.1
        libuutil.so.1 =>         /lib/libuutil.so.1
        libgen.so.1 =>   /lib/libgen.so.1
        libm.so.2 =>     /lib/libm.so.2
        /platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
        /platform/SUNW,Sun-Fire-280R/lib/libmd_psr.so.1


Instalación de MemCached (32bits)
En la instalación de MemCached, vamos a forzar a nuestro linker para que se asocie con la biblioteca libevent que hemos creado, es decir, vamos a utilizar el flag &lt:-R> y de esta forma, no será necesario exportar la variable de entorno LD_LIBRARY_PATH_32. Para ello, deberemos utilizar la variable de entorno LDFLAGS que nos permitirá incluirlo en el sistema de configuración de MemCache.


Además, existe un bug en Solaris 10 que hace que el sistema incluya la opción <-pthread> que en algunas versiones antiguas de GCC no es válida, así que nos muestra el error:
gcc: unrecognized option `-pthread'
Para solucionarlo, simplemente exportaremos el valor a <-pthreads> en $CFLAGS y configuraremos. Si queréis más información aquí esta el link al bug
$ wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
$ gtar zxpf memcached-1.4.5.tar.gz
$ cd memcached-1.4.5
$ export LDFLAGS="-R/opt/memcached/libevent/32/lib -R/usr/sfw/lib"
$ export CFLAGS="-pthreads -O3"
$ ./configure --with-libevent=/opt/memcached/libevent/32 --prefix=/opt/memcached/32
$ make
# make install
Comprobamos que se ha instalado correctamente y que no tiene dependencias fallidas
$ ldd /opt/memcached/32/bin/memcached
        libumem.so.1 =>  /lib/libumem.so.1
        libnsl.so.1 =>   /lib/libnsl.so.1
        libsocket.so.1 =>        /lib/libsocket.so.1
        libevent-1.4.so.2 =>     /opt/memcached/libevent/32/lib/libevent-1.4.so.2
        libc.so.1 =>     /lib/libc.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1
        libscf.so.1 =>   /lib/libscf.so.1
        librt.so.1 =>    /lib/librt.so.1
        libresolv.so.2 =>        /lib/libresolv.so.2
        libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
        libdoor.so.1 =>  /lib/libdoor.so.1
        libuutil.so.1 =>         /lib/libuutil.so.1
        libgen.so.1 =>   /lib/libgen.so.1
        libaio.so.1 =>   /lib/libaio.so.1
        libm.so.2 =>     /lib/libm.so.2
        /platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
        /platform/SUNW,Sun-Fire-280R/lib/libmd_psr.so.1
Configuración MemCached
A continuación vamos a crear el usuario y grupo <memcached> y el project <user.memcached> -recordar que SMF necesita hacer un chdir al home del usuario-
# groupadd memcache
# useradd -g memcache -s /bin/bash -d /export/home/memcache -m memcache
# projadd -G memcache -c 'MemCache Project' user.memcache
Creamos el Manifest para MemCached -en mi caso he decidido ponerlo en <application/cache> pero puedes ponerlo donde quieras-

# cd /var/svc/manifest/application/cache/
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/memcached/svc/memcached_1.xml
# svccfg
svc:> validate memcached_1.xml
svc:> import memcached_1.xml
svc:> quit
Y ahora, el Method para MemCached
# cd /lib/svc/method
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/memcached/svc/memcached_1
# chmod 555 memcached_1
# chown root:bin memcached_1
Ya hemos instalado todos los requisitos de Solaris SMF, sin embargo, hemos declarado que guarde el <PID> en <$MEMCACHED_HOME/run>, por lo tanto, debemos crear el directorio
# mkdir /opt/memcached/32/run
# chown memcache:memcache /opt/memcached/32/run
# chmod 750  /opt/memcached/32/run
Ahora ya podemos activar nuestro servicio MemCached utilizando el FRMI <memcached_1>
# svcs memcached_1
STATE          STIME    FMRI
disabled       11:37:41 svc:/application/cache/memcached_1:memcached_default32bits
# svcadm enable memcached_1
# svcs -p memcached_1
STATE          STIME    FMRI
online         12:04:25 svc:/application/cache/memcached_1:memcached_default32bits
               12:04:25    18580 memcached
Conclusiones
En esta ocasión hemos visto cómo instalarlo y configurarlo, la verdad es que no requiere de mucho tiempo -ni conocimientos- y, al introducir el control dentro de Solaris SMF, podemos gestionar las dependencias, por ejemplo, si nuestro memcached se cae, el servicio de Tomcat gestionado por SMF se marque como degraded


Referencias

viernes, 9 de abril de 2010

Cómo Configurar IPFilter en Solaris 10 Paso a Paso

Introducción
Muchas veces a lo largo de los post, he ido hablando de IPFilter, también he creado algunos con pequeños tips de cómo Activar el Log de IPFilter, Cómo Activar IPFilter para Hadoop, pero, no había creado uno dedicado exclusivamente a Configurar IPFilter para Solaris 10 Paso a Paso.

En esta ocasión, vamos a ver los pasos necesarios para activar IPFilter en Solaris 10 de forma sencilla y rápida. Antes de comenzar con la configuración vamos a tener un par de cosas en cuenta.

Antes de Empezar
IPFilter puede activarse sobre una zona no global siempre que la tarjeta de red esté como <excl>, si está como <shared> no se podrá.

Para comprobar el tipo de asignación de IP que tenemos en la zona, simplemente ejecutaremos el comando <zoneadm> con las opciones <list -cv> y comprobaremos el valor de IP

# zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   1 zion             running    /opt/zones/zion                native   excl
  12 logos            running    /opt/zones/logos               native   shared
   - andatza          installed  /opt/zones/andatza             native   excl
Por ejemplo, si queremos activar IPFilter sobre una zona que tiene la red en modo <shared> -que ya hemos comentado que no se puede- el sistema nos mostrará el siguiente error:

# svcadm enable ipfilter
# svcs -x ipfilter
svc:/network/ipfilter:default (IP Filter)
 Estado: maintenance desde  9 de abril de 2010 10:17:33 CEST
Motivo: Iniciar método salió con $SMF_EXIT_ERR_CONFIG.
   Consulte: http://sun.com/msg/SMF-8000-KS
   Consulte: ipfilter(5)
   Consulte: /var/svc/log/network-ipfilter:default.log
Impacto: Este servicio no está funcionando.

# tail /var/svc/log/network-ipfilter:default.log
[ abr  9 10:17:33 Executing start method ("/lib/svc/method/ipfilter start") ]
open device: No such file or directory
SIOCFRENB: Bad file number
open device: No such file or directory
User/kernel version check failed
/lib/svc/method/ipfilter: load of /etc/ipf/ipf.conf into alternate set failed
Not switching config due to load error.
[ abr  9 10:17:33 Method "start" exited with status 96 ]

# svcadm disable ipfilter

Si tenemos todas nuestras zonas con la red en modo <shared>, no os preocupeis, editaremos la configuración desde la zona global, y no hay más problema.

Activar IPFilter
La activación de IPFilter depende de la Versión de Solaris que tenemos instalada, ya que hasta la versión 10 8/07 era necesario activar el módulo <pfil>, sin embargo, a partir de esta versión, ya no es necesario.

- Versión 10 11/06 o Anterior -
Primero deberemos activar el módulo de <pfil> con autopush, para ello, editaremos/crearemos el archivo </etc/ipf/pfil.ap> con el nombre de nuestra tarjeta de red -sobre la cuál activaremos pfil-, en mi caso es <ce0>, y activaremos el FRMI <svc:/network/pfil>
# vi /etc/ipf/pfil.ap
   #major  minor   lastminor       modules
   ce0     -1      0               pfil
:wq
# svcadm restart svc:/network/pfil
Una vez activado pfil podemos activar ipfilter,  es necesario hacer un reboot para que los cambios tengan efecto
# svcadm enable ipfilter
# reboot
- Versión 10 8/07 o Superior -
Para activar IPFilter deberemos poner en enabled el FRMI <svc:/network/ipfilter:default>, como podéis ver, se ha simplificado muchísimo la configuración y no es necesario hacer un reboot
# svcadm enable ipfilter
# svcs ipfilter
STATE          STIME    FMRI
online         10:05:16 svc:/network/ipfilter:default
Configuración de Reglas de IPFilter
Una vez activado, ya podemos empezar a introducir reglas en el archivo </etc/ipf/ipf.conf>, recordar que si no existe o está vacío es como poner las siguientes reglas:
pass in all
pass out all
Al principio del post hemos comentado que no podemos activar IPFilter en las zonas si tienen la red asignada como shared, bien, para poder hacer firewalling sobre ellas, deberemos declarar sus IPs -la de las zonas- y configurar las reglas en la zona global, por ejemplo, imaginemos que tenemos una zona -Zion- con la IP 192.168.1.200/24 y no quiero que conteste a paquetes ICMP que no vengan de la LAN, la configuración de IPFilter quedaría así:
# zonename
global

# vi /etc/ipf/ipfilter.conf
  # Interfaces
  int_if = "ce0";

  # Zonas
  zone_zion = "192.168.1.200/32";

  # Configuracion RED
  our_net = "192.168.0.0/16";

  # eliminamos los paquetes peque!nos
  block in log quick from any with ipopts
  block in log quick proto tcp from any to any with short

  # permitir SSH desde - hacia
  pass in quick on $int_if from $our_net port=22 to any
  pass out quick on $int_if from $our_net port=22 to any
 
  # LocalHost
  pass in quick from 127.0.0.1/32 to 127.0.0.1/32
 
  # Zone Zion, no Responde a ICMP
  block in log quick icmp from any to $zone_zion
  block out log quick icmp from $zone_zion to any
 
  # Permitir ICMP solo LAN menos ZONE1
  pass in quick proto icmp from $our_net to $our_net
  pass out quick proto icmp from $our_net to $our_net
 
  # todo lo demás bloqueado
  block in log quick proto icmp from any to any
  block out log quick proto icmp from any to any
 
:wq
# svcadm restart ipfilter

Configurar el Log de IPFilter
Para que IPFilter registre los accesos, debemos utilizar la opción <log> en nuestrar reglas, además, debemos activar en nuestra configuración de syslog y reiniciar el demonio.

Recordar que la separación entre y el nombre del fichero debe ser tabuladores y no espacios

# vi /etc/syslog.conf
  ############################################
  ## IPFilter Log
  ############################################
  local0.debug                              /var/log/ipfilter.log
:wq
# touch /var/log/ipfilter.log
# chmod 600 /var/log/ipfilter.log
# svcadm restart system-log

Conclusiones
La verdad es que a partir de la versión 10 8/07 se ha simplificado en gran medida la activación y mantenimiento, además de no requerir un reboot, ya tenemos una excusa más para tener Solaris actualizado a la última release, xD

Espero que con esta agrupación tengáis más sencillo ver los pasos para la Instalación de IPFilter sobre Solaris 10, de todas formas, os dejo en referencias los post separados, por si queréis mayor detalle.


Referencias

miércoles, 7 de abril de 2010

Cómo ver un Calendario desde línea de comandos en Solaris 10

Introducción
Puede que alguna vez necesitemos ver el calendario -no sólo la fecha actual- y, no tengamos uno a mano. Para ello, podemos contar con el comando <cal>. Su formato es el siguiente
cal [ [mes] [año]]
Cal utiliza la variable de entorno <LC_ALL> y <LC_MESSAGES> para formatear la salida en uno y otro idioma, además, si ejecutamos el comando sin opciones, nos mostrará el calendario del mes actual
$ export LC_ALL=es.UTF-8
$ cal
   abril 2010
Do Lu Ma Mi Ju Vi Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

$ export LC_ALL=en.UTF-8
$ cal
   April 2010
 S  M Tu  W Th  F  S
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
Si queremos ver el calendario del año 2010, simplemente ejecutaremos el siguiente comando -he tenido que ajustar las fuentes para que se refleje el resultado de salida del comando en Solaris-

$ cal 2010
                                2010

         ene                    feb                    mar
Do Lu Ma Mi Ju Vi Sa   Do Lu Ma Mi Ju Vi Sa   Do Lu Ma Mi Ju Vi Sa
                1  2       1  2  3  4  5  6       1  2  3  4  5  6
 3  4  5  6  7  8  9    7  8  9 10 11 12 13    7  8  9 10 11 12 13
10 11 12 13 14 15 16   14 15 16 17 18 19 20   14 15 16 17 18 19 20
17 18 19 20 21 22 23   21 22 23 24 25 26 27   21 22 23 24 25 26 27
24 25 26 27 28 29 30   28                     28 29 30 31
31
         abr                    may                    jun
Do Lu Ma Mi Ju Vi Sa   Do Lu Ma Mi Ju Vi Sa   Do Lu Ma Mi Ju Vi Sa
             1  2  3                      1          1  2  3  4  5
 4  5  6  7  8  9 10    2  3  4  5  6  7  8    6  7  8  9 10 11 12
11 12 13 14 15 16 17    9 10 11 12 13 14 15   13 14 15 16 17 18 19
18 19 20 21 22 23 24   16 17 18 19 20 21 22   20 21 22 23 24 25 26
25 26 27 28 29 30      23 24 25 26 27 28 29   27 28 29 30
                       30 31
         jul                    ago                    sep
Do Lu Ma Mi Ju Vi Sa   Do Lu Ma Mi Ju Vi Sa   Do Lu Ma Mi Ju Vi Sa
             1  2  3    1  2  3  4  5  6  7             1  2  3  4
 4  5  6  7  8  9 10    8  9 10 11 12 13 14    5  6  7  8  9 10 11
11 12 13 14 15 16 17   15 16 17 18 19 20 21   12 13 14 15 16 17 18
18 19 20 21 22 23 24   22 23 24 25 26 27 28   19 20 21 22 23 24 25
25 26 27 28 29 30 31   29 30 31               26 27 28 29 30

         oct                    nov                    dic
Do Lu Ma Mi Ju Vi Sa   Do Lu Ma Mi Ju Vi Sa   Do Lu Ma Mi Ju Vi Sa
                1  2       1  2  3  4  5  6             1  2  3  4
 3  4  5  6  7  8  9    7  8  9 10 11 12 13    5  6  7  8  9 10 11
10 11 12 13 14 15 16   14 15 16 17 18 19 20   12 13 14 15 16 17 18
17 18 19 20 21 22 23   21 22 23 24 25 26 27   19 20 21 22 23 24 25
24 25 26 27 28 29 30   28 29 30               26 27 28 29 30 31
31


Y si quiero ver el mes de Mayo de 2008, por ejemplo,

$ cal 5 2008
   mayo 2008
Do Lu Ma Mi Ju Vi Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Referencias

lunes, 5 de abril de 2010

Monitorizar Servicios Solaris 10 Nagios - Parte 3

Introducción
Durante esta serie de artículos sobre Monitorización de Servicios de Solaris 10 con Nagios hemos visto las diferentes alternativas que tenemos. En esta ocasión, y como última parte de la serie, vamos a ver un plugin de Nagios que nos permite monitorizar remótamente las máquinas sin tener que utilizar SSH.

En la Primera Parte de Monitorización de Servicios de Solaris 10 con Nagios hemos visto cómo podemos utilizar unos pequeños plugins para <localmente> hacer checks a <svc> -básicamente es un warper del comando <svcs>-, en la Segunda Parte de Monitorización de Servicios de Solaris 10 con Nagios hemos visto cómo utilizar SSH para poder acceder remótamente al sistema de check

En esta ocasión hablaremos de NPRGE, un plugin de Nagios que nos permitirá monitorizar los servicios remotamente a través de un servicio que escucha en un puerto determinado.

La ventaja de este plugin es que la carga del sistema no se ve tan afectada -recordar que en la Parte 2 hablábamos de utilizar SSH- ya que el servicio consume menos recursos y no tiene que estar creando y destruyendo sesiones SSH. Sin embargo no todo son buenas noticias. El uso de este plugin -mejor dicho, una configuración incorrecta- hace que tengamos que tener mucho cuidado ya que abre un puerto y por lo tanto, debemos blindar su acceso.

Para aquellos que no tengais tiempo -o ganas- de compilar los paquetes os dejo aquí un par de tar.gz con las versiones compiladas para NRPE Solaris 10 SPARC y NRPE Solaris 10 x86, que incluyen los archivos para Solaris 10 SMF.



Instalación de NPRGE en Solaris 10
La instalación del plugin en Solaris 10 no requiere de gran cosa, sin embargo, deberemos hacer algún cambio en el código fuente para que compile sin problemas. Además, si queremos incluir soporte SSL -muy recomendable- deberemos tener OpenSSL instalado.

Para evitar tener que ir instalando OpenSSL por todos los host podemos utilizar el que viene incluido en Solaris 10 </usr/sfw>, aunque es de 32bits nos servirá. Por ello, he decidido utilizar como compilador <gcc> y el OpenSSL incluido en Solaris 10.

Como os he comentado, antes de poder compilar correctamente el plugin, debemos hacer un pequeño ajuste en el código fuente, concretamente en <src/nrpe.c> con estas líneas de código:

        else if(!strcmp(varvalue,"authpriv"))
                log_facility=LOG_AUTHPRIV;
        else if(!strcmp(varvalue,"ftp"))
                log_facility=LOG_FTP;

En Solaris 10, los niveles de log <LOG_AUTHPRIV> y <LOG_FTP> no están definidos, y por lo tanto, la compilación falla con el siguiente error:

nrpe.c: In function `get_log_facility':
nrpe.c:618: error: `LOG_AUTHPRIV' undeclared (first use in this function)
nrpe.c:618: error: (Each undeclared identifier is reported only once
nrpe.c:618: error: for each function it appears in.)
nrpe.c:620: error: `LOG_FTP' undeclared (first use in this function)
make[1]: *** [nrpe] Error 1
Para solucionarlo, tenemos dos opciones: Eliminar esos niveles de log o Sustituirlos por uno definido. En nuestro ejemplo, vamos a sustituirlos por <LOG_AUTH> en ambos casos, así:

        else if(!strcmp(varvalue,"authpriv"))
                log_facility=LOG_AUTH;
        else if(!strcmp(varvalue,"ftp"))
                log_facility=LOG_AUTH;
Una vez explicado el problema -y con la solución- vamos a proceder a instalar el plugin -podemos utilizar una máquina de pruebas para realizar la compilación, ya que luego copiaremos los archivos necesarios a los hosts que queramos monitorizar-
$ wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.12.tar.gz
$ gtar zxpf nrpe-2.12.tar.gz
$ cd nrpe-2.12
$ cat src/nrpe.c |sed s/LOG_AUTHPRIV/LOG_AUTH/g > src/nrpe.c.1
$ mv src/nrpe.c.1 src/nrpe.c
$ cat src/nrpe.c |sed s/LOG_FTP/LOG_AUTH/g > src/nrpe.c.1
$ mv src/nrpe.c.1 src/nrpe.c
$ ./configure --prefix=/opt/nagios/nrpe --with-nrpe-user=svcmon --with-nrpe-group=svcmon --with-ssl=/usr/sfw --with-ssl-lib=/usr/sfw/lib --with-ssl-inc=/usr/sfw/include --with-log-facility=local7 --with-nagios-user=svcmon --with-nagios-group=svcmon

*** Configuration summary for nrpe 2.12 03-10-2008 ***:

 General Options:
 -------------------------
 NRPE port:    5666
 NRPE user:    svcmon
 NRPE group:   svcmon
 Nagios user:  svcmon
 Nagios group: svcmon


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

$ make

Si todo ha sido correcto, procederemos a la instalación con los siguientes comandos -recordar que si no tenemos permisos de escritura en el directorio <--prefix> deberemos ejecutarlo como <root>-

# make install-plugin
cd ./src/ && make install-plugin
make[1]: Entering directory `/export/home/itily/NRP/plugin/nrpe-2.12/src'
/usr/local/bin/install -c -m 775 -o svcmon -g svcmon -d /opt/nagios/nrpe/libexec
/usr/local/bin/install -c -m 775 -o svcmon -g svcmon check_nrpe /opt/nagios/nrpe/libexec
make[1]: Leaving directory `/export/home/itily/NRP/plugin/nrpe-2.12/src'

# make install-daemon
cd ./src/ && make install-daemon
make[1]: Entering directory `/export/home/itily/NRP/plugin/nrpe-2.12/src'
/usr/local/bin/install -c -m 775 -o svcmon -g svcmon -d /opt/nagios/nrpe/bin
/usr/local/bin/install -c -m 775 -o svcmon -g svcmon nrpe /opt/nagios/nrpe/bin
make[1]: Leaving directory `/export/home/itily/NRP/plugin/nrpe-2.12/src'

# make install-daemon-config
/usr/local/bin/install -c -m 775 -o svcmon -g svcmon -d /opt/nagios/nrpe/etc
/usr/local/bin/install -c -m 644 -o svcmon -g svcmon sample-config/nrpe.cfg /opt/nagios/nrpe/etc
Configuración de SysLog
En el proceso de <configure> hemos declarado nuestro nivel de log en <local7> y por lo tanto, debemos declararlo en nuestra configuración de syslog
# vi /etc/syslog.conf
   # Nagios PlugIn Log
   local7.debug                                    /var/log/nrpe.log
 :wq

# touch /var/log/nrpe.log
# chmod 600 /var/log/nrpe.log
# svcadm restart system-log
Prueba de Funcionamiento Correcto
Ahora vamos a comprobar que todo funciona correctamente, para ello, vamos a ejecutar el daemon y vamos a hacer un par de checks, recordar que nuestro puerto es el 5666 y que no queremos ejecutarlo a través de xinetd por eso utilizamos la opción <-d>
# /opt/nagios/nrpe/bin/nrpe -c /opt/nagios/nrpe/etc/nrpe.cfg -d
# netstat -an|grep 5666
      *.5666               *.*                0      0 49152      0 LISTEN
# /opt/nagios/nrpe/libexec/check_nrpe -H localhost
NRPE v2.12
# tail /var/log/nrpe.log
Apr  5 12:29:01 zion nrpe[2457]: [ID 601491 local7.notice] Starting up daemon
Apr  5 12:29:01 zion nrpe[2457]: [ID 624405 local7.info] Listening for connections on port 5666
Apr  5 12:29:01 zion nrpe[2457]: [ID 907248 local7.info] Allowing connections from: 127.0.0.1
Si todo ha salido correctamente -no veo por qué no- ya podemos configurar correctamente nuestro plugin para ello, deberemos editar el archivo de configuración <$NRPE_HOME/etc/nrpe.cfg> e incluir la dirección IP del host que autorizamos a realizar peticiones -en nuestro caso nagios-server- y los checks que queremos publicar.

Para autorizar un host a que haga peticiones a nuestro plugin deberemos incluirlo en la propiedad <allowed_hosts> -debemos tener en cuenta, si queremos varios deben estar separados por comas-

# vi /opt/nagios/nrpe/etc/nrpe.cfg
   allowed_hosts=127.0.0.1,192.168.1.200
:wq

Ahora vamos a declarar los checks que permitimos ejecutar, para ello deberemos editar las entradas de command añadiendo una por check que queramos exportar. El formato de la propiedad command tiene la siguiente estructura:
command[<command_name>]=<command_line>
Además, incluiremos los scripts <check_> en el directorio $NRPE_HOME/libexec, así que nosotros vamos a incluir el script de verificación de Solaris 10 SMF que utilizábamos en la primera parte

# cd $NRPE_HOME/libexec/
# wget http://blog.sfchildren.com/blogger/solaris-smf-nagios/check_svc

Tener en cuenta los permisos, ya que el usuario noprivilegiado con el que ejecutamos el servicio debe ser capáz de ejecutarlos pero no queremos que pueda tocar más estructura de nuestra instalación, así que ponemos los siguientes permisos:
# chown svcmon:svcmon check_*
# ls -ltr
total 138
-r-xr-xr-x   1 svcmon   svcmon     54512 abr  5 12:20 check_nrpe
-r-xr-xr-x   1 svcmon   svcmon      1190 abr  5 15:07 check_svc
-r-xr-xr-x   1 svcmon   svcmon     12706 abr  5 15:16 check_solaris_smf
# chmod 500 check_*
# ls -la
total 142
drwxr-xr-x   2 root     root         512 abr  5 15:16 .
drwxr-xr-x   6 root     root         512 abr  5 15:19 ..

-r-x------   1 svcmon   svcmon     54512 abr  5 12:20 check_nrpe
-r-x------   1 svcmon   svcmon     12706 abr  5 15:16 check_solaris_smf
-r-x------   1 svcmon   svcmon      1190 abr  5 15:07 check_svc

Ahora, si queremos exportar el check para verificar nuestro Tomcat sobre SMF, podemos utilizar la siguiente definición:
command[check_tomcat6]=/opt/nagios/nrpe/libexec/check_svc tomcat_6:default_64bits
Por lo tanto, nuestro archivo de configuración tendrá una configuración similar a esta
allowed_hosts=127.0.0.1,192.168.1.200
command_timeout=60
command[check_tomcat6]=/opt/nagios/nrpe/libexec/check_svc tomcat_6:default_64bits
connection_timeout=300
debug=0
dont_blame_nrpe=0
log_facility=local7
nrpe_group=svcmon
nrpe_user=svcmon
pid_file=/var/run/nrpe.pid
server_port=5666

Instalación de NRPE Mediante SMF
Como es habitual, utilizaremos el framework SMF para poder gestionar el servicio, para ello, deberemos descargarnos el Descriptor SMF para NRPE y el Method de Solaris SMF para NRPE e instalarlos, vamos a verlo.

Recordar que este artículo es la tercera parte y por lo tanto, asumo que el usuario, grupo y project están ya creados como indicábamos en la Parte 2 de Monitorización de Solaris con Nagios. Además, puede que debamos incrementar el valor de <task.max-lwps>
# cd /var/svc/manifest/application/management
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/solaris-smf-nagios/nrpe/nrpe_2.xml
# chown root:sys nrpe_2.xml
# chmod 444 nrpe_2.xml
# svccfg
svc:> validate nrpe_2.xml
svc:> import nrpe_2.xml
svc:> quit
# cd /lib/svc/method
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/solaris-smf-nagios/nrpe/nrpe2
# chown root:bin nrpe2
# chmod 755 nrpe2 
Activamos el servicio con <svcadm> -tenemos dos, uno con SSL activado y otro SIN SSL-, en nuestro caso, vamos a utilizar SSL_Enabled
# svcs nrpe_2
STATE          STIME    FMRI
disabled       16:08:25 svc:/application/management/nrpe_2:ssl_disabled
disabled       16:08:27 svc:/application/management/nrpe_2:ssl_enabled
# svcadm enable nrpe_2:ssl_enabled
# svcs -p nrpe_2
STATE          STIME    FMRI
disabled       16:08:25 svc:/application/management/nrpe_2:ssl_disabled
online         16:11:00 svc:/application/management/nrpe_2:ssl_enabled
               16:11:00    20279 nrpe
Finalización Instalación
Ya hemos acabado con la Instalación de NRPE Sobre Solaris 10! Como veis, no ha sido tan complicada, no?



Conclusión Final
Durante estos capítulos hemos visto diferentes formas de monitorizar los servicios de Solaris 10 utilizando Nagios. Sobre cuál es la forma correcta? Bueno, la verdad es que depende de qué quieras hacer y sobre todo qué impacto de rendimiento sufre.

El uso de comandos a través de SSH hace que -al menos en teoria- se puedan controlar más los accesos y, sobre todo no expones un nuevo puerto, sin embargo, esto supone una carga muy elevada en la máquina.

Si nos decantamos por el uso de NRPE podemos ver cómo la carga se disminuye pero debemos tener mucho cuidado con los accesos y controlar -mediante IPFilter- quién puede acceder y qué puede hacer. Ademas, qué pasa si el daemon se cae? Para evitar eso, tenemos nuestro NRPE dentro de SMF, al menos, sabemos que Solaris lo gestionará de forma "automática" y nos da mayor garantia de funcionamiento. Si a eso le unimos poder checkear por SSH el demonio, ya tenemos nuestro sistema "blindado"



Referencias

viernes, 2 de abril de 2010

Monitorizar Servicios Solaris 10 Nagios - Parte 2

Introducción
En la primera parte de Monitorización de Servicios SMF de Solaris 10, vimos cómo podemos utilizar algunos scipts para ver el estado de nuestros servicios bajo Solaris SMF. En esta ocasión, vamos a ver cómo configurar nuestro Nagios para que remotamente acceda a la información y nos muestres las alertas que nosotros configuremos.

Antes de comenzar, vamos a explicar la arquitectura y, de esta forma, hacer más claro el proceso. En primer lugar tenemos una máquina donde se está ejecutando nuestro servicio Nagios <nagios-server> y, por otro lado tenemos una máquina <zion> en la cual está instalado Tomcat6 como Servicio SMF en Solaris 10.

Lo primero que vamos a hacer es crear el usuario <svcmon> en la máquina que queremos monitorizar -zion-, y vamos a generar sus claves ssh para permitir el acceso sin contraseña. Así mismo, vamos a limitar el número de procesos que puede crear el usuario y pondremos una password aleatoria -ya que sólo nos conectaremos con la máquina de Nagios a través de SSH-
root@zion # groupadd svcmon
root@zion # useradd -s /bin/bash -g svcmon -d /export/home/svcmon -m svcmon
64 blocks
root@zion # passwd svcmon
Nueva contraseña:
Vuelva a escribir la nueva contraseña:
passwd: la contraseña se ha cambiado para svcmon satisfactoriamente
root@zion # projadd -c 'Solaris SMF Monitor' user.svcmon
root@zion # projmod -sK 'task.max-lwps=(priv,10,deny)' user.svcmon
root@zion # su - svcmon
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
svcmon@zion:~ > mkdir scripts
svcmon@zion:~ > cd scripts/
svcmon@zion:~/scripts > /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/solaris-smf-nagios/check_svc
svcmon@zion:~/scripts > chmod +x check_svc
svcmon@zion:~/scripts > ./check_svc
USAGE: ./check_svc
svcmon@zion:~/scripts > ./check_svc tomcat_6:default_64bits
OK tomcat_6:default_64bits is online

svcmon@zion:~/scripts > cd
svcmon@zion:~ > ssh-keygen -t rsa -C 'Solaris SVC Monitor User' -b 2048
Generando pareja de claves pública/privada rsa.
Escriba el archivo en el que se debe guardar la clave (/export/home/svcmon/.ssh/id_rsa):
Escriba una frase de contraseña (si está vacío se interpreta que no hay ninguna frase de contraseña):
Escriba la misma frase de contraseña de nuevo:
Se ha guardado su identificación en /export/home/svcmon/.ssh/id_rsa.
Se ha guardado su clave pública en /export/home/svcmon/.ssh/id_rsa.pub.
La huella de la clave es:
32:ef:25:68:8f:47:8a:88:18:35:63:43:02:ed:e4:c4 Solaris SVC Monitor User
Ahora en nuestra máquina Nagios vamos a generar las claves RSA de SSH para que podamos conectarnos sin utilizar la contraseña. Para ello, debemos logearnos con el usuario que está corriendo el nagios <NagiosUser> y ejecutar <ssh-keygen>. En nuestro ejemplo, el usuario es <nagios>
nagios@nagios-server:~> ssh-keygen -t rsa -b 2048 -C 'Nagios User'
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nagios/.ssh/id_rsa):
Created directory '/home/nagios/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/nagios/.ssh/id_rsa.
Your public key has been saved in /home/nagios/.ssh/id_rsa.pub.
The key fingerprint is:
5d:c1:d5:49:c2:a5:28:c0:d4:22:82:61:a5:c8:d0:9f Nagios User

Ahora que ya tenemos generadas las claves ssh, vamos a copiar el contenido del archivo $HOME/.ssh/id_rsa.pub -es decir la clave pública- al host que queremos permitir el acceso sin contraseña -en nuestro caso Zion- y copiarla en el archivo $HOME/.ssh/authorized_keys, vamos a verlo

En el servidor Nagios
nagios@nagios-server:~> cat .ssh/id_rsa.pub
ssh-rsa ... bi7MMuhhNmQAgIyP9lWFS14UzKOgtIw== Nagios User

En el host a monitorizar
svcmon@zion:~ > cd ~/.ssh/
svcmon@zion:~/.ssh > vi authorized_keys
   ssh-rsa ... bi7MMuhhNmQAgIyP9lWFS14UzKOgtIw== Nagios User


:wq
Y comprobamos que podemos acceder sin password desde <nagios-server> a <zion>
nagios@nagios-server:~> ssh svcmon@zion
The authenticity of host '10.55.21.31 (10.55.21.31)' can't be established.
RSA key fingerprint is 93:18:d8:86:6b:56:d1:90:bc:5b:f7:1c:73:72:df:b7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.55.21.31' (RSA) to the list of known hosts.
Last login: Wed Mar 31 12:02:00 2010 from logos
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
svcmon@zion $ exit
logout
Connection to 10.55.21.31 closed.
Instalación del PlugIn en Nagios
Ahora que ya tenemos preparada nuestra estructura de usuarios, vamos dar de alta el servicio en nuestro servidor nagios. Para ello, he creado una versión modificada que nos permite hacer un check remotamente de un servicio SMF de Solaris 10 y la deberemos copiar en <$NAGIOS_HOME/libexec>. Su funcionamiento es el siguiente
check_svc_remote <service_name> <hostname> [username]

Para ello, descargamos el archivo con <wget> y, si por algún motivo el script <check_svc> de la máquina a monitorizar, no se encuentra en <HOME/scripts/check_svc>  deberemos editar la variable <REMOTE_SVC>
nagios@nagios-server:/usr/local/nagios/libexec> wget http://blog.sfchildren.com/blogger/solaris-smf-nagios/check_svc_remote

nagios@nagios-server:/usr/local/nagios/libexec> ./check_svc_remote
Usage: ./check_svc_remote {service_name} {hostname} [username]

        For example to test NTP Service try

                $ ./check_svc_remote svc:/network/ntp:default test.sfchildren.com
                CRITICAL svc:/network/ntp:default is disabled

        If you want, you can send SSH Banner (FD 2) to /dev/null, i.e.

                $ ./check_svc_remote svc:/network/ntp:default test.sfchildren.com 2>/dev/null
                CRITICAL svc:/network/ntp:default is disabled

        For more documentation, please go to
                http://sparcki.blogspot.com/2010/03/monitorizar-servicios-solaris-10-nagios.html

nagios@nagios-server:/usr/local/nagios/libexec> ./check_svc_remote ntp zion
OK ntp is online
nagios@nagios-server:/usr/local/nagios/libexec> ./check_svc_remote ntp logos
CRITICAL ntp is disabled
Conclusión
Aunque es un proceso un poco tedioso -sobre todo cuando instalamos por primera vez la máquina- luego resulta de gran utilidad. Esta versión es un ejemplo de lo que podemos conseguir con nagios ya que, podemos ampliar las funcionalidades, por ejemplo, si el servicio está en OFFLINE podemos decirle a nagios que haga un restart del servicio -para ello, debemos darle permisos mediante un rol al usuario <svcmon>-

También, no hemos hablado sobre cómo se debe configurar nagios ya que para eso tengo en la recámara Cómo crear un sistema de monitorización con Solaris 10, ... pero hasta entonces ... toca esperar.



Referencias