Ir al contenido principal

La arquitectura OpenVOS hace uso de varios sistemas independientes; el NIO para la comunicación X25, los controladores de matriz de discos de canal de fibra, el UPS para la energía, el servidor de consola de Internet RSN para RSN sobre IP y los conmutadores de mantenimiento de la red Ethernet que permiten que todos estos sistemas se comuniquen a través de una red privada Ethernet/IP. Estos sistemas son monitoreados por varios procesos OpenVOS para asegurarse de que están funcionando correctamente. Pero algunos eventos como los inicios de sesión de los usuarios no son monitoreados. La consola RSN y los conmutadores de red tienen la opción de enviar un mensaje a un servidor de registro cada vez que alguien se conecta o intenta conectarse. Dado que los conmutadores de red sólo están conectados al módulo Stratus , tiene sentido que un servidor de registro se ejecute en el módulo Stratus . Para ello he creado un servidor de registro muy simple, que simplemente escribe el mensaje que recibe junto con un sello de fecha y hora y la dirección IP del host que envió el mensaje a la salida estándar. Al ejecutar el servidor como un proceso iniciado, los mensajes pueden ser guardados en el archivo de salida del proceso.

Ejemplos de los conmutadores de la red
Es posible que alguien que estaba autorizado sólo tuviera problemas para escribir la contraseña de root cuando se conectaba al conmutador de la red como root, pero también es posible que sea muy bueno para adivinar las contraseñas.


2011-10-02 11:55:39 : 10.10.1.75 : >%AAA-W-RECHAZO: Nueva conexión de telnet para su uso
+r raíz, fuente 10.10.1.1 destino 10.10.1.75 RECHAZADO

2011-10-02 11:56:03 : 10.10.1.75 : >%AAA-W-RECHAZO: Nueva conexión de telnet para su uso
+r raíz, fuente 10.10.1.1 destino 10.10.1.75 RECHAZADO

2011-10-02 11:56:08 : 10.10.1.75 : >%AAA-I-CONECTAR: Sesión de CLI de usuario para el usuario ro
+ot sobre telnet , fuente 10.10.1.1 destino 10.10.1.75 ACEPTADO

Aquí hay alguien adivinando los ID de usuario del administrador del sistema


2011-10-02 12:03:13 : 10.10.1.75 : >%AAA-W-RECHAZO: Nueva conexión de telnet para su uso
+r admin, fuente 10.10.1.1 destino 10.10.1.75 RECHAZADO

2011-10-02 12:03:30 : 10.10.1.75 : >%AAA-W-RECHAZO: Nueva conexión de telnet para su uso
+r sysadmin, fuente 10.10.1.1 destino 10.10.1.75 RECHAZADO

2011-10-02 12:04:39 : 10.10.1.75 : >%AAA-W-RECHAZO: Nueva conexión de telnet para su uso
+r Administrador, fuente 10.10.1.1 destino 10.10.1.75 RECHAZADO

Además de los inicios de sesión de los usuarios, los conmutadores de la red informarán cuando la configuración haya sido cambiada.


2011-10-02 15:16:29 : 10.10.1.75 : >%COPY-I-FILECPY: Copia de archivos - ejecución de la URL de la fuente
+ning-config destino URL flash://startup-config

2011-10-02 15:16:43 : 10.10.1.75 : >%COPY-N-TRAP: La operación de copia fue completada
+ed con éxito

Y también informará de los mensajes de enlace arriba y abajo que pueden ser muy útiles para solucionar problemas de comunicación.


2011-10-02 15:49:17 : 10.10.1.75 : >%LINK-W-Down: 2/e24

2011-10-02 15:49:20 : 10.10.1.75 : >%LINK-I-Up:  2/e24
  Ejemplos del servidor de la consola de Internet RSN
Alguien del módulo se conectó a la consola RSN y se registró como root, después de escribir la contraseña incorrectamente dos veces.


