L'architecture OpenVOS fait appel à plusieurs systèmes indépendants : le NIO pour la communication X25, les contrôleurs de réseau de disques à canal de fibre, l'UPS pour l'alimentation, le serveur de console Internet RSN pour le RSN sur IP et les commutateurs Ethernet du réseau de maintenance qui permettent à tous ces systèmes de communiquer sur un réseau Ethernet/IP privé. Ces systèmes sont surveillés par divers processus OpenVOS pour s'assurer qu'ils fonctionnent correctement. Mais certains événements, comme les ouvertures de session des utilisateurs, ne sont pas surveillés. La console RSN et les commutateurs de réseau ont la possibilité d'envoyer un message à un serveur de journalisation chaque fois que quelqu'un se connecte ou tente de se connecter. Comme les commutateurs réseau ne sont connectés qu'au module Stratus , il est logique de faire tourner un serveur de journalisation sur le module Stratus . À cette fin, j'ai créé un serveur de journalisation très simple, il suffit d'écrire le message qu'il reçoit avec un timbre dateur et l'adresse IP de l'hôte qui a envoyé le message sur la sortie standard. En exécutant le serveur comme un processus lancé, les messages peuvent être enregistrés dans le fichier de sortie du processus.
Exemples de commutateurs de réseau |
Il est possible que quelqu'un qui était autorisé ait juste eu des problèmes pour taper le mot de passe de root lorsqu'il s'est connecté au commutateur réseau en tant que root, alors encore une fois, peut-être qu'il est juste très bon pour deviner les mots de passe.
2011-10-02 11:55:39 : 10.10.1.75 : >%AAA-W-REJET : Nouvelle connexion telnet à utiliser
+r racine, source 10.10.1.1 destination 10.10.1.75 REJETÉ
2011-10-02 11:56:03 : 10.10.1.75 : >%AAA-W-REJET : Nouvelle connexion telnet à utiliser
+r racine, source 10.10.1.1 destination 10.10.1.75 REJETÉ
2011-10-02 11:56:08 : 10.10.1.75 : >%AAA-I-CONNECT : Session CLI pour l'utilisateur ro
+ot over telnet , source 10.10.1.1 destination 10.10.1.75 ACCEPTÉE
Voici quelqu'un qui devine les identifiants de l'administrateur du système
2011-10-02 12:03:13 : 10.10.1.75 : >%AAA-W-REJET : Nouvelle connexion telnet à utiliser
+r admin, source 10.10.1.1 destination 10.10.1.75 REJETÉ
2011-10-02 12:03:30 : 10.10.1.75 : >%AAA-W-REJET : Nouvelle connexion telnet à utiliser
+r sysadmin, source 10.10.1.1 destination 10.10.1.75 REJETÉ
2011-10-02 12:04:39 : 10.10.1.75 : >%AAA-W-REJET : Nouvelle connexion telnet à utiliser
+r Administrateur, source 10.10.1.1 destination 10.10.1.75 REJETÉ
Outre les connexions des utilisateurs, les commutateurs de réseau signalent les modifications de la configuration
2011-10-02 15:16:29 : 10.10.1.75 : >%COPY-I-FILECPY : Copie de fichiers - exécution de l'URL source
+ning-config URL de destination flash://startup-config
2011-10-02 15:16:43 : 10.10.1.75 : >%COPY-N-TRAP : L'opération de copie est terminée
+ed avec succès
Il signalera également les messages de liaison ascendante et descendante qui peuvent être très utiles pour résoudre les problèmes de communication.
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
|
Exemples du serveur de console Internet RSN |
Quelqu'un du module s'est connecté à la console RSN et s'est connecté en tant que root, après avoir tapé deux fois le mot de passe de façon incorrecte.
2011-10-02 12:11:03 : 10.10.1.200 : in.telnetd [2942] : se connecter à partir du 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:11:03 : 10.10.1.200 : telnetd [2942] : doit : getaddrinfo : Temporaire
+ échec de la résolution du nom
2011-10-02 12:11:07 : 10.10.1.200 : login [2943] : mot de passe invalide pour 'root' on
+ "ttyp0" de "10.10.1.1".
2011-10-02 12:11:15 : 10.10.1.200 : login [2943] : mot de passe invalide pour `root' on
+ "ttyp0" de "10.10.1.1".
2011-10-02 12:11:35 : 10.10.1.200 : connexion [2945] : connexion root sur `ttyp0' à partir de `10
+.10.1.1'
Notez que la console RSN signalera un ID d'utilisateur INCONNU si une tentative est faite avec un ID d'utilisateur non valide.
2011-10-02 12:12:31 : 10.10.1.200 : in.telnetd [2946] : se connecter à partir du 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:12:32 : 10.10.1.200 : telnetd [2946] : doit : getaddrinfo : Temporaire
+ échec de la résolution du nom
2011-10-02 12:12:37 : 10.10.1.200 : login [2947] : mot de passe invalide pour 'INCONNU
+on `ttyp0' from `10.10.1.1
2011-10-02 12:12:45 : 10.10.1.200 : login [2947] : mot de passe invalide pour `UNKNOWN
+on `ttyp0' from `10.10.1.1
2011-10-02 12:12:54 : 10.10.1.200 : login [2947] : mot de passe invalide pour `UNKNOWN
+on `ttyp0' from `10.10.1.1
La console RSN ne signale pas lorsque l'ID utilisateur valide rsn_admin est utilisé pour se connecter. Cependant, vous verrez toujours la connexion. L'ID utilisateur rsn_admin n'a pas accès à la modification des fichiers de configuration du système. Si l'utilisateur rsn_admin tente de passer à l'utilisateur root avec la commande su, il sera enregistré.
2011-10-02 12:15:37 : 10.10.1.200 : in.telnetd [2957] : se connecter à partir du 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:15:38 : 10.10.1.200 : telnetd [2957] : doit : getaddrinfo : Temporaire
+ échec de la résolution du nom
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) session ouverte pour l'utilisateur
+ racine par rsn_admin(uid=500)
Tout comme les tentatives qui échouent.
2011-10-02 12:19:50 : 10.10.1.200 : PAM_unix [2972] : échec de l'authentification ; rsn_.
+admin(uid=500) -> racine du service
2011-10-02 12:19:52 : 10.10.1.200 : su [2972] : pam_authenticate : Authentification f
+ailure
2011-10-02 12:19:52 : 10.10.1.200 : su [2972] : - ttyp0 rsn_admin-root
|
Pour configurer le commutateur réseau afin d'envoyer des messages de journalisation au module OpenVOS, vous devez vous connecter au commutateur en tant que root, exécuter la commande de journalisation et ensuite enregistrer la nouvelle configuration :
telnet 10.10.1.75 Essayer... Connecté au 10.10.1.75. Le caractère d'échappement est "^]". Nom d'utilisateur : root Mot de passe : ****** console# config console(config)# logging 10.10.1.1 console(config)# console# copy running-config startup-config |
Pour configurer la console RSN afin d'envoyer des messages de log au module OpenVOS, vous devez vous connecter à la console en tant que root et lancer le processus syslogd avec la commande "syslogd -R 10.10.1.1:514". Pour s'assurer que le processus syslogd est lancé après un redémarrage, le fichier /etc/tc.d/rc.local doit être modifié.
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# |
En supposant que vous obteniez le même résultat que celui indiqué ci-dessus, vous pouvez supprimer le fichier rc.local.bak avec "rm rc.local.bak".
Une fois que la connexion a été établie sur les appareils, vous devez exécuter le programme de connexion sur le module Stratus . Je vous suggère de lancer le programme avec la macro de commande suivante. Le fichier journal sera nommé logd.(date).(time).out. Si, pour une raison quelconque, un fichier portant ce nom existe déjà, il est renommé logd.(date).(time).old.out. S'il existe déjà un fichier avec le suffixe .old.out, il est supprimé. Étant donné que l'heure est à la seconde près, cela est peu probable. Le fichier .out est doté d'un verrouillage implicite, de sorte que le fichier peut être lu à tout moment. Notez que le fichier de sortie se développera à l'infini, ce qui nécessitera une certaine maintenance de votre part, ou vous pouvez modifier le programme pour le rendre plus intelligent en ce qui concerne la gestion de la sortie.
& start_logd.cm commence ici
&
& Version 1.00 11-11-02
& [email protected]
&
& Ce script crée un fichier journal, met en place un verrouillage implicite et lance le logd
et le processus. Le processus ne se termine normalement pas et le fichier journal a le
& le potentiel de croissance très important.
&
&
& Ce logiciel est fourni "tel quel", SANS AUCUNE GARANTIE OU
& TOUT SOUTIEN DE QUELQUE NATURE QUE CE SOIT. L'AUTEUR DECLARE SPECIFIQUEMENT TOUTE IMPLICITE
ET DES GARANTIES DE QUALITÉ MARCHANDE OU D'ADÉQUATION À UN USAGE PARTICULIER.
& Cette clause de non-responsabilité s'applique, malgré toute représentation verbale de
& genre fourni par l'auteur ou par toute autre personne.
&
&set DT (date).(heure)
&if (existe logd.&DT&.out)
&then !rename logd.&DT&.out logd.&DT&.old.out -delete
!create_file logd.&DT&.out
!set_implicite_locking logd.&DT&.out
start_process logd -output_path logd.&DT&.out -privileged -process_name logd
&
& start_logd.cm se termine ici
|
Voilà enfin le programme.
/* 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 */
|