Anbei eine kurze Anleitung um Cloud Server gegenüber angriffen auf SSH abzusichern. Bitte Beachte das diese Anleitung eine verbessern der Sicherheit gibt aber nicht als alternative für eine Firewall gedacht ist.

Ich zeige euch im Folgenden wir ihr den SSH dienst härtet dazu werden wir folgende Punkte anwenden.

1. Port ändert („dumme“ Bots prüfen ob der SSH Port offen ist und greifen diesen an, diese Bots können wir abwären wenn wir den Port auf einen nicht standart SSH Port ändern. WICHTIG: Nur weil wir den Port änder, bedeutet das nicht das dieser nicht mehr gefunden werden kann!

2. Root User für SSH Sperren

3. RSA KEY für den Login verwenden

4. IP Sperre auf SSH Setzten

5. Standart SSH Port 22 als HonyPot erzeugen (Hilft nicht euch aber anderen) Fair ist wer gibt und nimmt.

Meldet euch am Server an und ruft die Datei „sshd_config“ auf. Ihr konnt auch einen andren Editor wie VI oder ähnliches verwendet. 

				
					nano /etc/ssh/sshd_config
				
			

Hier ändert ihr zu erst den Post von 22 auf einen beliebigem freiem Port z.b 2222

In diesem Beispiel Zeile 22. Das kann sich bei euch aber auch unterscheiden. 

				
					# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Include /etc/ssh/sshd_config.d/*.conf

# When systemd socket activation is used (the default), the socket
# configuration must be re-generated after changing Port, AddressFamily, or
# ListenAddress.
#
# For changes to take effect, run:
#
#   systemctl daemon-reload
#   systemctl restart ssh.socket
#
Port 2007
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

				
			

Danach starten Ihr den Dienst neu. Sobald der dienst neu gestatte ist. Lasst die Aktuelles Session geöffnet und nimmt eine neue um zu testen ob der neue Port angenommen wird. 

				
					systemctl restart ssh.service
				
			

oder

				
					service ssh restart
				
			

über den Befehl „ss -tulpen | grep ssh“ könnt ihr euch den Aktuellen Port ausgeben lassen ss – tulpen zeigt alle Ports die genutzt werden an mit | grep ssh grenzen wir die anzeige auf den für uns relevanten ssh Port ein. 

				
					service ssh restart
				
			

Die Ausgabe sollte wie folgt aussehen.

				
					root@:~# ss -tulpen | grep ssh
tcp   LISTEN 0      4096                           0.0.0.0:2222       0.0.0.0:*    users:(("sshd",pid=32145,fd=3),("systemd",pid=1,fd=60)) ino:15893 sk:19 cgroup:/system.slice/ssh.socket <->                
tcp   LISTEN 0      4096                              [::]:2222          [::]:*    users:(("sshd",pid=32145,fd=4),("systemd",pid=1,fd=61)) ino:15895 sk:2a cgroup:/system.slice/ssh.socket v6only:1 <-> 
				
			

Sollte sich der Port nicht ändern, habt ihr entweder in der SSH Conf etwas falsches gemacht, oder ihr nutzt eine neuer System version.

Ist letzteres der fall so müsst ihr SSH als Socket Stoppen und als Service Starten 

				
					sudo systemctl stop ssh.socket
sudo systemctl restart ssh.service
sudo systemctl status ssh
				
			

Jetzt passen wir die Firewall von System an. indem wir den neuen SSH Port freigeben. 

				
					ufw allow 2222/tcp
				
			

Damit wir später dem root user von SSH aussperren können benötigen wir einen neuen Nutzer. Der Name „meinuser“ könnt ihr nach belieben ändern. 

„useradd“ leg einen neuen nutzer an 

„-g user“ fürgt diesen der Gruppe user hinzu 

„-d /home/meinuser“ legt ein home verzechnis an. dies benötigen wir später um den Öffentlichen Schlüssel abzulegen

„-m -s /bin/bash“ weist dem Nutzer die standart „bash“ zu

 

meinuser ist dann der nutzernahme 

				
					useradd -g users -d /home/meinuser -m -s /bin/bash meinuser
				
			

Mit „passwd“ + meinuser legen wir ein neues Passwort für den Benutzer Fest

				
					passwd meinuser
				
			

Bevor wir weiter machen sollten wir in einer neuen Session testen ob wir uns mit dem neuem Benutzer und dem gerade vergeben Passwort anmelden können. Auch sollten wir testen ob wir mit dem Benutzer root Rechte erlangen können. 

mit „su -“ werden wir aufgefordert das root passwort einzugeben. Wenn wird dies bestätigen sollte unser Promt mit root@ beginnen. 

				
					su -
				
			

Hat alles geklappt gehen wir in unsere root Session zurück und sperren root über die SSH Config aus. Hierzu öffnen wir wieder die sshd_config und ändern die stelle „PermitRootLogin“ von yes auf no. Sollte diese auskomentirt sein, also mit einer # beginnen löschen wir die #

Am ender der Config fügen wir noch 

AllowUser meinuser

DenyUsers root

DenyGroups root

 

hinzu. 

Dies stellt sicher das nur der user „meinuser“ berechtigt ist und der user root und auch die gruppe root ausgeschlossen wird  

				
					PermitRootLogin no

AllowUsers meinuser
DenyUsers root
DenyGroups root


				
			

Die Config speichern und den SSH Server neu starten. 

				
					systemctl restart ssh.service
				
			

oder

				
					service ssh restart
				
			

Jetzt erzeugen wir unseren RSA KEY. Wichtig! Dieser wird nicht auf dem Server sonder auf einem Anderem, möglichst nicht öffentlichem System erzeugt. Dies kann zum Beispiel euer client sein. 

Wenn Ihr mit einem Unix System arbeitet könnt ihr den Befehl für den Key direkt in eurem Terminal eingeben. Unter Windows  emfehle ich das Tool „MobaXterm“ 

Öffnet eine neues Session oder ein neues Terminal. 

ssh-keygen erzeugt den schlüssel

„-b 4096“ gibt die länge an. Stand 2025  ist die die Maximale länge und wird als sicher angesehen. Gilt aber in zunkunft nicht mehr als Qunatensicher (Quelle: Heise 1,)

„-t ras“ gibt als verfahren RSA an 

„-f .ssh/meinuser_key“ den namen um die übersieht zu behalten 

				
					ssh-keygen -b 4096 -t rsa -f .ssh/meinuser_key
				
			

Jetzt müssen wir den Öffentlichen teil des Schlüssels dem Server Bekannt machen. Ihr könnt diese Manuell machen oder ihr nutzt ssh-copy-id

„-i .ssh/meinuser_key“ gibt an welchen schlüssel ihr Bekannt machen wollt 

„-p 2222“ den Port (Da wir diesen bereits von 22 auf 2222 geändert haben müsst ihr hier auch den neuen Port angeben

meinuser@serverip/dns gibt an mit welchem user und server ihr euch verbinden wollt. 

Da wir root bereits ausgeschlossen haben müsst ihr hier schon den neuen User verwenden. 

				
					ssh-copy-id -i .ssh/meinuser_key -p 2007 meinuser@meineserverip
				
			

Jetzt schalten wir die Passwort anmeldung von SSH ab. Hierzu bearbeiten wir wieder die sshd_config und ändern die zeile

PasswordAuthentication 
PermitEmptyPasswords 

von yes auf no

und 

PubkeyAuthentication

von no auf yes

sollte etwas auskommentiert sein (#) enfärt ihr die # 

 

einstellungen speichern und dienst neu starten 

				
					PubkeyAuthentication yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
PermitEmptyPasswords no

				
			
				
					systemctl restart ssh.service
				
			

Teset jetzt in einer neuen Session ob ihr euch noch mit eienm Passwort anmelden könnt. Wenn nicht habt ihr bisher alles richtig gemacht. 

Solltet ihr euch immer noch mit einem Passwort anmelden können. Kontrollirt eure Config erneut auf Fehler. 

Bei manchen Horsten wird eine weiten ssh config geladen. in dieser könnten Einstellungen die ihr getroffen habt überschrieben werden. Kontrollirt auch diese. 

 

ihr findet eine solche zweite config indem ihr in der sshd_config nach „Include“ sucht. Dort ist der Pfad zu einer weiteren Config angegeben welches eure Config überschreibt. 

Kommentiert diese konfig mit einer # aus oder bearbeitet auch diese  

Diesen Schritt nur ausführen wenn ihr eine fest IP v4 Adresse habt!!!

Öffnet die datei /etc/hosts.allow

hier tragt ihr eure Fest IP Adresse ein. Damit gebt ihr an das auf den SSH Dienst nur zugegriffen werden darf wenn die anfrage von eure IP Addresse Kommt 

 

in der datei /etc/host.deny

Tragt ihr All ein. Damit keine Andere IP Adresse zugreifen darf. 

 

 

				
					nano /etc/hosts.allow
				
			
				
					# /etc/hosts.allow: list of hosts that are allowed to access the system.
#                   See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: LOCAL @some_netgroup
#             ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#

sshd: eure IP

				
			
				
					nano /etc/hosts.deny
				
			
				
					# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
#                  See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: some.host.name, .some.domain
#             ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#
# The PARANOID wildcard matches any host whose name does not match its
# address.
#
# You may wish to enable this to ensure any programs that don't
# validate looked up hostnames still leave understandable logs. In past
# versions of Debian this has been the default.
# ALL: PARANOID

sshd:all

				
			

Euer SSH dienst ist jetzt gehärtet. Vergesst nicht das dies keine Firewall ersetzt. 

Weitere Möglichkeiten die ich empfehle sind. Eine Firewall vor den Server zu stellen. 

Eine möglichkeit sind die Firewalls der Firma Securepoint, welche auch ich einsetzte.  

An dieser stelle wäre eine weite option den Server von außen nur für die Port zu öffnen die Benötigt werden z.b. bei einem Webser HTTP (80) und HTTPS (443) diese dann durch eien Reverse Proxy über die Firewall auf dem Server zu Leiten. 

Administration könne man über eine VPN Tunnel Realisieren. Welcher auch mit der Firewall abzubilden ist. 

Wenn ihr eure Server in der Terra-Cloud mietet ist  immer eine Securepoint Firewall vor euren Server und im Preis enthalten. 

Alle Server sind auch bei Ehlert.IT zu erwerben, gerne übernehmen wir auch den Service und die Wartung.  

Der Lezte Schritt sicher nicht mehr direckt euren Server ab. Mach das Internet aber zu einem Besserem Ort. 

Mit SSHTarpet öffnen wir den Port 22. Bots erwarten Dort eienn SSH server und versuchen sich mit diesem zu verbinden. Das Tool speilt mit und lässt den Angeifer glauben er habe einen SSH Server zum eingreifen gefunden. Es werden immer wieder kleine Datenparkete gesendet so das der Angeifer am Port „Kleben Bleibt“ ohne das dies eine gefar für euren Server darstellt. 

Ihr Selbst habt nichts davon aber in der zeit wo der angreifer bei euch ist hat dieser keien zeit sich um andre zu kümmern. Somit sicher ihr nicht euch weiter ab aber nimmt dem Angreifern Resuchen andere zu Attakiren. 

 

Das Ganze ist natürlich recht vereinfacht auchgedruückt. vermittelt aber sicherlich ein überblick wie es grundsetzlich funktionirt. 

 

installiert dazu endlessh

 

				
					apt-get install endlessh
				
			

In die Config tragt ihr folgendes ein.

				
					nano /etc/endlessh
				
			
				
					port 22
Delay 10000
MayLineLength 32
MaxClients 4096
LogLevel 0
BindFamily 0
				
			

Leave a comment