Die OpenVOS-Architektur nutzt mehrere unabhängige Systeme: NIO für die X25-Kommunikation, Fibre-Channel-Festplattenarray-Controller, USV für die Stromversorgung, den RSN Internet Console Server für RSN über IP und die Ethernet-Switches des Wartungsnetzwerks, über die alle diese Systeme über ein privates Ethernet/IP-Netzwerk kommunizieren können. Diese Systeme werden von verschiedenen OpenVOS-Prozessen überwacht, um sicherzustellen, dass sie ordnungsgemäß funktionieren. Einige Ereignisse, wie z. B. Benutzeranmeldungen, werden jedoch nicht überwacht. Die RSN-Konsole und die Netzwerk-Switches verfügen über die Option, bei jeder Anmeldung oder jedem Anmeldeversuch eine Nachricht an einen Protokollierungsserver zu senden. Da die Netzwerk-Switches nur mit dem Stratus verbunden sind, ist es sinnvoll, einen Protokollierungsserver auf dem Stratus laufen zu lassen. Zu diesem Zweck habe ich einen sehr einfachen Protokollierungsserver erstellt, der die empfangene Nachricht zusammen mit einem Datums- und Zeitstempel und der IP-Adresse des Hosts, der die Nachricht gesendet hat, einfach in die Standardausgabe schreibt. Durch Ausführen des Servers als gestarteter Prozess können die Nachrichten in der Ausgabedatei des Prozesses gespeichert werden.
| Beispiele aus dem Netzwerk-Switchbereich |
Es ist möglich, dass jemand, der dazu berechtigt war, einfach Probleme hatte, das Root-Passwort einzugeben, als er sich als Root beim Netzwerk-Switch anmeldete, aber vielleicht ist er auch einfach nur sehr gut darin, Passwörter zu erraten.
02.10.2011 11:55:39: 10.10.1.75: >%AAA-W-REJECT: Neue Telnet-Verbindung für Verwendung
+r root, Quelle 10.10.1.1 Ziel 10.10.1.75 ABGELEHNT
02.10.2011 11:56:03: 10.10.1.75: >%AAA-W-REJECT: Neue Telnet-Verbindung für Verwendung
+r root, Quelle 10.10.1.1, Ziel 10.10.1.75 ABGELEHNT
02.10.2011 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 AKZEPTIERT
Hier ist jemand, der die Benutzer-IDs von Systemadministratoren errät.
02.10.2011 12:03:13: 10.10.1.75: >%AAA-W-REJECT: Neue Telnet-Verbindung für Verwendung
+r admin, Quelle 10.10.1.1 Ziel 10.10.1.75 ABGELEHNT
02.10.2011 12:03:30 Uhr: 10.10.1.75: >%AAA-W-REJECT: Neue Telnet-Verbindung für Verwendung
+r sysadmin, Quelle 10.10.1.1, Ziel 10.10.1.75 ABGELEHNT
02.10.2011 12:04:39 Uhr: 10.10.1.75: >%AAA-W-REJECT: Neue Telnet-Verbindung für Verwendung
+r Administrator, Quelle 10.10.1.1 Ziel 10.10.1.75 ABGELEHNT
Neben den Benutzeranmeldungen melden die Netzwerk-Switches auch, wenn die Konfiguration geändert wurde.
02.10.2011, 15:16:29 Uhr: 10.10.1.75: >%COPY-I-FILECPY: Dateien kopieren – Quell-URL run
+ning-config Ziel-URL flash://startup-config
02.10.2011 15:16:43: 10.10.1.75: >%COPY-N-TRAP: Der Kopiervorgang wurde erfolgreich abgeschlossen.
+
Außerdem werden Verbindungs- und Verbindungsabbruchmeldungen gemeldet, was bei der Fehlerbehebung von Kommunikationsproblemen sehr nützlich sein kann.
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
|
| Beispiele aus dem RSN-Internet-Konsolenserver |
Jemand aus dem Modul hat sich mit der RSN-Konsole verbunden und sich als Root angemeldet, nachdem er das Passwort zweimal falsch eingegeben hatte.
02.10.2011 12:11:03: 10.10.1.200: in.telnetd[2942]: Verbindung von 10.10.1.1 (10
+.10.1.1)
02.10.2011 12:11:03: 10.10.1.200: telnetd[2942]: doit: getaddrinfo: Vorübergehender Fehler bei der Namensauflösung
+
02.10.2011 12:11:07: 10.10.1.200: login[2943]: ungültiges Passwort für „root” auf
+„ttyp0” von „10.10.1.1”
02.10.2011 12:11:15: 10.10.1.200: login[2943]: Ungültiges Passwort für „root” auf „ttyp0” von „10.10.1.1”
+
02.10.2011 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.
02.10.2011 12:12:31: 10.10.1.200: in.telnetd[2946]: Verbindung von 10.10.1.1 (10
+.10.1.1)
02.10.2011 12:12:32: 10.10.1.200: telnetd[2946]: doit: getaddrinfo: Vorübergehender Fehler bei der Namensauflösung
+
02.10.2011 12:12:37: 10.10.1.200: login[2947]: ungültiges Passwort für „UNKNOWN”
+auf „ttyp0” von „10.10.1.1”
02.10.2011 12:12:45: 10.10.1.200: login[2947]: Ungültiges Passwort für „UNKNOWN”
+auf „ttyp0” von „10.10.1.1”
02.10.2011 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 keine Fehler, wenn die gültige Benutzer-ID „rsn_admin” zum Anmelden verwendet wird. Die Verbindung wird jedoch weiterhin angezeigt. Die Benutzer-ID „rsn_admin” hat keinen Zugriff auf die Systemkonfigurationsdateien. Wenn der Benutzer „rsn_admin” versucht, mit dem Befehl „su” zum Root-Benutzer zu wechseln, wird dies protokolliert.
02.10.2011 12:15:37: 10.10.1.200: in.telnetd[2957]: Verbindung von 10.10.1.1 (10
+.10.1.1)
02.10.2011 12:15:38: 10.10.1.200: telnetd[2957]: doit: getaddrinfo: Vorübergehender Fehler bei der Namensauflösung
+
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) Sitzung für Benutzer
+ root von rsn_admin(uid=500)
Ebenso wie Versuche, die scheitern.
02.10.2011 12:19:50: 10.10.1.200: PAM_unix[2972]: Authentifizierungsfehler; rsn_
+admin(uid=500) -> root für su-Dienst
02.10.2011 12:19:52: 10.10.1.200: su[2972]: pam_authenticate: Authentifizierung fehlgeschlagen
+
02.10.2011 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 beim Switch anmelden, den Befehl „logging“ ausführen und anschließend die neue Konfiguration speichern:
telnet 10.10.1.75 Versuche... Verbunden mit 10.10.1.75. Das Escape-Zeichen ist '^]'. Benutzername: root Passwort: ****** 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 Protokollmeldungen an das OpenVOS-Modul sendet, müssen Sie sich als Root bei 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.
Sobald die Protokollierung auf den Geräten eingerichtet ist, müssen Sie das Programm „logd” auf dem Stratus ausführen. Ich empfehle, das Programm mit dem folgenden Befehlsmakro zu starten. Die Protokolldatei erhält den Namen „logd.(Datum).(Uhrzeit).out”. Sollte aus irgendeinem Grund bereits eine Datei mit diesem Namen vorhanden sein, wird sie in „logd.(Datum).(Uhrzeit).old.out” umbenannt. Wenn bereits eine Datei mit der Endung .old.out vorhanden ist, wird diese gelöscht. Da der Zeitstempel auf die Sekunde genau ist, ist dies jedoch unwahrscheinlich. Die Out-Datei ist implizit gesperrt, sodass die Datei jederzeit gelesen werden kann. Beachten Sie, dass die Out-Datei ständig wächst, sodass Sie einige Wartungsarbeiten durchführen müssen. Alternativ können Sie das Programm so ändern, dass es die Ausgabe intelligenter verarbeitet.
& start_logd.cm beginnt hier
&
& Version 1.00 11-11-02
&stratus
&
& Dieses Skript erstellt eine Protokolldatei, legt eine implizite Sperre fest und startet den logd-Prozess.
& Der Prozess wird normalerweise nicht beendet, und die Protokolldatei kann sehr groß werden.
&
&
&
& Diese Software wird „wie besehen“ ohne jegliche Gewährleistung oder
& jegliche Art von Support bereitgestellt. Der Autor lehnt ausdrücklich jegliche stillschweigende
& Gewährleistung der Marktgängigkeit oder Eignung für einen bestimmten Zweck ab.
& Dieser Haftungsausschluss gilt ungeachtet mündlicher Zusicherungen jeglicher Art, die vom Autor oder anderen Personen gemacht wurden.
&
&set DT (Datum).(Uhrzeit)
&if (exists 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 endet hier
|
Und hier ist endlich 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 */
|