2011-10-02 12:11:03 : 10.10.1.200 : in.telnetd[2942]: conectar desde 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:11:03 : 10.10.1.200 : telnetd[2942]: doit: getaddrinfo: Temporal
+fallo en la resolución del nombre
2011-10-02 12:11:07 : 10.10.1.200 : login[2943]: contraseña inválida para 'root' en
+`ttyp0' de `10.10.1.1'.
2011-10-02 12:11:15 : 10.10.1.200 : login[2943]: contraseña inválida para "root" en
+`ttyp0' de `10.10.1.1'.
2011-10-02 12:11:35 : 10.10.1.200 : login[2945]: login de root en `ttyp0' desde `10
+.10.1.1'

Tenga en cuenta que la consola RSN informará un ID de usuario de DESCONOCIDO si se hace un intento con un ID de usuario inválido.


2011-10-02 12:12:31 : 10.10.1.200 : in.telnetd[2946]: conectar desde 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:12:32 : 10.10.1.200 : telnetd[2946]: doit: getaddrinfo: Temporal
+fallo en la resolución del nombre
2011-10-02 12:12:37 : 10.10.1.200 : login[2947]: contraseña inválida para "DESCONOCIDO
+en "ttyp0" de "10.10.1.1
2011-10-02 12:12:45 : 10.10.1.200 : login[2947]: contraseña inválida para "DESCONOCIDO
+en "ttyp0" de "10.10.1.1
2011-10-02 12:12:54 : 10.10.1.200 : login[2947]: contraseña inválida para "DESCONOCIDO
+en "ttyp0" de "10.10.1.1

La consola de RSN no informará cuando el ID de usuario válido rsn_admin se utilice para iniciar sesión. Sin embargo, seguirá viendo la conexión. El ID de usuario rsn_admin no tiene acceso para cambiar ninguno de los archivos de configuración del sistema. Si el usuario rsn_admin intenta cambiar a root con el comando su, se registrará.


2011-10-02 12:15:37 : 10.10.1.200 : in.telnetd[2957]: conectar desde 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:15:38 : 10.10.1.200 : telnetd[2957]: doit: getaddrinfo: Temporal
+fallo en la resolución del nombre
2011-10-02 12:15:54 : 10.10.1.200 : su[2959]: + ttyp0 rsn_admin-root
2011-10-02 12:15:54 : 10.10.1.200 : PAM_unix[2959]: (su) sesión abierta para el usuario
+ raíz por rsn_admin(uid=500)

Al igual que los intentos que fracasan.


2011-10-02 12:19:50 : 10.10.1.200 : PAM_unix[2972]: fallo de autenticación; rsn_
+admin(uid=500) -> root for su service
2011-10-02 12:19:52 : 10.10.1.200 : su[2972]: pam_authenticate: Autenticación f
+ailure
2011-10-02 12:19:52 : 10.10.1.200 : su[2972]: - ttyp0 rsn_admin-root

 

Para configurar el conmutador de red para que envíe mensajes de registro al módulo OpenVOS, debe iniciar sesión en el conmutador como root, ejecutar el comando de registro y luego guardar la nueva configuración:

telnet 10.10.1.75          
Intentando...
Conectado al 10.10.1.75.
El carácter de escape es '^]'.

Nombre de usuario:root
Contraseña:******

consola# config
console(config)# logging 10.10.1.1
console(config)#

consola# copiar ejecutar-config inicio-config

 

Para configurar la consola RSN para enviar mensajes de registro al módulo OpenVOS es necesario iniciar sesión en la consola como root e iniciar el proceso syslogd con el comando "syslogd -R 10.10.1.1:514". Para asegurarse de que el proceso syslogd se inicia después de un reinicio, se debe cambiar el archivo /etc/tc.d/rc.local.

telnet 10.10.1.200
Trying...
Connected to 10.10.1.200.
Escape character is '^]'.

Moxa Embedded Linux, Professional Edition
Linux/armv5teb 2.4.18_mvl30-ixdp425

