Archiv für den Monat: August 2011

Mit einer Cisco ASA 5505 mit Basic Lizenz eine DMZ aufbauen

DMZ in Cisco ASA 5505

Die Cisco ASA 5505 Firewall ist ja ein super tolles Gerät mit dem man allerlei Sachen anstellen kann. Leider gibt es für die kleine ASA aber zwei unterschiedliche Lizenzen, einmal die Basic Lizenz und einmal die Security Plus Lizenz. Die Preisdifferenz macht dann zwischen den beiden Lizenzen Modellen ca. 400 € aus, die man eventuell sparen kann.

Mit der Basic Lizenz kann man zwar theoretisch 3 Vlans anlegen, leider ist das dritte Vlan aber kein vollwertiges Vlan. Somit ist es fast unmöglich eine DMZ aufzubauen, da das dritte Vlan nur zu einem der beiden anderen Vlans eine Verbindung aufbauen kann. Wenn man nun doch eine DMZ benötigt, dann muss man sich im Vorfeld darüber Gedanken machen ob Geräte in der DMZ mit dem Inside oder dem Outside Vlan Verbindungen aufbauen müssen. Beides gleichzeitig geht nicht. Hosts die von Inside oder Outside  eine Verbindung zur DMZ aufbauen wollen funktionieren dagegen einwandfrei.

Cisco ASA 5505 mit DMZ Hier einmal die Konfiguration für das Inside und Outside Vlan:

!
interface Vlan1
nameif inside
security-level 100
ip address 192.168.1.1 255.255.255.0
!
interface Vlan2
nameif outside
security-level 0
ip address 192.168.2.1 255.255.255.0
!

Und nun das Vlan 3 für die DMZ:

!
interface Vlan3
description DMZ
no forward interface Vlan2
nameif DMZ
security-level 50
ip address 172.16.1.1 255.255.255.0
!

Besonderheit der Konfiguration

Beim Anlegen der DMZ per ASDM wird ein Fehler gemeldet, da der ASDM erst den nameif DMZ Eintrag erstellt und dann den no forward interface Vlan2 Eintrag. Mit der Basic Lizenz muss die Reihenfolge genau umgedreht sein, so wie im Beispiel. Die ASA setzt hier mit der Lizenz Prüfung an und meldet den Fehler

ciscoasa(config)# int vlan 3
ciscoasa(config-if)#  description DMZ
ciscoasa(config-if)#  nameif DMZ
ERROR: This license does not allow configuring more than 2 interfaces with nameif and without a "no forward" command on this interface or on 1 interface(s) with nameif already configured.
ciscoasa(config-if)#  no forward interface Vlan2
ciscoasa(config-if)#  nameif DMZ
INFO: Security level for "DMZ" set to 0 by default.
ciscoasa(config-if)#  security-level 50
ciscoasa(config-if)#  ip address 172.16.1.1 255.255.255.0

falls die Einträge in der falschen Reihenfolge eingegeben werden.

Entscheidend ist also der Eintrag no forward interface VlanX mit dem ich vorher bestimmen muss zu welchem Interface ich aus der DMZ keine Verbindung aufbauen möchte. Wer einen Web-Server betreiben will, der wählt das Outside Interface zum Sperren aus, da dort die Verbindungen immer vom Kunden aufgebaut werden, also von Außen. Gleichzeitig muss der Web-Server aber Logfiles oder Syslog-Meldungen an das Interne Interface weiter leiteten, um sie dort auf einem sicheren Server zu speichern.

Cisco: EEM Script und Autocommand klappt nicht

EEM Script

Auf einem Cisco Router habe ich ein EEM Script installiert, welches so auf anderen Routern schon gelaufen ist. Auf diesem Router gibt es aber nur eine Fehlermeldung beim Aufruf des Scripts:

000629: Aug 25 13:50:22 CET: %HA_EM-6-LOG: userpass : DEBUG(cli_lib) : : CTL : cli_open called.
000630: Aug 25 13:50:42 CET: %HA_EM-3-FMPD_CLI_CONNECT: Unable to establish CLI session: timeout error

In den bekannten Suchmaschienen ist zu der Fehlermeldung nichts zu finden. Auf den Seiten des Herstellers gibt es nur eine ähnliche Fehlermeldung, die besagt das es nur eine Info-Meldung ist die nicht beachtet werden muss. Fakt ist aber das dieses Script so auf dem Router zwar gestartet wird aber nicht durch läuft. Beim Ersten Zugriff auf eine vty-Line bleibt das Script stehen.

Nach langem Suchen und probieren habe ich dann des Rätsels Lösung gefunden. Das Script startet und beendet sich nach der default Laufzeit von 20 Sekunden mit einer Fehlermeldung. Der Grund dafür war ein Autocommand Eintrag auf den vty-Lines, der automatisch bei Anmeldung am Router ein Menü aufbauen sollten.

