Hallo Allerseits. In diesem Post geht es um Einstellungen, welche wir an unseren Routern/Switches vornehmen können, um die Sicherheit unseres SSH-Server zu erhöhen.

Bemerkung: Man kann nie von 100% Sicherheit sprechen. Dennoch kann man die Arbeit für den Angreifer erschweren.

SSH besser als Telnet

Ich will hier nicht all so tief ins Detail gehen, denn in einem separaten Beitrag werde ich einige Sachen im Vergleich Telnet vs. SSH schreiben.

Hier geht es eigentlich darum, dass mit uns Telnet ein Protokoll zur Verfügung steht, welches komplett in Klartext kommuniziert. SSH bietet uns da eine Reihe an Sicherheitseinstellungen, um die Integrität der Verbindung zu schützen. Aber wie richten wir das ein?

Für unser Beispiel werde ich zwei Router nehmen (R1 und R3). Gehen wir die Konfiguration Schritt-für-Schritt durch.

Router – R1

Hostname definieren

hostname R1

Interface einrichten

int gig 0/1
 ip address 213.32.25.1 255.255.255.252
 no shut

Benutzer einrichten

Wir richten zuerst einen Benutzer ein, welcher wir später benutzen werden, um auf diesem Gerät zu verbinden.

aaa new-model

aaa authentication login AUTHE local
aaa authorization exec AUTHE local

username ssh algorithm-type scrypt secret ssh

Ein Enable-Kennwort für den EXEC-Modus

enable algorithm-type scrypt secret cisco

SSH-Keys generieren

crypto key gen rsa general-keys modulus 4096 label mypair

SSH-Version festlegen

ip ssh version 2

Nun ist der SSH-Server auf unserem Netzwerkgerät eingerichtet. Aber, darauf haben wir noch keine Sicherheitseinstellungen vorgenommen. Schauen wir uns diese einwenig detaillierter an

Zusätzliche allgemeine Einstellungen für den SSH-Server

ip ssh time-out 30
login block-for 180 attempts 10 within 60
ip ssh authentication-retries 10
ip ssh logging events
login on-failure log
login on-success log

ip ssh time-out 30: Standardmässig wartet der SSH-Server 60 Sekunden beim Authentifizieren, um die Verbindung mit einem Timeout zu beenden. Dieser Wert ist definitiv zu hoch und sollte auf ein Minimum reduziert werden. Hier kann man sich wie bei vielen Einstellungen darüber streiten. Ist dieser Wert zu tief, werde viele Verbindungen abgebrochen, weil der Benutzer nicht in der Lage war das Kennwort rechtzeitig einzugeben. Hierfür benutze ich persönlich 30 Sekunden.

login block-for 180 attempts 10 within 60: Das device stellt automatisch ein ACL und blockt die Dienste für 180 Sekunden, wenn innerhalb von 60 Sekunden 10 fehlerhafte Anmeldeversuche gab.

ip ssh authentication-retries 10: Wie oft nach dem Passwort gefragt wird, bevor die Verbindung geschlossen wird.

ip ssh logging events
login on-failure log
login on-success log

Wir möchten jedes mal ein Ereignis im Log generieren, wenn jemand versucht sich über SSH auf dem Gerät anzumelden. Und so sieht es nun im Log aus:

*Dec 27 12:17:20.147: %SSH-5-SSH2_SESSION: SSH2 Session request from 213.32.25.2 (tty = 0) using crypto cipher 'aes256-ctr', hmac 'hmac-sha2-512' Succeeded
*Dec 27 12:17:24.317: %SEC_LOGIN-4-LOGIN_FAILED: Login failed [user: ssh] [Source: 213.32.25.2] [localport: 22] [Reason: Login Authentication Failed] at 12:17:24 UTC Fri Dec 27 2019
*Dec 27 12:17:26.564: %SEC_LOGIN-5-LOGIN_SUCCESS: Login Success [user: ssh] [Source: 213.32.25.2] [localport: 22] at 12:17:26 UTC Fri Dec 27 2019
*Dec 27 12:17:26.564: %SSH-5-SSH2_USERAUTH: User 'ssh' authentication for SSH2 Session from 213.32.25.2 (tty = 0) using crypto cipher 'aes256-ctr', hmac 'hmac-sha2-512' Succeeded

