öffnen Tags

öffnen Kategorien

Vom WebReader vorlesen lassen

Backup von Catalyst-Konfigurationen

18. Sep 2009, 03:03

Wie erwähnt sichern sich die Konfigurationen unserer Catalysts nun halbautomatisch. Erledigen tut dies ein Perl-Script über eine telnet-Verbindung. Da das Scripten nicht ganz so trivial war, gibts hier eine kleine Anleitung um anderen die Arbeit zu ersparen. Dabei gehe ich natürlich nur auf die wichtigsten Aspekte ein, das komplette Script gibt es am Ende als Download!
Ich benutze für die telnet-Verbindung das Modul Net::Telnet::Cisco, aber fangen wir von vorn an!

Als erstes werden natürlich ein paar statische Variablen angelegt:

1
2
3
4
5
6
7
8
9
10
11
chomp (my $DATESTR = `date +"%F_%H-%M"`);
my $BACKUPDIR = "/PATHTOBACKUP/$DATESTR/";
my $LOGDIR = "/PATHTOLOGS/$DATESTR/";
my $ARCHIVDIR = "/PATHTOARCHIV/sw/";
my $SCPARCHIV = 'USER@REMOTE:/PATHTOBACKUP/';
my $GPGID = "xxxxxxxx";
my @SWITCHES = ( "1.1.1.1","1.1.1.2","1.1.1.3", [ETC]);
my $BACKUPPC = "1.1.1.255";
my $TFTP_CON = "/etc/xinetd.d/tftp";
my $TFTP_DIR = "/$DATESTR/";
my $VUURMUUR_RULES = "/etc/vuurmuur/rules/rules.conf";

Diese Angaben sollten natürlich an die jeweilige Umgebung angepasst werden. Bis auf die folgenden sollten alle selbsterklärend sein:
Das $SCPARCHIV ist ein anderer sicherheitsunkritischer Rechner, auf den die gesicherten Konfigurationen GnuPG-Verschlüsselt mit der ID $GPGID geschoben werden um sie auf Tape zu sichern. Sicher ist sicher :-P
$BACKUPPC ist der aktuelle Rechner, auf den die Konfigurationen per TFTP gesichert werden, die TFTP-Konfiguration steht in $TFTP_CON und von aussen ist $TFTP_DIR sichtbar (die Konfiguration des xinetd nehme ich als gegeben an, es ist wichtig, dass der Wert disable=yes standardmäßig in der Datei angegeben wird). Da der aktuelle Rechner weiterhin per IPTables gesichert ist (vuurmuur dient als Frontend), geben wir vuurmuur in der $VUURMUUR_RULES Datei bekannt, dass es TFTP zulassen soll.

Als nächstes wird ein Hash für die Passwörter vorbereitet:

1
2
3
4
5
my %SWPW;
foreach (@SWITCHES)
{
@{$SWPW{$_}} = ("", "");
}

Der erste Wert dient zum Login, der zweite zum "enabeln". Die Werte werden nun abgefragt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
foreach (@SWITCHES)
{
my $switch = $_;
print "Switch Login-Passwort $switch: ";
system ("stty -echo");
chomp (my $SWLOGIN = <> );
print "\n";
system ("stty echo");

print "Switch Enable-Passwort $switch: ";
system ("stty -echo");
chomp (my $SWENABLE = <> );
print "\n";
system ("stty echo");
@{$SWPW{$switch}} = ( $SWLOGIN, $SWENABLE );
}

Mit system ("stty -echo"); wird die Ausgabe des Passworts unterdrückt, so dass niemand ungewollt mitlesen kann.

Jetzt wird TFTP im xinetd eingeschalten:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
open (TFTPIN, "<$TFTP_CON");
my (@lines) = <TFTPIN>;
close (TFTPIN);

open (TFTPOUT, ">$TFTP_CON");
foreach my $line (@lines)
{
if ($line =~ m/disable/i)
{
$line =~ s/yes/no/i;
}
print TFTPOUT $line;
}
close (TFTPOUT);