azvos login: root
Password:
Welcome to

    ___  _____  __        _______    _____                   __
   / _ / __/ |/ / ____  /  _/ _   / ___/__  ___  ___ ___  / /__
  / , _/ /    / /___/ _/ // ___/ / /__/ _ / _ (_-</ _ / / -_)
 /_/|_/___/_/|_/       /___/_/     ___/___/_//_/___/___/_/__/ 

 Authorized Users Only!

root@azvos:~# syslogd -R 10.10.1.1:514
root@azvos:~# 
root@azvos:~# 
root@azvos:~# 
root@azvos:~# cd /etc/rc.d
root@azvos:/etc/rc.d# cp rc.local rc.local.bak
root@azvos:/etc/rc.d# echo syslogd -R 10.10.1.1:514 >> rc.local
root@azvos:/etc/rc.d# tail rc.local
fi
/etc/init.d/ssh start
/etc/init.d/apache stop
/etc/init.d/portmap stop
rm -f /rsn/call.log
/rsn/callhome &
lcmmessage -c -m "   Welcome to   " -l
lcmmessage -m " RSN-IP Console " -l
cat /etc/motd
syslogd -R 10.10.1.1:514
root@azvos:/etc/rc.d#

 

Suponiendo que se obtiene la misma salida que la mostrada anteriormente, se puede borrar el archivo rc.local.bak con "rm rc.local.bak".

Una vez que el registro ha sido configurado en los dispositivos, necesitas ejecutar el programa de registro en el módulo Stratus . Sugiero iniciar el programa con la siguiente macro de comando. El archivo de registro se llamará logd.(fecha).(hora).out. Si por alguna razón un archivo ya existe con ese nombre, será renombrado a logd.(fecha).(hora).old.out. Si ya existe un archivo con el sufijo .old.out se borrará. Dado que la marca de tiempo es al segundo, esto es poco probable. El archivo de salida tiene un bloqueo implícito para que el archivo pueda ser leído en cualquier momento. Tenga en cuenta que el archivo de salida crecerá para siempre, por lo que será necesario algún tipo de mantenimiento por su parte o puede modificar el programa para que sea más inteligente en el manejo de la salida.



y start_logd.cm comienza aquí
&
& Versión 1.00 11-11-02
& [email protected]
&
Este guión crea un archivo de registro, establece un bloqueo implícito e inicia el registro
y proceso. El proceso no terminará normalmente y el archivo de registro tiene el
y el potencial para crecer muy grande.
&
&
Este software se proporciona "TAL CUAL", SIN NINGUNA GARANTÍA O
Y CUALQUIER APOYO DE CUALQUIER TIPO. El AUTOR ESPECIALMENTE RENUNCIA A CUALQUIER IMPLICACIÓN
Y GARANTÍAS DE COMERCIABILIDAD O IDONEIDAD PARA CUALQUIER PROPÓSITO EN PARTICULAR.
Este descargo de responsabilidad se aplica, a pesar de cualquier representación verbal de cualquier
...y la clase proporcionada por el autor o cualquier otra persona.
&
&set DT (fecha).(hora)
Si (existe logd.&DT&.out)
Entonces, renombra el registro de entrada y salida, borra el registro de salida y salida.
!crear_fichero logd.&DT&.out
!set_implicit_locking logd.&DT&.out
start_process logd -output_path logd.&DT&.out -privileged -process_name logd
&
y start_logd.cm termina aquí

 

Al final, el programa es el que está aquí.



/* logd.c starts here

   Version 1.00 11-11-02
   [email protected]

   This software is provided on an "AS IS" basis, WITHOUT ANY WARRANTY OR
   ANY SUPPORT OF ANY KIND. The AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE.
   This disclaimer applies, despite any verbal representations of any
   kind provided by the author or anyone else.
*/

#define _POSIX_SOURCE

#include <sys/select.h>
#include <prototypes/inet_proto.h>
#include <stdlib.h>
#include <string.h>
#include <c_utilities.h>
#include <errno.h>
#include <time.h>

#define BUFFERLEN 10000
#define bzero(s, len)             memset((char *)(s), 0, len)