SSH Default Port umgehen

Unter Umständen kann man auch den SSH standard TCP-Port auf einen anderen Port verlegen. Cisco stellt dafür folgende

ip ssh port 2222 rotary 1

Somit wird der Port für SSH auf 2222 verlegt

Um die Konfiguration erfolgreich abzuschliessen, müssen wir unter der VTY-Konfiguration den Statement „rotatory 1“ noch eingeben.

Verschlüsselung für die Datenverbindung

Dabei handelt es sich um ein symmetrisches Verschlüsselungsverfahren für die Datenverbindung. Für uns bedeutet das, dass Client und Server über den selben Schlüssel besitzen, um die Daten ent- und verschlüsseln zu können. Ergo, wird der Schlüssel am Anfang des Kommunikationsaufbau ausgetauscht. Um diesen Austausch so sicher wie möglich zu machen, benutzen wir ein „Key Exchange Protocol“. In diesem Fall handelt es sich um Diffie-Hellman (DH). Darüber erfahren wir gleich anschliessend in diesem Text.

R1(config)#ip ssh server algorithm encryption ?
 3des-cbc Three-key 3DES in CBC mode
 aes128-cbc AES with 128-bit key in CBC mode
 aes128-ctr AES with 128-bit key in CTR mode
 aes192-cbc AES with 192-bit key in CBC mode
 aes192-ctr AES with 192-bit key in CTR mode
 aes256-cbc AES with 256-bit key in CBC mode
 aes256-ctr AES with 256-bit key in CTR mode
R1(config)#ip ssh server algorithm encryption aes256-ctr

CTR-Mode (Counter) wird über CBC-Mode vorgeschlagen, da im CTR-Mode verschiedene Vorteile gegenüber CBC gibt:

  • Im CBC haben wir Verbreitung von Fehlern, CTR hat das nicht.
  • CTR hat einen Initisialisierungsvektor, CBC nicht.

Diffie-Hellman Schlüsselaustausch

Möchte man einen Verschlüsselungsverfahren benutzen, welcher den selben Schlüssel zum ver- und entschlüsseln braucht, dann spricht man von einer symetrischen Verschlüsselung. Der Austausch der Schlüssel darf also nicht in Klartext geschehen, denn so hätten Lauscher die Möglichkeit ihn zu lesen und für das entschlüsseln der Datenverbindung zu benutzen. Um die Geheimhaltung dieser Schlüssel zu garantieren nutzen wir Diffie-Hellman (DH). Auch hier möchte ich an dieser Stelle nicht ins Detail gehen, denn in diesem Post geht es nur darum, die Dienste so sicher wie möglich zu konfigurieren. Man kann sich Tagelang über Kryptoverfahren auseinander setzen.

R1(config)#ip ssh dh min size ?
   2048  Diffie Group 14 2048-bit key
   4096  Diffie Group 16 4096-bit key
R1(config)#ip ssh dh min size 4096

Rekeying

Bei der Benutzung einer symmetrische Verschlüsselung muss, wie oben erwähnt, den Schlüssel zwischen Client und Server ermittelt werden. Wird dieser aber aus irgendeinem Grund kompromittiert, dann ist unsere Verbindung nicht mehr sicher und kann von einem Angreifer entschlüsselt werden. Rekeying heisst die Prozedur einen Schlüssel erneut zwischen Client und Server auszutauschen. Im IOS lässt sich ein „Rekeying“ nach zwei Prinzipien durchführen:

  • Zeit
  • Datenvolumen
R1(config)#ip ssh rekey time ?
<R1(config)#ip ssh rekey time ?
   <10-1440>  Minutes
 R1(config)#ip ssh rekey volume ?
   <100-4194303>  kilobytes
 R1(config)#ip ssh rekey volume 
ip ssh rekey time 10