Es wird also nur die Zeile mit dem Wert disable=yes auf no geändert, der Rest sollte vorkonfiguriert sein. Mit system ("kill -HUP `pidof xinetd`"); wird der Dienst neugestartet.
Ähnliches muss mit vuurmuur geschehen, Wir schalten alle Accept-Regeln ein, die etwas mit TFTP zu tun haben (die Regeln müssen mindestens im Kommentar "tftp" enthalten um sie zu finden!):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
open (VUURMUURIN, "<$VUURMUUR_RULES");
my (@vlines) = <VUURMUURIN>;
close (VUURMUURIN);

open (VUURMUUROUT, ">$VUURMUUR_RULES");
foreach my $line (@vlines)
{
if ($line =~ m/tftp/i)
{
$line =~ s/RULE=";A/RULE="A/;
}
print VUURMUUROUT $line;
}
close (VUURMUUROUT);

Und natürlich die Regeln neu einlesen: system ("vuurmuur_script --reload");.
Soweit zur Vorgeschichte, jetzt wirds spannend. Der nun folgende Teil wird via foreach my $switch (@SWITCHES) für jeden Switch ausgeführt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
my $telnet = new Net::Telnet::Cisco (Host => $switch, Input_log => $LOGDIR."SW_".$switch."_INPUT.log", Errmode=>'die', Timeout => 20);

$ok = $telnet->login (Password => ${$SWPW{$switch}}[0]);
if (!$ok)
{
die "Connection failed!\n";
}

$ok = $telnet->enable (Password => ${$SWPW{$switch}}[1]);
if ($ok != 1)
{
die "Connection failed!\n";
}

$ok = $telnet->cmd("copy running-config startup-config\n");
if ($ok != 1)
{
die "Could not \"copy running-config startup-config!\"\n";
}

system ("chmod -R 777 $BACKUPDIR");

$ok = $telnet->cmd("copy startup-config tftp://".$BACKUPPC.$TFTP_DIR.$switch.".cfg\n\n\n");
if ($ok != 1)
{
die "Could not \"copy startup-config tftp://".$BACKUPPC.$TFTP_DIR.$switch.".cfg!\"\n";
}
system ("chmod -R 700 $BACKUPDIR");

$ok = $telnet->close;
if (!$ok)
{
print "Ups, konnte die Verbindung nicht sauber schliessen\n\n";
}

Zu Beginn wird eine telnet-Session über das Modul Net::Telnet::Cisco eingeleitet. Mit dem Parameter Input_log wird ein Logfile angegeben in dem man später nachvollziehen kann was auf dem Switch passiert ist. Errmode gibt an wie auf Fehler reagiert wird, am sichersten ist natürlich ein Abbruch des Scriptes.
In der Session können wir uns nun über mit $telnet->login (Password => ${$SWPW{$switch}}[0]); mit dem vorher abgefragten Login-Passwort authentifizieren.
Danach bekommt man mit dem enable-Passwort root-Rechte und kann per $telnet->cmd (BEFEHL) Commandos auf dem Switch absetzen, hier natürlich als erstes das Kopieren der laufenden Konfiguration.
Jetzt wird das $BACKUPDIR kurz mit system ("chmod -R 777 $BACKUPDIR"); von aussen beschreibbar gemacht um per TFTP darauf zugreifen zu können. Ein weiteres Kommando schiebt die nun aktuellen Start-Daten auf den Backuprechner. Man beachte die Zeilenumbrüche am Ende des Befehls, denn das Betriebssystem fordert noch ein paar Bestätigungen auf den copy-Befehl, die wir einfach mit Return geben.
Nun das Verzeichnis wieder sichern und die Verbindung zum Switch schliessen. Weiter mit der nächsten Catalyst!

Zum Ende des Scriptes wird nun noch TFTP abgeschalten und die Löcher in der Firewall geschlossen, dazu einfach direkt in das Programm schauen. Wer dies tut wird feststellen, dass noch einiges mehr passiert als hier beschrieben, ist aber eher Feature.

Download: switch-backup.pl (9,48 KB)

Tags: Cisco IOS Netzwerk Perl Security Software

Kategorien: Betriebssystem Netzwerk Sicherheit Software

08. Dec 2009

rancid: Cisco & Co. Backup`s unter Debian

Von: Andi, 12:38:17

Eine andere Möglichkeit Switche und Router zu sichern, bietet das Tool "rancid".

Hier ein kleines How To:

http://blog.aschaller.com/linux/rancid-cisco-und-co-backups-unter-debian.html

© 2009-2014 by Martin Scharm