int errno;

getCurrentDateTime (char * szDT)
{
time_t tTime;
struct tm *tmLT;

tTime = time ((time_t *) 0);
tmLT = localtime (&tTime);

sprintf (szDT, "%4ld-%02ld-%02ld %02ld:%02ld:%02ld",
          tmLT -> tm_year+1900,
          tmLT -> tm_mon,
          tmLT -> tm_mday,
          tmLT -> tm_hour,
          tmLT -> tm_min,
          tmLT -> tm_sec);
}

main (argc, argv)
int    argc;
char   *argv [];

{
 struct sockaddr_in serv_addr;
 struct sockaddr_in cli_addr;
 int clilen = sizeof (cli_addr);

 int zeroCount = 0;
 int socks0;
 int recvBytes;

 char szSender [16];
 char  szDateTime [32];
 char szMessage [BUFFERLEN];
 short portNumber;

 if (argc == 1)  /* no arguments - use the default of 514 */
    {
    portNumber = 514;
    }
 else
 if (argc == 2) /* one argument, must be the expected port number */
    {
    portNumber = atoi (argv [1]);
    if (portNumber == 0)
       {
       printf ("nn%s argument was not the expected port number", argv [1]);
       printf ("nUsage: logd [port number, default = 514]n");
       exit (-1);
       }
    }
 else /* more than one argument gets a usage message */
    {
    printf ("nnToo many arguments");
    printf ("nUsage: logd [port number, default = 514]n");
    exit (-1);
    }

/* Leting you know what argument values will actually be used */

 printf ("logd %dnn", portNumber);

 if ((socks0 = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
    {
    perror ("logd: can't create dgram socket");
    exit (errno);
    }

/* build a sockaddr structure holding the address we will bind to. The IP
   address is INADDR_ANY meaning we will listen on all active IP addresses */

 bzero ( (char *) &serv_addr, sizeof (serv_addr));
 serv_addr.sin_family        = AF_INET;
 serv_addr.sin_addr.s_addr   = htonl (INADDR_ANY);
 serv_addr.sin_port          = htons (portNumber);

/* now bind to the address and port */

 if (bind (socks0, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0)
    {
    perror ("logd: can't bind local address");
    exit (errno);
    }

/* main loop just does a recv, blocking until something is available to read.
   Assuming we receive at least 1 byte we get the current date-time,
   convert the senders IP address to a printable string and print the
   date-time, address and message starting at the 5th character position.
   The first four characters of a syslog message are <NN> where NN is a
   severity and facility code. These can be used for message filtering. Since
   this program doesn't do any filtering I just skip them. */
 while (1)
   {
    recvBytes=recvfrom(socks0,szMessage, BUFFERLEN, 0,
          (struct sockaddr *) &cli_addr, &clilen);
    if (recvBytes > 0)
       {
       getCurrentDateTime ((char *) &szDateTime);
       strcpy (szSender, inet_ntoa ((struct in_addr) cli_addr.sin_addr));
       szMessage [recvBytes] = 0;
       printf ("%s : %s : %sn", szDateTime, szSender, &szMessage[4]);
       zeroCount = 0;
       }
    else
    if (recvBytes < 0) /* in the event of an error report it and exit */
       {
       getCurrentDateTime ((char *) &szDateTime);
       printf ("%s : Error %d returned - exitingn", szDateTime, errno);
       exit (errno);
       }
    else  /* I can't think of any reason we would be getting null messages */
       {  /* but if we get a stream of them we would silently loop. This */
       zeroCount++;          /* forces out a message if we get 100 null */
       if (zeroCount > 99)   /* messages in a row */
          {
          getCurrentDateTime ((char *) &szDateTime);
          strcpy (szSender, inet_ntoa ((struct in_addr) cli_addr.sin_addr));
          printf ("%s : %s %sn", szDateTime,
               "We have received 100 null messages, the last one from",
               szSender);
          zeroCount = 0;
          }
       }
   }
}

/* logd.c ends here */