Um den Fehler zu umgehen muss ein Benutzer angelegt werden, unter dem die EEM-Steuerung läuft. Für den Benutzer reicht das Privileg 0 aus, er sollte aber ein sehr sicheres Passwort haben. Das Passwort wird später nie wieder benötigt, da die EEM-Steuerung für die Anmeldung am Router die Authentisierung überspringt. Der Benutzer könnte so aussehen:

username eem privilege 0 secret D3%ßk234r87a&G$HJ5df3f


Damit die EEM-Steuerung auch unter dem Benutzerkonto arbeitet muss ihr das bekannt gegeben werden mit dem Befehl:

event manager session cli username eem


Desweitern müssen von allen vty-Lines die Autocommands entfernt werden. Diese müssen dafür an jeden lokalen Benutzer ausser dem eem Benutzer angehängt werden.

conf t
 line vty 0 4
 no autocommand
 exit
 username abc autocommand menu TS
 username def autocommand menu TS
 end
 

Damit ist der Fehler dann beseitigt und die EEM-Steuerung läuft wie erwartet.

 

Cisco IOS: Terminal Server Menü

Terminal Server Menü

Wer schon mal ein schickes Terminal Server Menü auf einem Router haben wollte um an seinem LAB ohne lange Befehls Sequenzen auf die Oberfläche anderer Router kommen wollte, für den ist das hier genau das richtige.

Terminal Server Menü auf Cisco Router

Für den Aufbau eines Terminal Servers benötigt man neben einem Cisco Router mit Network-Modul Einschub einen passende Line-Card welche die Asynchronen seriellen Ports zur Verfügung stellt. In meinem Router habe ich dazu eine NM-16A= verbaut. Die gab es für billiges Geld im Internet beim Chinesen um die Ecke.

Die Serielle Karte

Nach dem Einbau der Karte und booten des Routers kann man das Modul per Software sehen.

TS#sh inventory
NAME: "Sixteen Port Low-Speed Async", DESCR: "Sixteen Port Low-Speed Async"
PID: NM-16A=           , VID: 0.1, SN: xxxxxxxx

Mit dem nächsten Befehl werden die Nummern der Lines ermittelt um nachher die richtige Zuordnung machen zu können.

TS#sh line
Tty Typ     Tx/Rx    A Modem  Roty AccO AccI   Uses   Noise  Overruns   Int
*     0 CTY              -    -      -    -    -      0       0     0/0       -
33 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
34 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
35 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
36 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
37 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
38 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
39 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
40 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
41 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
42 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
43 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
44 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
45 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
46 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
47 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
48 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -
65 AUX   9600/9600  -    -      -    -    -      0       0     0/0       -
*    66 VTY              -    -      -    -    -      1       0     0/0       -
67 VTY              -    -      -    -    -      0       0     0/0       -
68 VTY              -    -      -    -    -      0       0     0/0       -
69 VTY              -    -      -    -    -      0       0     0/0       -
70 VTY              -    -      -    -    -      0       0     0/0       -
71 VTY              -    -      -    -    -      0       0     0/0       -
72 VTY              -    -      -    -    -      0       0     0/0       -
73 VTY              -    -      -    -    -      0       0     0/0       -
74 VTY              -    -      -    -    -      0       0     0/0       -
75 VTY              -    -      -    -    -      0       0     0/0       -
76 VTY              -    -      -    -    -      0       0     0/0       -
77 VTY              -    -      -    -    -      0       0     0/0       -
78 VTY              -    -      -    -    -      0       0     0/0       -
79 VTY              -    -      -    -    -      0       0     0/0       -
80 VTY              -    -      -    -    -      0       0     0/0       -
81 VTY              -    -      -    -    -      0       0     0/0       -

Line(s) not in async mode -or- with no hardware support:
1-32, 49-64

Hier sieht man schon das die Lines TTY 33 bis TTY 48 von der Line-Card sind und als asynchrone Ports dienen. Diese Nummern werden in einem der nächsten Schritte benötigt um eine Zuordnung von analogen Lines zu einer IP-Adresse herzustellen.

Konfiguration

Als erstes muss der Router aber mal eine IP-Adresse bekommen, die später von Außen erreichbar ist und an die die analogen Lines gebunden werden können. Da die IP-Adresse fest konfiguriert werden muss bietet es sich an dies an einem Loopback Interface zu binden.

!
interface Loopback0
ip address 172.16.1.1 255.255.255.255
!

Die verwendete IP-Adresse ist erst mal egal, da sie nur intern im Router verwendet wird und nicht zwingend von Außen sichtbar sein muss.