Jede 10 Minuten scheint es eine gute Wahl zu sein. Wir können den Rekeying live auf der Console anschauen:

*Dec 28 22:48:19.056: SSH2 0: Initiating rekey based on time
*Dec 28 22:48:19.059: SSH2 0: SSH2_MSG_KEXINIT sent
*Dec 28 22:48:19.087: SSH2 0: SSH2_MSG_KEXINIT received
*Dec 28 22:48:19.088: SSH2 0: kex: client->server enc:aes256-ctr mac:hmac-sha2-512 
*Dec 28 22:48:19.090: SSH2 0: kex: server->client enc:aes256-ctr mac:hmac-sha2-512 
*Dec 28 22:48:19.091: SSH2 0: Using kex_algo = diffie-hellman-group14-sha1
*Dec 28 22:48:19.127: SSH2 0: expecting SSH2_MSG_KEXDH_INIT
*Dec 28 22:48:19.148: SSH2 0: SSH2_MSG_KEXDH_INIT received
*Dec 28 22:48:19.315: SSH2: kex_derive_keys complete
*Dec 28 22:48:19.315: SSH2 0: newkeys: mode 1
*Dec 28 22:48:19.316: SSH2 0: newkeys: rekeying
*Dec 28 22:48:19.318: SSH2 0: SSH2_MSG_NEWKEYS sent
*Dec 28 22:48:19.319: SSH2 0: waiting for SSH2_MSG_NEWKEYS
*Dec 28 22:48:19.364: SSH2 0: newkeys: mode 0
*Dec 28 22:48:19.364: SSH2 0: newkeys: rekeying
*Dec 28 22:48:19.365: SSH2 0: SSH2_MSG_NEWKEYS received

Message Authentication Code (MAC)

hier stellen wir fest welches Algorithmus dafür gebraucht wird. Beim MAC geht es eigentlich darum, dass die Pakete zusätzlich mit einem zuvor berechneten MAC zum Empfänger verschickt werden. Der Empfänger berechnet dieser Wert selber und vergleicht das mit dem erhaltener Code. Stimmen beide überein, dann kann der Empfänger davon ausgehen, dass die Nachricht authentisch ist und dass diese unterwegs nicht manipuliert worden ist.

R1(config)#ip ssh server algorithm mac ?
   hmac-sha1      HMAC-SHA1 (digest length = key length = 160 bits)
   hmac-sha1-96   HMAC-SHA1-96 (digest length = 96 bits, key length = 160 bits)
   hmac-sha2-256  HMAC-SHA2-256 (digest length = 256 bits, key length = 256
                  bits)
   hmac-sha2-512  HMAC-SHA2-512 (digest length = 512 bits, key length = 512
                  bits)
 R1(config)#ip ssh server algorithm mac hmac-sha2-512

Bei Debuggen sieht es wie folgt aus

*Dec 28 22:38:23.641: SSH2 0: ssh_receive: 64 bytes received 
 *Dec 28 22:38:23.642: SSH2 0: input: total packet length of 32 bytes
 *Dec 28 22:38:23.642: SSH2 0: partial packet length(block size)16 bytes,needed 16 bytes,
                maclen 64
 *Dec 28 22:38:23.643: SSH2 0: ssh_receive: 32 bytes received 
 *Dec 28 22:38:23.644: SSH2 0: partial packet length(block size)16 bytes,needed 16 bytes,
                maclen 64
 *Dec 28 22:38:23.644: SSH2 0: MAC compared for #11 :ok

Publickey Authentisierungsmethod

Wir wollen uns nur mit RSA Publickey authentisieren. Das gilt aber nur für unser Beispiel in diesem Beitrag. Daher werden wir nur ssh-rsa eingeben.

R1(config)#ip ssh server algorithm publickey ?
   ssh-rsa         RSA Publickey based authentication
   x509v3-ssh-rsa  RSA Certificate based authentication
R1(config)#ip ssh server algorithm publickey ssh-rsa 

Nur erlaubte Host zulassen

Für diese Aufgabe haben wir zwei Variante. Beide sind korrekt, dennoch Eine ist korrekter als die Andere :).

