Pular para o conteúdo principal

A arquitetura OpenVOS utiliza vários sistemas independentes: o NIO para comunicação X25, os controladores de matriz de discos de canal de fibra, UPS para alimentação, o servidor de console RSN Internet para RSN sobre IP e os switches Ethernet da rede de manutenção que permitem que todos esses sistemas se comuniquem através de uma rede Ethernet/IP privada. Esses sistemas são monitorados por vários processos OpenVOS para garantir que estejam funcionando corretamente. Mas alguns eventos, como 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 para 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 que recebe junto com um carimbo de data e hora e o endereço IP do host que enviou a mensagem para a 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 autorizado estivesse apenas tendo problemas para digitar a senha root ao fazer login no switch de rede como root, mas também é possível que essa pessoa seja 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 para 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 Administrator, origem 10.10.1.1 destino 10.10.1.75  REJEITADO

Além dos logins dos usuários, os switches de rede informarão 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
+configuração de destino URL 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.

E também irá reportar mensagens de ligação e desligamento, 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 de 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.


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

Observe que o console RSN informará um ID de usuário DESCONHECIDO se for feita uma tentativa com um ID de usuário inválido.


2011-10-02 12:12:31 : 10.10.1.200 : in.telnetd[2946]: conexão de 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:12:32 : 10.10.1.200 : telnetd[2946]: doit: getaddrinfo: Falha temporária na resolução de nomes
+
2011-10-02 12:12:37 : 10.10.1.200 : login[2947]: senha inválida para `UNKNOWN'
+em `ttyp0' de `10.10.1.1'
2011-10-02 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 emitirá nenhum relatório quando o ID de usuário válido rsn_admin for usado para fazer login. No entanto, você ainda verá a conexão. O ID de usuário rsn_admin não tem acesso para alterar nenhum dos arquivos de configuração do sistema. Se o usuário rsn_admin tentar mudar para root com o comando su, isso será registrado.


2011-10-02 12:15:37 : 10.10.1.200 : in.telnetd[2957]: conexão de 10.10.1.1 (10
+.10.1.1)
02/10/2011 12:15:38: 10.10.1.200: telnetd[2957]: doit: getaddrinfo: Falha temporária na resolução de nomes
+
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) sessão aberta para o usuário root por rsn_admin(uid=500)
+

Assim como as tentativas que fracassam.


2011-10-02 12:19:50 : 10.10.1.200 : PAM_unix[2972]: falha na autenticação; rsn_
+admin(uid=500) -> root para serviço su
02/10/2011 12:19:52: 10.10.1.200: su[2972]: pam_authenticate: Falha na autenticação
2011-10-02 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, você precisa 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, você precisa 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 “rm rc.local.bak”.

Depois que o registro for configurado nos dispositivos, você precisará executar o programa logd no módulo Stratus. Sugiro iniciar o programa com a seguinte macro de comando. O arquivo de registro será nomeado logd.(data).(hora).out. Se, por algum motivo, um arquivo com esse nome já existir, 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 out tem bloqueio implícito definido, portanto, o arquivo pode ser lido a qualquer momento. Observe que o arquivo out crescerá indefinidamente, portanto, será necessária alguma manutenção de sua parte ou você poderá modificar o programa para torná-lo mais inteligente no tratamento 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
&. O processo normalmente não será encerrado e o arquivo de log tem o
& potencial de crescer muito.
&
&
& 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, apesar de quaisquer declarações verbais de qualquer tipo feitas pelo autor ou qualquer outra pessoa.
&
&set DT (data).(hora)
&if (existe logd.&DT&.out)
&then !rename logd.&DT&.out logd.&DT&.old.out -delete
!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.