A arquitetura OpenVOS faz uso de vários sistemas independentes; o NIO para comunicação X25, os controladores de matriz de disco de canal de fibra, UPS para alimentação, o RSN Internet Console Server para RSN sobre IP e os switches Ethernet de rede de manutenção que permitem que todos estes sistemas se comuniquem através de uma rede Ethernet/IP privada. Estes sistemas são monitorados por vários processos OpenVOS para garantir que eles 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 a um servidor de registro sempre que alguém faz login ou tenta fazer login. Como os switches de rede só estão conectados ao módulo Stratus, faz sentido ter um servidor de registro rodando no módulo Stratus. Para isso, criei um servidor de registro muito simples, ele simplesmente escreve 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 dos comutadores de rede |
É possível que alguém que foi autorizado estivesse apenas tendo problemas para digitar a senha de root ao entrar no switch da rede como root, então, mais uma vez, talvez eles sejam apenas muito bons em adivinhar senhas.
2011-10-02 11:55:39 : 10.10.1.75 : >%AAAA-W-REJEIÇÃO: Nova conexão telnet para uso
+r raiz, fonte 10.10.1.1 destino 10.10.1.75 REJEITADO
2011-10-02 11:56:03 : 10.10.1.75 : >%AAAA-W-REJEIÇÃO: Nova conexão telnet para uso
+r raiz, fonte 10.10.1.1 destino 10.10.1.75 REJEITADO
2011-10-02 11:56:08 : 10.10.1.75 : >%AAAA-I-CONNECT: Sessão CLI do usuário para o usuário ro
+ot over telnet , fonte 10.10.1.1 destino 10.10.1.75 ACEITADO
Aqui está alguém adivinhando os IDs dos usuários do administrador do sistema
2011-10-02 12:03:13 : 10.10.1.75 : >%AAAA-W-REJEIÇÃO: Nova conexão telnet para uso
+r admin, fonte 10.10.1.1 destino 10.10.1.75 REJEITADO
2011-10-02 12:03:30 : 10.10.1.75 : >%AAAA-W-REJEIÇÃO: Nova conexão telnet para uso
+r sysadmin, fonte 10.10.1.1 destino 10.10.1.75 REJEITADO
2011-10-02 12:04:39 : 10.10.1.75 : >%AAAA-W-REJEIÇÃO: Nova conexão telnet para uso
+r Administrador, fonte 10.10.1.1 destino 10.10.1.75 REJEITADO
Além dos logins do usuário, os switches de rede informarão quando a configuração tiver sido alterada.
2011-10-02 15:16:29 : 10.10.1.75 : >%COPY-I-FILECPY: Cópia de arquivos - URL de origem executada
+ning-config URL de destino flash://startup-config
2011-10-02 15:16:43 : 10.10.1.75 : >%COPY-N-TRAP: A operação de cópia foi concluída
+ed com sucesso
E também relatará as mensagens de ligação para cima e para baixo que podem ser muito úteis na resolução de problemas de comunicação.
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
|
Exemplos do RSN Internet Console Server |
Alguém do módulo conectado ao console RSN e logado como root, após digitar a senha incorretamente duas vezes.
2011-10-02 12:11:03 : 10.10.1.200 : in.telnetd[2942]: conectar a partir de 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:11:03 : 10.10.1.200 : telnetd[2942]: doit: getaddrinfo: Temporário
+ falha na resolução do nome
2011-10-02 12:11:07 : 10.10.1.200 : login[2943]: senha inválida para `root' on
+`ttyp0' de `10.10.1.1'.
2011-10-02 12:11:15 : 10.10.1.200 : login[2943]: senha inválida para `root' on
+`ttyp0' de `10.10.1.1'.
2011-10-02 12:11:35 : 10.10.1.200 : login[2945]: login raiz em `ttyp0' a partir de `10
+.10.1.1'
Observe que o console RSN informará um ID de usuário do UNKNOWN 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]: conectar a partir de 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:12:32 : 10.10.1.200 : telnetd[2946]: doit: getaddrinfo: Temporário
+ falha na resolução do nome
2011-10-02 12:12:37 : 10.10.1.200 : login[2947]: senha inválida para `UNKNOWN' (desconhecido)
+on `ttyp0' de `10.10.1.1'
2011-10-02 12:12:45 : 10.10.1.200 : login[2947]: senha inválida para `UNKNOWN'.
+on `ttyp0' de `10.10.1.1'
2011-10-02 12:12:54 : 10.10.1.200 : login[2947]: senha inválida para `UNKNOWN' (desconhecido)
+on `ttyp0' de `10.10.1.1'
O console RSN não informará quando o ID de usuário válido rsn_admin for usado para login. No entanto, você ainda verá a conexão. O ID de usuário do rsn_admin não tem acesso para alterar nenhum dos arquivos de configuração do sistema. Se o usuário do rsn_admin tentar mudar para root com o comando su, ele será logado.
2011-10-02 12:15:37 : 10.10.1.200 : in.telnetd[2957]: conectar a partir de 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:15:38 : 10.10.1.200 : telnetd[2957]: doit: getaddrinfo: Temporário
+ falha na resolução do nome
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
+ raiz por rsn_admin(uid=500)
Assim como as tentativas que falham.
2011-10-02 12:19:50 : 10.10.1.200 : PAM_unix[2972]: falha na autenticação; rsn_
+admin(uid=500) -> root for su service
2011-10-02 12:19:52 : 10.10.1.200 : su[2972]: pam_authenticate: Autenticação f
+ailure
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 registro para o módulo OpenVOS, é necessário entrar no switch como root, executar o comando de registro e, em seguida, salvar a nova configuração:
telnet 10.10.1.75 Tentando... Conectado a 10.10.1.75. O caráter de fuga é "^]". Nome do usuário:root Senha:****** console# config console(config)# log 10.10.1.1 console(config)# console# copy running-config startup-config |
Para configurar o console RSN para enviar mensagens de log para o módulo OpenVOS, você precisa entrar no console como root e iniciar o processo de syslogd com o comando "syslogd -R 10.10.1.1:514". Para garantir que o processo de 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 a mesma saída como mostrado acima, você pode apagar o arquivo rc.local.bak com "rm rc.local.bak".
Uma vez que o registro tenha sido configurado nos dispositivos, você precisa executar o programa de registro no módulo Stratus. Sugiro iniciar o programa com a seguinte macro de comando. O arquivo de log 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 o sufixo .old.out, ele será excluído. Dado que o carimbo de hora é para o segundo, isto é improvável. O arquivo out tem bloqueio implícito para que o arquivo possa ser lido a qualquer momento. Note que o arquivo out vai crescer para sempre, portanto, alguma manutenção de sua parte será necessária ou você pode modificar o programa para torná-lo mais inteligente no manuseio 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 logd
e processo. O processo normalmente não terminará e o arquivo de log tem o
e potencial de crescimento muito grande.
&
&
& Este software é fornecido "COMO ESTÁ", SEM QUALQUER GARANTIA OU
E QUALQUER SUPORTE DE QUALQUER TIPO. O AUTOR DESCULA ESPECIFICAMENTE QUALQUER REVOGAÇÃO IMPLÍCITA
E GARANTIAS DE COMERCIABILIDADE OU ADEQUAÇÃO PARA QUALQUER FINALIDADE ESPECÍFICA.
& Esta isenção de responsabilidade aplica-se, apesar de quaisquer representações verbais de qualquer
e bondoso fornecido pelo autor ou por qualquer outra pessoa.
&
&set DT (data).(hora)
&if (existe logd.&DT&.out)
&then !renomear logd.&DT&.out logd.&DT&.old.out -delete
!create_file logd.&DT&.out
!set_implicit_logd.&DT&.out
start_process logd -output_path logd.&DT&.out -privileged -process_name logd
&
& start_logd.cm termina aqui
|
Qualquer um finalmente aqui é 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 */
|