Die OpenVOS-Architektur nutzt mehrere unabhängige Systeme; die NIO für die X25-Kommunikation, die Fibre-Channel-Disk-Array-Controller, die USV für die Stromversorgung, den RSN Internet Console Server für RSN über IP und die Ethernet-Switches des Wartungsnetzwerks, die es all diesen Systemen ermöglichen, über ein privates Ethernet/IP-Netzwerk zu kommunizieren. Diese Systeme werden von verschiedenen OpenVOS-Prozessen überwacht, um sicherzustellen, dass sie korrekt laufen. Einige Ereignisse wie Benutzeranmeldungen werden jedoch nicht überwacht. Die RSN-Konsole und die Netzwerk-Switches haben die Möglichkeit, eine Nachricht an einen Logging-Server zu senden, sobald sich jemand anmeldet oder versucht, sich anzumelden. Da die Netzwerk-Switches nur mit dem Modul Stratus verbunden sind, macht es Sinn, einen Logging-Server auf dem Modul Stratus laufen zu lassen. Zu diesem Zweck habe ich einen sehr einfachen Logging-Server erstellt, der einfach die Nachricht, die er empfängt, zusammen mit einem Datums-/Zeitstempel und der IP-Adresse des Hosts, der die Nachricht gesendet hat, auf die Standardausgabe schreibt. Indem man den Server als gestarteten Prozess laufen lässt, können die Nachrichten in der Out-Datei des Prozesses gespeichert werden.
Beispiele aus den Netzwerk-Switches |
Es ist möglich, dass jemand, der dazu berechtigt war, nur Probleme bei der Eingabe des Root-Passworts hatte, wenn er sich als Root am Netzwerk-Switch anmeldete, vielleicht ist er aber auch nur sehr gut im Erraten von Passwörtern.
2011-10-02 11:55:39 : 10.10.1.75 : >%AAA-W-REJECT: Neue Telnet-Verbindung zur Verwendung
+r root, Quelle 10.10.1.1 Ziel 10.10.1.75 REJECTED
2011-10-02 11:56:03 : 10.10.1.75 : >%AAA-W-REJECT: Neue Telnet-Verbindung zur Verwendung
+r root, Quelle 10.10.1.1 Ziel 10.10.1.75 REJECTED
2011-10-02 11:56:08 : 10.10.1.75 : >%AAA-I-CONNECT: Benutzer-CLI-Sitzung für Benutzer ro
+ot über Telnet , Quelle 10.10.1.1 Ziel 10.10.1.75 ACCEPTED
Hier ist jemand, der die Benutzer-IDs von Systemadministratoren errät
2011-10-02 12:03:13 : 10.10.1.75 : >%AAA-W-REJECT: Neue Telnet-Verbindung zur Verwendung
+r admin, Quelle 10.10.1.1 Ziel 10.10.1.75 REJECTED
2011-10-02 12:03:30 : 10.10.1.75 : >%AAA-W-REJECT: Neue Telnet-Verbindung zur Verwendung
+r sysadmin, Quelle 10.10.1.1 Ziel 10.10.1.75 REJECTED
2011-10-02 12:04:39 : 10.10.1.75 : >%AAA-W-REJECT: Neue Telnet-Verbindung zur Verwendung
+r Administrator, Quelle 10.10.1.1 Ziel 10.10.1.75 REJECTED
Neben den Benutzeranmeldungen melden die Netzwerk-Switches, wenn die Konfiguration geändert wurde
2011-10-02 15:16:29 : 10.10.1.75 : >%COPY-I-FILECPY: Dateien kopieren - Quell-URL run
+ning-config Ziel-URL flash://startup-config
2011-10-02 15:16:43 : 10.10.1.75 : >%COPY-N-TRAP: Der Kopiervorgang wurde
+erfolgreich abgeschlossen
Außerdem meldet es "Link up" und "Link down", was bei der Fehlersuche bei Kommunikationsproblemen sehr hilfreich sein kann.
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
|
Beispiele vom RSN Internet Console Server |
Jemand vom Modul hat sich mit der RSN-Konsole verbunden und sich als root angemeldet, nachdem er das Passwort zweimal falsch eingegeben hatte.
2011-10-02 12:11:03 : 10.10.1.200 : in.telnetd[2942]: Verbindung von 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:11:03 : 10.10.1.200 : telnetd[2942]: doit: getaddrinfo: Temporaere
+Fehler bei der Namensauflösung
2011-10-02 12:11:07 : 10.10.1.200 : login[2943]: ungültiges Passwort für `root' auf
+`ttyp0' von `10.10.1.1'
2011-10-02 12:11:15 : 10.10.1.200 : login[2943]: Ungültiges Passwort für `root' auf
+`ttyp0' von `10.10.1.1'
2011-10-02 12:11:35 : 10.10.1.200 : login[2945]: root-Anmeldung auf `ttyp0' von `10
+.10.1.1'
Beachten Sie, dass die RSN-Konsole eine Benutzer-ID von UNKNOWN meldet, wenn ein Versuch mit einer ungültigen Benutzer-ID unternommen wird.
2011-10-02 12:12:31 : 10.10.1.200 : in.telnetd[2946]: Verbindung von 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:12:32 : 10.10.1.200 : telnetd[2946]: doit: getaddrinfo: Temporaere
+Fehler bei der Namensauflösung
2011-10-02 12:12:37 : 10.10.1.200 : login[2947]: ungültiges Passwort für `UNKNOWN'
+auf `ttyp0' von `10.10.1.1'
2011-10-02 12:12:45 : 10.10.1.200 : login[2947]: ungültiges Kennwort für `UNBEKANNT'
+auf `ttyp0' von `10.10.1.1'
2011-10-02 12:12:54 : 10.10.1.200 : login[2947]: Ungültiges Passwort für `UNKNOWN'
+auf `ttyp0' von `10.10.1.1'
Die RSN-Konsole meldet sich nicht, wenn die gültige Benutzerkennung rsn_admin zur Anmeldung verwendet wird. Die Verbindung wird jedoch weiterhin angezeigt. Die rsn_admin-Benutzer-ID hat keinen Zugriff auf die Änderung von Systemkonfigurationsdateien. Wenn der Benutzer rsn_admin versucht, mit dem Befehl su zu root zu wechseln, wird dies protokolliert.
2011-10-02 12:15:37 : 10.10.1.200 : in.telnetd[2957]: Verbindung von 10.10.1.1 (10
+.10.1.1)
2011-10-02 12:15:38 : 10.10.1.200 : telnetd[2957]: doit: getaddrinfo: Temporaere
+Fehler bei der Namensauflösung
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 opened for user
+ root von rsn_admin(uid=500)
Ebenso wie Versuche, die scheitern.
2011-10-02 12:19:50 : 10.10.1.200 : PAM_unix[2972]: Authentifizierungsfehler; rsn_
+admin(uid=500) -> root für su-Dienst
2011-10-02 12:19:52 : 10.10.1.200 : su[2972]: pam_authenticate: Authentifizierung f
+ Fehlschlag
2011-10-02 12:19:52 : 10.10.1.200 : su[2972]: - ttyp0 rsn_admin-root
|
Um den Netzwerk-Switch so zu konfigurieren, dass er Protokollmeldungen an das OpenVOS-Modul sendet, müssen Sie sich als Root in den Switch einloggen, den Befehl logging ausführen und dann die neue Konfiguration speichern:
telnet 10.10.1.75 Versucht... Verbunden mit 10.10.1.75. Escape-Zeichen ist '^]'. Benutzername:root Kennwort:****** console# config console(config)# logging 10.10.1.1 console(config)# console# copy running-config startup-config |
Um die RSN-Konsole so zu konfigurieren, dass sie Protokollnachrichten an das OpenVOS-Modul sendet, müssen Sie sich als root an der Konsole anmelden und den syslogd-Prozess mit dem Befehl "syslogd -R 10.10.1.1:514" starten. Um sicherzustellen, dass der syslogd-Prozess nach einem Neustart gestartet wird, muss die Datei /etc/tc.d/rc.local geändert werden.
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# |
Angenommen, Sie erhalten die gleiche Ausgabe wie oben gezeigt, können Sie die Datei rc.local.bak mit "rm rc.local.bak" löschen.
Nachdem die Protokollierung auf den Geräten eingerichtet wurde, müssen Sie das Programm logd auf dem Modul Stratus ausführen. Ich schlage vor, das Programm mit dem folgenden Befehlsmakro zu starten. Die Protokolldatei wird logd.(Datum).(Zeit).out genannt. Wenn aus irgendeinem Grund bereits eine Datei mit diesem Namen existiert, wird sie in logd.(date).(time).old.out umbenannt. Wenn es bereits eine Datei mit der Endung .old.out gibt, wird sie gelöscht. Da der Zeitstempel sekundengenau ist, ist dies unwahrscheinlich. Die out-Datei ist mit einem impliziten Locking versehen, so dass die Datei jederzeit gelesen werden kann. Beachten Sie, dass die Ausgabedatei immer größer wird, so dass eine gewisse Wartung Ihrerseits erforderlich ist, oder Sie können das Programm so modifizieren, dass es intelligenter mit der Ausgabe umgeht.
& start_logd.cm beginnt hier
&
& Version 1.00 11-11-02
& [email protected]
&
& Dieses Skript erzeugt eine Protokolldatei, setzt implizites Locking und startet den logd
& Prozess. Der Prozess wird normalerweise nicht beendet und die Protokolldatei hat das
& hat das Potenzial, sehr groß zu werden.
&
&
& Diese Software wird auf einer "AS IS"-Basis bereitgestellt, OHNE JEGLICHE GARANTIE ODER
& UNTERSTÜTZUNG JEGLICHER ART. Der AUTOR SCHLIESST AUSDRÜCKLICH JEDE STILLSCHWEIGENDE
& GARANTIEN DER MARKTGÄNGIGKEIT ODER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
& Dieser Haftungsausschluss gilt trotz aller mündlichen Zusicherungen jeglicher
& Zusicherungen jeglicher Art durch den Autor oder andere Personen.
&
&set DT (Datum).(Zeit)
&wenn (existiert logd.&DT&.out)
&dann !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 endet hier
|
Zu guter Letzt ist hier das Programm.
/* 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 */
|