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