systemadmin.es > Utilidades > Usar NRPE en foreground mediante LD_PRELOAD

Usar NRPE en foreground mediante LD_PRELOAD

Anteriormente vimos como usar LD_PRELOAD para capturar y substituir llamadas al sistema, como por ejemplo fork. Uno de los inconvenientes de usar este método es que si el programa que usa el LD_PRELOAD hace un execve el programa que ejecuta también se ve afectado por el LD_PRELOAD.

Un ejemplo de programa que realizar execve que provoca que fallen los binarios que ejecuta es el NRPE (agente de Nagios)

En el caso que el NRPE ejecute un binario no resulta problemático, pero si ejecuta un script ya no se realizará correctamente. Esto pasa porque la shell cargará el LD_PRELOAD, por lo que realizará el primer fork bien (primer comando externo del script), pero el resto no.

ps auxf - nrpe con daemontools

ps auxf - nrpe con daemontools

Para evitar esto lo que podemos hacer para ejecutar NRPE con daemontools es cambiar el directorio a donde tengamos instalado el forkfaker para luego realizar el exec con el LD_PRELOAD a una ruta relativa:

#!/bin/bash
cd /usr/local/lib
LD_PRELOAD="./forkfaker.so" exec /usr/local/nagios/bin/nrpe -c /usr/local/nagios/conf/nrpe.conf -d

Esto lo que permite que cuando se haga el execve el NRPE lo haga desde otro directorio, por lo que no va a encontrar el forkfaker.so y por lo tanto no va a tener efecto tal variable.

El código del forkfaker es el siguiente:

#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>

static int count=0;

pid_t fork(void)
{
        if (count < 1)
        {
                ++count;
                return 0;
        }
        return syscall(SYS_fork);
}

Y se puede compilar con:

gcc -Wall -fPIC -shared -o forkfaker.so forkfaker.c

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>