ACL vs CoPP

Es gibt ein wesentlicher Unterschied zwischen beide Varianten. CoPP wird gegenüber ACL in einen „silent drop“ enden. Der Client erhält irgendwann einen Timeout. Hingegen mit ACL muss der SSH-Server noch eine Nachricht generieren (Connection refused by remote host…). Diese Nachricht muss mit der Hilfe der CPU generiert werden. Lanciert einen Angreifer viele Verbindungsversuche, dann ist der SSH-Server gezwungen, viele Nachrichten zu generieren. Dies kann in einen ungewollten Denia-of-Service Angriff enden, da unser CPU keine Leistung mehr zur Verfügung hat für andere Aufgaben.

Variante 1 – Standard ACL

ip access-list standard 2
permit host 213.32.25.2

Variante 2 – CoPP (Control Plane Protection)

Standard ACL erstellen.

access-list 99 deny tcp 213.32.25.2 255.255.255.255 any eq 22
access-list 99 permit tcp any any eq 22

Class-Map erstellen.

class-map match-all COPP-SSH
match access-group 99

Policy-Map erstellen und unser Class-MAP COPP-SSH miteinbinden.

policy-map COPP-INPUT-POLICY
class COPP-SSH
drop

Unser Policy-Map im Control-Plane einbinden.

control-plane
service-policy input COPP-INPUT-POLICY

Mit dieser „Service-Policy“ kann man den SSH-Verkehr so regulieren, dass nur eine bestimmte IP-Adresse oder Netzwerk auf das Gerät zugreifen kann, das hindert aber niemand daran, sich an LAN- und oder WAN-Interface zu verbinden. Möchte man das auch noch regulieren, so kann man zusätzlich im „control-plane“ ein Interface für den Management Traffic definieren. Somit wird die Sicherheit erhöht.

Unsere VTY konfigurieren

line vty 0 4
  access-class 2 in
  authorization exec AUTHE
  login authentication AUTHE
  rotary 1
  transport preferred ssh
  transport input ssh
  transport output ssh

Bemerkung: Benutzt man CoPP um den SSH-Verkehr zu regulieren, dann muss man auf „access-class 2 in“ verzichten.

Restliche VTY-Linien sperren

line vty 5 924
  no login
  no exec
  transport preferred none
  transport input none
  transport output none

Also, wie sehen die Einstellungen von SSH auf dem Router R1 aus? (Siehe schwarze Markierung)

R1#sh ip ssh
SSH Enabled - version 2.0
Authentication methods:publickey,keyboard-interactive,password
Authentication Publickey Algorithms:ssh-rsa
Hostkey Algorithms:ssh-rsa
Encryption Algorithms:aes256-ctr
MAC Algorithms:hmac-sha2-512
KEX Algorithms:diffie-hellman-group14-sha1
Authentication timeout: 30 secs; Authentication retries: 3
Minimum expected Diffie Hellman key size : 4096 bits
IOS Keys in SECSH format(ssh-rsa, base64 encoded): mypair
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCowFD+2LS/LK76KqqnB0Y0CFL01b0cWNK4IIXVdXw1
FJqXMdrh6xtZZ7kn5ZwNaRkQji/IfRynlxAqNEH1SpgTziXl7baIsnhpkBHR8hey0mCLNQNwSdt36b+m
WfcPJAjzE+B5F1xkHWtCtMXluIZXCu6YLm4xB9zflloh2rGQpkajhq2lVFUh+tCQx3sUAfrO/2kz8brx
5qd9+4io9R6iwx7jsbm/Cd487jhCiUlD07yfg1JG+GDZ/bebiNIvIBjWbxtkwfaLa+jgfMecPESjm3TB
xW+vj9YfSnMZbed1TznJBzW19kwuVx0158oBhzajXl20fz6mGBYTVMaH/AGRgKw06Vl+1Z8P0P+wyhaC
OIW4UNMjUpzv9GRU749apOYY4cmBT0hhMdfQ99PaVRWdtOhi27q1GDPDAEKRAfIvl70X/nREBlRSaNYq
DPllm1PB9WgI3Aga5csXK2MYJM5HpU+/o5LbuH1J/Yz2WA+SjJKOCpe+Wtb98MWaPU56Hi2XiN5URmDk
C9HWtHXy5zOM1ePhW4UPo+vXx5ZZhbhchjUGFNNO9mpy3s92ZfbArkSrF9SNO7dPo236OzeAxYB0EZJN
cUxw1fcLC0pLlhVawcI7C7je1KfEWYukYJeDjrTLs8GE0XsnMeGW19Z8KaVs2/gOexkscynaJ96iKLru
R1#

