systemadmin.es > Monitorización > moDRACfucker – check usuario y contraseña de DRAC/iLO para Nagios

moDRACfucker – check usuario y contraseña de DRAC/iLO para Nagios

El acceso por DRAC no suele ser útil excepto en caso de problemas, por lo que deberemos garantizar que tenemos el usuario y contraseña correctos y por otro lado, por seguridad, evitar tener la contraseña por defecto. Por esto me hecho un pequeño programa llamado moDRACfucker con el que podemos verificar que un determinado ssh (la DRAC) acepte un cierto usuario/contraseña y si falla comprobar que no tenga el por defecto.

Ficho programa usa la librería libssh, por lo que primero deberemos instalarla:

cd /usr/local/src/
wget http://www.libssh.org/files/0.5/libssh-0.5.2.tar.gz
tar xzf libssh-0.5.2.tar.gz 
cd libssh-0.5.2
mkdir build
cd build/
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
make
make install

A continuación bajamos el código del programa y lo compilamos:

cd /usr/local/src
wget systemadmin.es/wp-content/uploads/moDRACfucker-0.0.1.tgz
cd moDRACfucker-0.0.1
make

Generará un binario llamado modracfucker al que deberemos indicarle los datos del host a conectar:

$ ./modracfucker 
missing operand
 ./modracfucker <host> <port> <user> <password> [defaultpassword]

Si no indicamos contraseña por defecto, asume “calvin“. Podemos comprobar que el script da:

  • OK: Si la contraseña que indicamos funciona correctamente
  • WARNING: Si se puede acceder con la contraseña por defecto
  • CRITICIAL: Si no se puede conectar o los datos son incorrectos de tanto la contraseña que debe ser como la por defecto

Podemos ver unos ejemplos:

$ ./modracfucker 1.2.3.4 22 root passwordbueno
OK - DRAC 1.2.3.4
$ ./modracfucker 1.2.3.4 22 root passwordfail
WARNING - DRAC 1.2.3.4 with default password(calvin)
$ ./modracfucker 1.2.3.4 23 root badport
CRITICAL - DRAC 1.2.3.4: Error connecting to localhost: Remote host closed connection

Para añadirlo como plugin de nagios, simplemente deberemos añadirlo con el resto de checks:

cp modracfucker /usr/local/libexec

Definir el comando check_drac con los datos:

define command{
        command_name    check_drac
        command_line    $USER1$/modracfucker $ARG1$ 22 root passwordquesea
}

Y definir el servicio para el host:

define service{
        use                             local-service
        host_name                       systemadmin
        service_description             DRAC
        check_command                   check_drac!1.2.3.4
}

Por otro lado, se trata de un buen ejemplo de “Hello World” para libssh:

#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>

#define BUFFERRSIZE 256

#define NAGIOSOK 0
#define NAGIOSWARNING 1
#define NAGIOSCRITICAL 2
#define NAGIOSUNKNOWN 3

int checkSSH(char *host, int port, char *user, char *password, char* error, int errorsize)
{
        int rc;
        ssh_session my_ssh_session = ssh_new();

        if (my_ssh_session == NULL)
                return 1;

        ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, host);
        rc = ssh_connect(my_ssh_session);
        if (rc != SSH_OK)
        {
                snprintf(error, errorsize, "Error connecting to localhost: %s\n",
                ssh_get_error(my_ssh_session));
                return 2;
        }

        rc = ssh_userauth_password(my_ssh_session, user, password);
        if (rc != SSH_AUTH_SUCCESS)
        {
                snprintf(error, errorsize, "Error authenticating with password: %s\n",
                ssh_get_error(my_ssh_session));
                ssh_disconnect(my_ssh_session);
                ssh_free(my_ssh_session);
                return 3;
        }

        ssh_disconnect(my_ssh_session);
        ssh_free(my_ssh_session);
	return 0;
}


int main(int argc, char* argv[])
{
	char error_password[BUFFERRSIZE];
	char error_default_password[BUFFERRSIZE];
	
	char *host;
	int port;
	char *user;
	char *password;
	char *password_default="calvin";

	if((argc<5)||(argc>6))
	{
		printf("missing operand\n %s <host> <port> <user> <password> [defaultpassword]\n",argv[0]);	
		exit(NAGIOSUNKNOWN);
	}
	
	host=argv[1];
	port=atoi(argv[2]);
	if(port==0) port=22;
	user=argv[3];
	password=argv[4];
	
	if(argc==6)
		password_default=argv[5];
	
	if(checkSSH(host,port,user,password,error_password,BUFFERRSIZE)==0)
	{
		printf("OK - DRAC %s\n",argv[1]);
		exit(NAGIOSOK);
	}
	else if(checkSSH(host,port,user,password_default,error_default_password,BUFFERRSIZE)==0)
	{
		printf("WARNING - DRAC %s with default password(%s)\n",host,password_default);
		exit(NAGIOSWARNING);	
	}
		
	printf("CRITICAL - DRAC %s: %s\n",host,error_default_password);
	exit(NAGIOSCRITICAL);	
}

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>