Nun werden die einzelnen TTY-Lines an die IP-Adresse vom Loopback-Interface gebunden. Die TCP-Ports errechnen sich aus der Zahl 2000 + der Line Nummer. Für den Host R1 also 2000 + Line 33 = 2033.

ip host R1 2033 172.16.1.1
ip host R2 2034 172.16.1.1
ip host R3 2035 172.16.1.1
ip host R4 2036 172.16.1.1
ip host R5 2037 172.16.1.1
ip host R6 2038 172.16.1.1
ip host SW1 2039 172.16.1.1
ip host SW2 2040 172.16.1.1
ip host SW3 2041 172.16.1.1
ip host SW4 2042 172.16.1.1
ip host BB1 2043 172.16.1.1
ip host BB2 2044 172.16.1.1
ip host BB3 2045 172.16.1.1
ip host PDU 2046 172.16.1.1

Damit ist der Router R1 per Telnet IP 172.16.1.1 Port 2033 erreichbar.

TS#telnet 172.16.1.1 2033
Trying 172.16.1.1, 2033 ... Open
R1>


Soweit funktioniert der Verbindungsaufbau und der angeschlossene Router R1 ist erreichbar. Mit der Tastenkombination <Strg>-<Umschalt>-6 x wird die Verbindung abgebrochen und der Promt kehrt wieder zum Terminal Server zurück.

Kommen wir nun zum Aufbau des Menüs. Dieser gliedert sich auf in Titel, Text und Kommandos.

Das Menü

Als erstes der Menü Titel:

!
menu TS title ^
********************************************************************
CCIE Lab Terminal Server from Carsten Ellermann
To exit from a device, use CTRL+SHIFT+6 then press x
********************************************************************
^
!

Dann folgen die Menü-Einträge:

!
menu TS text 1 R1  - 2651XM         9          SW3 - 3560
menu TS text 2 R2  - 2651XM        10          SW4 - 3560
menu TS text 3 R3  - 2651XM        11          BB1 - 2651XM
menu TS text 4 R4  - 2811          12          BB2 - 2621
menu TS text 5 R5  - 2801          13          BB3 - 2611
menu TS text 6 R6  - 2801          14          PDU - Power unit
menu TS text 7 SW1 - 3550          15          empty
menu TS text 8 SW2 - 3550          16          empty
menu TS text s show all established sessions
menu TS text c<no> clear the session by number ie: c7
menu TS text e menu-exit
menu TS text q Quit terminal server session
menu TS prompt ^ Your selection : ^
!


Und nun noch die dazu gehörenden Kommandos:

!
menu TS command 1 resume R1 /connect telnet R1
menu TS command 2 resume R2 /connect telnet R2
menu TS command 3 resume R3 /connect telnet R3
menu TS command 4 resume R4 /connect telnet R4
menu TS command 5 resume R5 /connect telnet R5
menu TS command 6 resume R6 /connect telnet R6
menu TS command 7 resume SW1 /connect telnet SW1
menu TS command 8 resume SW2 /connect telnet SW2
menu TS command 9 resume SW3 /connect telnet SW3
menu TS command 10 resume SW4 /connect telnet SW4
menu TS command 11 resume BB1 /connect telnet BB1
menu TS command 12 resume BB2 /connect telnet BB2
menu TS command 13 resume BB3 /connect telnet BB3
menu TS command 14 resume PDU /connect telnet PDU
menu TS command s show sessions
menu TS options s pause
menu TS command e menu-exit
menu TS command q exit
!

Zusätzlich werden noch ein paar Kommandos benötigt um eine bestehende Verbindung zu einem Router wieder zu trennen:

!
menu TS command c1 c1
menu TS command c2 c2
menu TS command c3 c3
menu TS command c4 c4
menu TS command c5 c5
menu TS command c6 c6
menu TS command c7 c7
menu TS command c8 c8
menu TS command c9 c9
menu TS command c10 c10
menu TS command c11 c11
menu TS command c12 c12
menu TS command c13 c13
menu TS command c14 c14
!

Aliase

Damit diese Kommandos funktionieren müssen noch ein paar Aliase definiert werden:

!
alias exec c1 disconnect R1
alias exec c2 disconnect R2
alias exec c3 disconnect R3
alias exec c4 disconnect R4
alias exec c5 disconnect R5
alias exec c6 disconnect R6
alias exec c7 disconnect SW1
alias exec c8 disconnect SW2
alias exec c9 disconnect SW3
alias exec c10 disconnect SW4
alias exec c11 disconnect BB1
alias exec c12 disconnect BB2
alias exec c13 disconnect BB3
alias exec c14 disconnect PDU
!

Damit nachher alles schön aussieht wird der Bildschirm noch einmal gelöscht bevor das Menü aufgebaut wird:

!
menu TS clear-screen
menu TS line-mode
!

