Pular para o conteúdo principal

A arquitetura OpenVOS utiliza vários sistemas independentes: o NIO para comunicação X.25, os controladores de matriz de discos Fibre Channel, o no-break (UPS) para alimentação, o servidor de console RSN para RSN sobre IP e os switches Ethernet da rede de manutenção, que permitem que todos esses sistemas se comuniquem por meio de uma rede Ethernet/IP privada. Esses sistemas são monitorados por vários processos do OpenVOS para garantir que estejam funcionando corretamente. No entanto, alguns eventos, como os logins de usuários, não são monitorados. O console RSN e os switches de rede têm a opção de enviar uma mensagem a um servidor de registro sempre que alguém faz login ou tenta fazer login. Como os switches de rede estão conectados apenas ao módulo Stratus, faz sentido ter um servidor de registro em execução no módulo Stratus. Para isso, criei um servidor de registro muito simples, que simplesmente grava a mensagem recebida, juntamente com um carimbo de data e hora e o endereço IP do host que enviou a mensagem, na saída padrão. Ao executar o servidor como um processo iniciado, as mensagens podem ser salvas no arquivo de saída do processo.

Exemplos de switches de rede
É possível que alguém com permissão estivesse apenas com dificuldades para digitar a senha de root ao fazer login no switch de rede como root; ou talvez essa pessoa seja simplesmente muito boa em adivinhar senhas.


02/10/2011 11:55:39 : 10.10.1.75 : >%AAA-W-REJECT: Nova conexão Telnet para uso;
+r root, origem 10.10.1.1 destino 10.10.1.75  REJEITADA

02/10/2011 11:56:03 : 10.10.1.75 : >%AAA-W-REJECT: Nova conexão telnet para uso:
+r root, origem 10.10.1.1 destino 10.10.1.75  REJEITADA

02/10/2011 11:56:08 : 10.10.1.75 : >%AAA-I-CONNECT: Sessão CLI do usuário ro
+ot via telnet , origem 10.10.1.1 destino  10.10.1.75 ACEITO

Aqui está alguém tentando adivinhar os IDs de usuário do administrador do sistema


02/10/2011 12:03:13 : 10.10.1.75 : >%AAA-W-REJECT: Nova conexão Telnet para uso:
+r admin, origem 10.10.1.1 destino 10.10.1.75  REJEITADA

02/10/2011 12:03:30 : 10.10.1.75 : >%AAA-W-REJECT: Nova conexão telnet para uso:
+r sysadmin, origem 10.10.1.1 destino 10.10.1.75  REJEITADA

02/10/2011 12:04:39 : 10.10.1.75 : >%AAA-W-REJECT: Nova conexão telnet para uso:
+r Administrador, origem 10.10.1.1 destino 10.10.1.75  REJEITADA

Além dos logins dos usuários, os switches de rede irão notificar quando a configuração for alterada


02/10/2011 15:16:29 : 10.10.1.75 : >%COPY-I-FILECPY: Cópia de arquivos - URL de origem em execução:
+ URL de destino: flash://startup-config

02/10/2011 15:16:43 : 10.10.1.75 : >%COPY-N-TRAP: A operação de cópia foi concluīda com sucesso

Além disso, ele também exibirá mensagens de conexão estabelecida e interrompida, o que pode ser muito útil na resolução de problemas de comunicação.


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

02/10/2011 15:49:20 : 10.10.1.75 : >%LINK-I-Up:  2/e24
  Exemplos do servidor de console da Internet RSN
Alguém do módulo conectou-se ao console RSN e fez login como root, após digitar a senha incorretamente duas vezes.


02/10/2011 12:11:03 : 10.10.1.200 : in.telnetd[2942]: conexão proveniente de 10.10.1.1 (10+
.10.1.1)
02/10/2011 12:11:03 : 10.10.1.200 : telnetd[2942]: deve: getaddrinfo: Falha temporária na resolução de nome
02/10/2011 12:11:07 : 10.10.1.200 : login[2943]: senha inválida para `root' no
+`ttyp0' de `10.10.1.1'
02/10/2011 12:11:15 : 10.10.1.200 : login[2943]: senha inválida para `root' em
+`ttyp0' proveniente de `10.10.1.1'
02/10/2011 12:11:35 : 10.10.1.200 : login[2945]: login como `root' em `ttyp0' a partir de `10.10.1.1'

Observe que o console RSN exibirá o ID de usuário “DESCONHECIDO” caso seja feita uma tentativa com um ID de usuário inválido.