Nun, wie sieht es jetzt mit der Verbindung aus? Lass uns mal ausprobieren. Verbindung von Router R3 zu R1

R3#
R3#ssh -l ssh 213.32.25.1
Password:
R1>
R1>
R1>en
Password:
R1#

Debug auf Router R1

R1#
*Dec 22 11:46:00.403: SSH0: starting SSH control process
*Dec 22 11:46:00.403: SSH0: sent protocol version id SSH-2.0-Cisco-1.25
*Dec 22 11:46:00.423: SSH0: protocol version id is - SSH-2.0-Cisco-1.25
*Dec 22 11:46:00.423: SSH2 0: kexinit sent: kex algo = diffie-hellman-group14-sha1
*Dec 22 11:46:00.424: SSH2 0: kexinit sent: hostkey algo = ssh-rsa
*Dec 22 11:46:00.424: SSH2 0: kexinit sent: encryption algo = aes256-ctr
*Dec 22 11:46:00.424: SSH2 0: kexinit sent: mac algo = hmac-sha2-512
*Dec 22 11:46:00.425: SSH2 0: send:packet of length 200 (length also includes padlen of 10)
*Dec 22 11:46:00.427: SSH2 0: SSH2_MSG_KEXINIT sent
*Dec 22 11:46:00.427: SSH2 0: ssh_receive: 64 bytes received
*Dec 22 11:46:00.427: SSH2 0: input: total packet length of 312 bytes
*Dec 22 11:46:00.427: SSH2 0: partial packet length(block size)8 bytes,needed 304 bytes,
maclen 0

Momentane Verbindungen überwachen

R1#show ssh
 Connection Version Mode  Encryption  Hmac          State                Username
 0          2.0     IN   aes256-ctr  hmac-sha2-512 Session started       ssh
 0          2.0     OUT  aes256-ctr  hmac-sha2-512 Session started       ssh
 R1#

Und das ist es gewesen. Ich hoffe das war für euch hilfreich. Hier die komplette Konfiguration

hostname R1

int gig 0/1
description *** MGMT Interface ***
ip address 213.32.25.1 255.255.255.252
no shut
exit

username ssh algorithm-type scrypt secret ssh 

enable algorithm-type scrypt secret cisco 

crypto key gen rsa general-keys modulus 4096 label mypair

aaa new-model
aaa authentication login AUTHE local
aaa authorization exec AUTHE local

ip ssh version 2
login block-for 150 attempts 10 within 60
ip ssh authentication-retries 2
ip ssh time-out 30
ip ssh logging events
login on-failure log
login on-success log

ip ssh port 2222 rotary 1 
ip ssh dh min size 4096

ip ssh rekey time 10 

ip ssh server algorithm mac hmac-sha2-512
ip ssh server algorithm publickey ssh-rsa 
ip ssh server algorithm encryption aes256-ctr
ip ssh server algorithm kex diffie-hellman-group14-sha1

ip ssh client algorithm mac hmac-sha2-512
ip ssh client algorithm encryption aes256-cbc aes256-ctr
ip ssh client algorithm kex diffie-hellman-group14-sha1

ip access-list standard 2
permit host 213.32.25.2
exit

line vty 0 4
access-class 2 in
authorization exec AUTHE
login authentication AUTHE
transport preferred ssh
transport input ssh
transport output ssh

line vty 5 924
no login
no exec
transport preferred none
transport input none
transport output none

Hinterlasse einen Kommentar

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..