Die 16 asynchronen Lines werden auch noch konfiguriert:

!
line 33 48
exec-timeout 0 0
logging synchronous
no exec
transport input telnet
transport output none
!

Die Lines

Zum Schluss fehlen jetzt noch die VTY Lines mit denen man Remote auf den Terminal Server zugreifen kann. Hier gibt es ein paar Punkte zu beachten:

  1. Das erstellte Menü wird mit dem Befehl autocommand menu TS automatisch ausgeführt, sobald eine Verbindung zum Terminal Server besteht.
  2. Mit dem Befehl transport input telnet ssh besteht die Möglichkeit sich per Telnet oder SSH auf dem Terminal Server einzuloggen.
  3. Der Befehl transport output telnet ist notwendig wenn die eingehende Verbindung per SSH aufgebaut wurde. Hier findet dann eine Protokoll Konvertierung von SSH nach Telnet statt und dafür muss es der Line gestattet werden ausgehend Telnet zu nutzen.
  4. Beim Router werden normal nur die VTY Lines 0 – 4 angelegt. Ich benutze zusätzlich noch die VTY Lines 5 – 15, damit ich später zu jedem angeschlossenen Gerät gleichzeitig eine Verbindung offen halten kann.
  5. Der Login auf den Terminal Server wird wegen login local mit der lokalen Benutzer Datenbank abgeglichen. Dazu muss dann auf dem Router noch ein lokaler Benutzer definiert werden für den aber das Privileg 1 ausreicht. Siehe hierzu auch den Link.

Damit ist das komplette Menü erstellt und lässt sich von nun an benutzen.

!
line vty 0 4
exec-timeout 0 0
logging synchronous
login local
autocommand  menu TS
transport input telnet ssh
transport output telnet
line vty 5 15
exec-timeout 0 0
logging synchronous
login local
autocommand  menu TS
transport input telnet ssh
transport output telnet
!

Für Anregungen und Hinweise bin ich sehr dankbar.

 

Cisco IOS: „sicheres“ Passwort mittels EEM neu vergeben

Passwort generieren

Wer schon mal nach einer Lösung gesucht hat um auf einem Cisco Router zu einem Username automatisiert ein neues zu vergeben kann mal den Code ausprobieren. Das kann interessant sein um bei einem Test Gerät oder Terminal Server regelmäßig ein neues Passwort zu bekommen.
Für die unter Euch die sich einen TS mit einem alten Router aufbauen wollen sei noch erwähnt das die Befehle erst ab IOS 12.4(22)T funktionieren.

Da Cisco im IOS keine Random-Funktion eingebaut hat wird es schwierig an zufällige Zeichen zu kommen. Ich habe mich dazu entschieden eine Zeichenfolge aus einer MD5 Zeichenkette zu benutzen. Dazu habe ich einen Benutzer ‚ccierack‘ angelegt mit dem Befehl

username ccierack secret 0 <irgend ein Passwort>

Bei einem „show run“ sieht das nachher so aus:

username ccierack secret 5 $1$32nv$VwvdXY4bFIQl.xD2SWYoP1

Nun muss man nur noch ein paar Zeichen auswählen (z.B. Zeichen 32 – 39) und damit ein neues Passwort eintragen.

Zeit gesteuert

Das neue Passwort wird dann per Mail an den Empfänger gesendet und ist sofort gültig. Als Zeitsteuerung habe ich einen Cron-Eintrag gebaut, der jeden Samstag um 12:00 Uhr das Passwort neu setzt.

event manager applet userpass
event timer cron cron-entry "0 12 * * 6"
action 0.1 set mailsrv "<SMTP-Server-IP>"
action 0.2 set sender "<cisco-ts@Deine-Domain.de>"
action 0.3 set receiver "<Empfaenger@Deine-Domain.de>"
action 0.4 set mailsubject "Neues PW fuer den Cisco Terminal Server"
action 1.1 cli command "enable"
action 1.2 cli command "sh run | inc ccierack"
action 1.3 set result "$_cli_result"
action 1.4 string range "$result" 32 39
action 1.5 set newpw "$_string_result"
action 2.1 cli command "conf t"
action 2.2 cli command "username ccierack secret 0 $newpw"
action 2.3 cli command "end"
action 3.1 syslog msg "New Password for user 'ccierack' is '$newpw'."
action 3.2 mail server "$mailsrv" to "$receiver" from "$sender" subject "$mailsubject" body " Das neue Passwort fuer den Benuter 'ccierack' lautet '$newpw'. Alles ohne ''!"

 

Die Mail sieht dann etwa so aus:

Das neue Passwort fuer den Benuter 'ccierack' lautet 'Px$T9Xfo'. Alles ohne ''!

Viel Spaß beim Ausprobieren und Erweitern.