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:

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

Und nun das Vlan 3 für die DMZ:

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

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

<br />
ciscoasa(config)# int vlan 3<br />
ciscoasa(config-if)#  description DMZ<br />
ciscoasa(config-if)#  nameif DMZ<br />
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.<br />
ciscoasa(config-if)#  no forward interface Vlan2<br />
ciscoasa(config-if)#  nameif DMZ<br />
INFO: Security level for "DMZ" set to 0 by default.<br />
ciscoasa(config-if)#  security-level 50<br />
ciscoasa(config-if)#  ip address 172.16.1.1 255.255.255.0<br />

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:

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

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.

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

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

<br />
TS#sh line<br />
Tty Typ     Tx/Rx    A Modem  Roty AccO AccI   Uses   Noise  Overruns   Int<br />
*     0 CTY              -    -      -    -    -      0       0     0/0       -<br />
33 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
34 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
35 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
36 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
37 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
38 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
39 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
40 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
41 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
42 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
43 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
44 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
45 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
46 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
47 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
48 TTY   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
65 AUX   9600/9600  -    -      -    -    -      0       0     0/0       -<br />
*    66 VTY              -    -      -    -    -      1       0     0/0       -<br />
67 VTY              -    -      -    -    -      0       0     0/0       -<br />
68 VTY              -    -      -    -    -      0       0     0/0       -<br />
69 VTY              -    -      -    -    -      0       0     0/0       -<br />
70 VTY              -    -      -    -    -      0       0     0/0       -<br />
71 VTY              -    -      -    -    -      0       0     0/0       -<br />
72 VTY              -    -      -    -    -      0       0     0/0       -<br />
73 VTY              -    -      -    -    -      0       0     0/0       -<br />
74 VTY              -    -      -    -    -      0       0     0/0       -<br />
75 VTY              -    -      -    -    -      0       0     0/0       -<br />
76 VTY              -    -      -    -    -      0       0     0/0       -<br />
77 VTY              -    -      -    -    -      0       0     0/0       -<br />
78 VTY              -    -      -    -    -      0       0     0/0       -<br />
79 VTY              -    -      -    -    -      0       0     0/0       -<br />
80 VTY              -    -      -    -    -      0       0     0/0       -<br />
81 VTY              -    -      -    -    -      0       0     0/0       -</p>
<p>Line(s) not in async mode -or- with no hardware support:<br />
1-32, 49-64<br />

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.

<br />
!<br />
interface Loopback0<br />
ip address 172.16.1.1 255.255.255.255<br />
!<br />

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.

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

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

<br />
TS#telnet 172.16.1.1 2033<br />
Trying 172.16.1.1, 2033 ... Open<br />
R1><br />


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:

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

Dann folgen die Menü-Einträge:

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


Und nun noch die dazu gehörenden Kommandos:

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

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

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

Aliase

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

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

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

<br />
!<br />
menu TS clear-screen<br />
menu TS line-mode<br />
!<br />

Die 16 asynchronen Lines werden auch noch konfiguriert:

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

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.

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

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

<br />
username ccierack secret 0 <irgend ein Passwort><br />

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

<br />
username ccierack secret 5 $1$32nv$VwvdXY4bFIQl.xD2SWYoP1<br />

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.

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

 

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.