02/10/2011 12:12:31 : 10.10.1.200 : in.telnetd[2946]: conexão proveniente de 10.10.1.1 (10\
+.10.1.1)
02/10/2011 12:12:32 : 10.10.1.200 : telnetd[2946]: deve: getaddrinfo: Falha temporária na resolução de nome
02/10/2011 12:12:37 : 10.10.1.200 : login[2947]: senha inválida para `UNKNOWN'
+em `ttyp0' de `10.10.1.1'
02/10/2011 12:12:45 : 10.10.1.200 : login[2947]: senha inválida para `UNKNOWN'
+em `ttyp0' de `10.10.1.1'
02/10/2011 12:12:54 : 10.10.1.200 : login[2947]: senha inválida para `UNKNOWN'
+em `ttyp0' de `10.10.1.1'

O console RSN não exibirá nenhuma mensagem quando o ID de usuário válido rsn_admin for usado para fazer login. No entanto, a conexão continuará visível. O ID de usuário rsn_admin não tem permissão para alterar nenhum dos arquivos de configuração do sistema. Se o usuário rsn_admin tentar mudar para o usuário root com o comando su, isso será registrado no log.


02/10/2011 12:15:37 : 10.10.1.200 : in.telnetd[2957]: conexão proveniente de 10.10.1.1 (10+
.10.1.1)
02/10/2011 12:15:38 : 10.10.1.200 : telnetd[2957]: deve: getaddrinfo: Falha temporária na resolução de nomes
02/10/2011 12:15:54 : 10.10.1.200 : su[2959]: + ttyp0 rsn_admin-root
02/10/2011 12:15:54 : 10.10.1.200 : PAM_unix[2959]: (su) sessão aberta para o usuário
+ root por rsn_admin(uid=500)

Assim como as tentativas que fracassam.


02/10/2011 12:19:50 : 10.10.1.200 : PAM_unix[2972]: falha na autenticação; rsn_
+admin(uid=500) -> root para o serviço su
02/10/2011 12:19:52 : 10.10.1.200 : su[2972]: pam_authenticate: Falha de autenticação
02/10/2011 12:19:52 : 10.10.1.200 : su[2972]: - ttyp0 rsn_admin-root

 

Para configurar o switch de rede para enviar mensagens de log ao módulo OpenVOS, é necessário fazer login no switch como root, executar o comando de log e, em seguida, salvar a nova configuração:

telnet 10.10.1.75                                       
Tentando...
Conectado a 10.10.1.75.
O caractere de escape é '^]'.

Nome de usuário: root
Senha: ******

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

console# copy running-config startup-config

 

Para configurar o console RSN para enviar mensagens de log ao módulo OpenVOS, é necessário fazer login no console como root e iniciar o processo syslogd com o comando “syslogd –R 10.10.1.1:514”. Para garantir que o processo syslogd seja iniciado após uma reinicialização, o arquivo /etc/tc.d/rc.local deve ser alterado.

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#

 

Supondo que você obtenha o mesmo resultado mostrado acima, você pode excluir o arquivo rc.local.bak com o comando “rm rc.local.bak”.

Depois de configurar o registro de logs nos dispositivos, é necessário executar o programa logd no módulo Stratus. Sugiro iniciar o programa com a seguinte macro de comando. O arquivo de log receberá o nome logd.(data).(hora).out. Se, por algum motivo, já existir um arquivo com esse nome, ele será renomeado para logd.(data).(hora).old.out. Se já houver um arquivo com a extensão .old.out, ele será excluído. Considerando que o carimbo de data/hora é preciso até o segundo, isso é improvável. O arquivo de saída possui bloqueio implícito, de modo que o arquivo pode ser lido a qualquer momento. Observe que o arquivo de saída crescerá indefinidamente, portanto, será necessária alguma manutenção de sua parte ou você pode modificar o programa para torná-lo mais inteligente no gerenciamento da saída.



& start_logd.cm começa aqui\
&\
& Versão 1.00 11/11/02\
& [email protected]\
&\
& Este script cria um arquivo de log, define o bloqueio implícito e inicia o processo logd\
&. Normalmente, o processo não será encerrado e o arquivo de log pode\
& atingir um tamanho muito grande.
&
&
& Este software é fornecido “NO ESTADO EM QUE SE ENCONTRA”, SEM QUALQUER GARANTIA OU
& QUALQUER TIPO DE SUPORTE. O AUTOR ISENTA-SE ESPECIFICAMENTE DE QUALQUER GARANTIA IMPLÍCITA
& DE COMERCIALIZAÇÃO OU ADEQUAÇÃO A QUALQUER FINALIDADE ESPECÍFICA.
& Esta isenção de responsabilidade se aplica, independentemente de quaisquer declarações verbais de qualquer tipo fornecidas pelo autor ou por qualquer outra pessoa.
&
&
&set DT (data).(hora)
&if (existe logd.&DT&.out)
&then !renomear logd.&DT&.out como logd.&DT&.old.out -excluir
!create_file logd.&DT&.out
!set_implicit_locking logd.&DT&.out
start_process logd -output_path logd.&DT&.out -privileged -process_name logd
&
& start_logd.cm termina aqui

 

E, finalmente, aqui está o programa.



/* 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 */

 

© 2024 Stratus Technologies.