{"id":8851,"date":"2022-04-30T23:18:39","date_gmt":"2022-04-30T21:18:39","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=8851"},"modified":"2022-12-12T20:03:19","modified_gmt":"2022-12-12T18:03:19","slug":"ssh-absichern-so-haertest-du-ssh-auf-einem-raspberry-pi-linux-server-mit-debian-grundlagen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/ssh-absichern-so-haertest-du-ssh-auf-einem-raspberry-pi-linux-server-mit-debian-grundlagen\/","title":{"rendered":"SSH Absichern: So h\u00e4rtest du SSH auf einem Raspberry Pi\/Linux Server mit Debian (Grundlagen)"},"content":{"rendered":"<p>SSH ist das Standard-Protokoll schlechthin, um Linux-Systeme zu administrieren. \u00dcber die Standardeinstellungen hinaus sollte man jedoch ein paar Sicherheitsvorkehrungen treffen &#8211; vor allem dann, wenn das System per Internet erreichbar ist.<\/p>\n<h2 class=\"wp-block-heading\">Vorbereitungen<\/h2>\n<p>Falls noch nicht geschehen, installiere zuerst einen SSH-Server. Dies variiert etwas, je nach Plattform und Betriebssystem.<\/p>\n<h3 class=\"wp-block-heading\">SSH auf dem Raspberry Pi aktivieren<\/h3>\n<p>Auf dem Pi l\u00e4sst sich dies \u00fcber den Aufruf von <strong>sudo raspi-config<\/strong> schnell erledigen: Navigiere zu <strong>3 Interface Options<\/strong> und <strong>I2 SSH<\/strong>. Sobald du der Nachfrage zustimmst, ist SSH aktiv und <a href=\"https:\/\/u-labs.de\/portal\/der-beste-kostenfreie-ssh-client-fuer-windows-mobaxterm-vorgestellt-mit-10-vorteilen-fuer-dich\/\" title=\"Der BESTE kostenfreie SSH-Client f\u00fcr Windows: MobaXterm vorgestellt mit 10 Vorteilen f\u00fcr dich\">mit einen SSH-Client kann auf die IP-Adresse oder den Hostname deines Pis zugegriffen werden<\/a>.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/04\/grafik-22.png\"><img loading=\"lazy\" decoding=\"async\" width=\"499\" height=\"321\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/04\/grafik-22.png\" alt=\"\" class=\"wp-image-8852\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/04\/grafik-22.png 499w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/04\/grafik-22-300x193.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/04\/grafik-22-70x45.png 70w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/a><\/figure>\n<\/div>\n<h3 class=\"wp-block-heading\">SSH auf anderen Linux-Systemen aktivieren<\/h3>\n<p>Mietest du einen virtuellen Server bei einem Hoster, ist SSH in der Regel bereits aktiviert. Bei selbst aufgesetzten VMs muss ggf. vorher ein SSH-Server installiert werden. Am verbreitesten ist OpenSSH. Unter Debian\/Ubuntu l\u00e4sst er sich wie folgt installieren und aktivieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo apt install openssh-server\nsudo systemctl start sshd<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Absichern des SSH-Servers<\/h2>\n<p>Die zentrale Konfigurationsdatei des OpenSSH-Servers ist <strong>\/etc\/ssh\/sshd_config<\/strong> &#8211; viele der folgenden Einstellungen werden wir darin vornehmen. <a href=\"https:\/\/linux.die.net\/man\/5\/sshd_config\" title=\"Sie ist hier dokumentiert.\" target=\"_blank\" rel=\"nofollow\">Sie ist hier dokumentiert.<\/a> Du solltest die Konfigurationsdatei mit root-Rechten<a href=\"https:\/\/u-labs.de\/portal\/dateien-mit-dem-raspberry-pi-bearbeiten-4-wege-fuer-einsteiger-grafisch-und-mit-nano-vim-auf-der-konsole\/\" title=\"Dateien mit dem Raspberry Pi bearbeiten: 4 Wege f\u00fcr Einsteiger \u2013 Grafisch und mit Nano\/vim auf der Konsole\"> und einem Texteditor deiner Wahl (etwa nano oder vim) \u00f6ffnen<\/a>, um die Einstellungen zu pr\u00fcfen bzw. \u00c4nderungen vornehmen zu k\u00f6nnen.<\/p>\n<p>Viele der genannten Konfigurationseinstellungen sind bereits in der Datei enthalten, aber entweder nicht aktiviert oder sogar auskommentiert. Letzteres ist der Fall, wenn die Zeile mit einer Raute # beginnt. Hier kannst du einfach die Raute entfernen und die vorhandenen Zeilen ggf. anpassen, falls n\u00f6tig.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">#PermitEmptyPasswords no<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Leere Passw\u00f6rter verbieten<\/h3>\n<p>Linux erlaubt es theoretisch, Konten mit leeren Passw\u00f6rtern zu erstellen. Aus Sicherheitsgr\u00fcnden sollte man das nat\u00fcrlich nicht tun. Falls es aus irgend einem Grund dennoch geschieht, macht es Sinn, zumindest den Login per SSH damit zu verbieten. Dies erm\u00f6glicht die Einstellung PermitEmptyPasswords:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">PermitEmptyPasswords yes<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Keine direkte Anmeldung des &#8222;root&#8220; Benutzers<\/h3>\n<p>Der &#8222;Administrator&#8220; unter Linux hei\u00dft &#8222;root&#8220; und kann sich auch per SSH anmelden. Grunds\u00e4tzlich ist es sicherheitstechnisch schlechte Praxis, sich direkt als root anzumelden. Zumal dies dazu verleitet, alle Befehle mit diesem Konto auszuf\u00fchren, auch wenn dies gar nicht immer notwendig ist. Am besten deaktiviert man den SSH-Login f\u00fcr root daher:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">PermitRootLogin no\n# Alternativ\nPermitRootLogin prohibit-password<\/code><\/pre>\n<p><strong>Aber Achtung<\/strong>: In diesem Falle solltest du zuvor mindestens ein weiteres Konto erstellen, dass root-Rechte per sudo erlangen kann! Ansonsten lassen sich administrative Aufgaben nicht mehr per SSH ausf\u00fchren bzw. man sperrt sich sogar komplett aus, wenn \u00fcberhaupt kein weiteres Konto existiert. <\/p>\n<p>Falls du den Login f\u00fcr root nicht g\u00e4nzlich deaktivieren m\u00f6chtest, kann <strong>prohibit-password<\/strong> ein Kompromiss darstellen. Dadurch ist die Anmeldung nur per SSH-Schl\u00fcssel notwendig. Dies ist \u00fcbrigens grunds\u00e4tzlich eine sinnvolle Idee, da ein privater Schl\u00fcssel schwieriger mit roher Gewalt zu knacken ist als ein Passwort. <\/p>\n<p>Wer bereits komplett auf SSH-Schl\u00fcssel setzt, kann die Anmeldung per Passwort ggf. auch komplett deaktivieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">PasswordAuthentication no<\/code><\/pre>\n<p>Man sollte allerdings sicherstellen, dass die SSH-Schl\u00fcssel sicher aufbewahrt werden. Ansonsten besteht auch hier das Risiko, sich selbst auszusperren.<\/p>\n<h3 class=\"wp-block-heading\">SSH-Zugriff f\u00fcr bestimmte Benutzer erlauben\/verbieten<\/h3>\n<p>Auf einigen Systemen gibt es auch Systembenutzer, die nur auf dem selbst ben\u00f6tigt werden und sich nicht per SSH verbinden k\u00f6nnen sollen. Hierf\u00fcr gibt es <strong>AllowUsers\/DenyUsers<\/strong>. Ich w\u00fcrde grunds\u00e4tzlich Whitelisting bevorzugen, da es weniger fehleranf\u00e4llig ist. Mehrere Benutzer lassen sich mit einem Leerzeichen getrennt angeben:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">AllowUsers daniel max<\/code><\/pre>\n<p>Handelt es sich um eine gr\u00f6\u00dfere Anzahl Benutzer, kann man eine Gruppe verwenden und diese entsprechend mit <strong>AllowGroups\/DenyGroups<\/strong> angeben.<\/p>\n<h3 class=\"wp-block-heading\">X11 Weiterleitung deaktivieren<\/h3>\n<p>Die X11-Weiterleitung erm\u00f6glicht es, ein grafisches Programm auf dem entfernten Server zu starten und dessen Oberfl\u00e4che (per X-Server dargestellt) auf unserem Client darzustellen. Der Server ben\u00f6tigt daf\u00fcr keine grafische Oberfl\u00e4che. Das kann praktisch sein, aber bietet theoretisch zus\u00e4tzliche Angriffsfl\u00e4che. Wer es nicht braucht, sollte es daher deaktivieren &#8211; sicherheitstechnisch ein guter Grundsatz. Unter Debian und dem Raspberry Pi OS ist es n\u00e4mlich standardm\u00e4\u00dfig aktiviert. Zur Deaktivierung setzt man folgende Eigenschaft auf <strong>no<\/strong>:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">X11Forwarding no<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Alte Protokollversionen verbieten<\/h3>\n<p>Das SSH-Protokoll ist bereits seit etlichen Jahren in Version 2 verf\u00fcgbar, die Schwachstellen gegen\u00fcber V1 behebt. Standardm\u00e4\u00dfig wird aber auch die alte Version 1 akzeptiert. Besser ist es, explizit nur Version 2 zu erlauben:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">Protocol 2<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Maximale Authentifizierungsversuche begrenzen<\/h3>\n<p>\u00dcber MaxAuthTries kann angegeben werden, nach wie vielen (vergeblichen) Authentifizierungsversuchen die Verbindung getrennt wird. Unter Debian und dem Raspberry Pi OS ist diese Einstellung deaktiviert. Ein sinnvoller Wert ist z.B. 3:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">MaxAuthTries 5<\/code><\/pre>\n<p>Allerdings ist dies <strong>kein Schutz vor Brute-Forcing (Roher Gewalt)<\/strong>. Erg\u00e4nzend macht es daher Sinn, Programme wie Fail2ban einzusetzen: Es \u00fcberwacht die Anzahl fehlgeschlagener Anmeldeversuche und sperrt IP-Adressen eine gewisse Zeit aus, wenn ein festgelegtes Limit erreicht ist. Entsprechend eingerichtet, wird Brute-Forcing dadurch massivst erschwert, sodass es bei einem sicheren Passwort alles andere als praxistauglich ist, damit erfolgreich anzugreifen.<\/p>\n<h3 class=\"wp-block-heading\">Reverse-DNS Aufl\u00f6sung abschalten<\/h3>\n<p>Standardm\u00e4\u00dfig pr\u00fcft SSH den Reverse-DNS Eintrag eines Clients. Das bringt in den meisten F\u00e4llen wenig &#8211; zumal typische DSL-Anschl\u00fcsse ohnehin in der Regel keinen (sinnvollen) Reverse-DNS Eintrag besitzen (wie etwa kunde19823761987283.isp.de). Auch wenn dies kein direktes Sicherheitsrisiko ist, erh\u00f6ht es theoretisch die Angriffsfl\u00e4che ohne Mehrwert. Au\u00dferdem kann die DNS-Anfrage ggf. das Anmelden verz\u00f6gern, daher w\u00fcrde ich es deaktivieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">UseDNS no<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Testen der \u00c4nderungen<\/h3>\n<p>Grunds\u00e4tzlich solltest du \u00c4nderungen am SSH-Daemon immer zuerst in einer weiteren Sitzung testen und die urspr\u00fcngliche Sitzung ge\u00f6ffnet lassen! Falls dabei Probleme festgestellt werden, kann man diese mit der noch offenen Sitzung reparieren. So verhindert man, sich bei fehlerhaften Konfigurations\u00e4nderungen selbst auszusperren.<\/p>\n<p>Damit diese wirksam werden, muss zun\u00e4chst der SSH-Server neu gestartet werden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo systemctl restart sshd<\/code><\/pre>\n<p>Dies hat keine Auswirkungen auf die Sitzung, in der man den Befehl ausf\u00fchrt. Daher sollte man diese Sitzung offen halten und zum Testen nun eine zweite \u00f6ffnen. Funktioniert alles, kann die offen gehaltene Sitzung geschlossen werden.<\/p>\n<h2 class=\"wp-block-heading\">Sollte ich den SSH-Port \u00e4ndern?<\/h2>\n<p>Manche Beitr\u00e4ge empfehlen, den Standardport 22 zu \u00e4ndern. Dies halte ich im Sinne der Sicherheit f\u00fcr wenig sinnvoll: Es gibt nur maximal 65.535 Ports. Mit einem Portscan sind die relativ einfach und schnell durchprobiert. Einen Angreifer hindert das eben so wenig wie eine angelehnte statt einer offenen T\u00fcr. Wesentlich mehr tr\u00e4gt man zur Sicherheit bei, wenn man die T\u00fcr schlie\u00dft und am besten verschlie\u00dft. Beim SSH-Server w\u00e4re das beispielsweise die Nutzung von starken Passw\u00f6rtern oder noch besser SSH-Schl\u00fcsseln.<\/p>\n<p>Gegen\u00fcber den minimalen Vorteilen bringt die \u00c4nderung der Standardports auch leichte Nachteile: Man muss den selbst gew\u00e4hlten Port bei einer Verbindung explizit angeben. Wer damit leben kann, der kann den Port nat\u00fcrlich \u00e4ndern &#8211; dar\u00fcber hinaus schadet es nicht. Aber man sollte sich im klaren sein, dass das keine wirksame Sicherheitsma\u00dfnahme ist. Wer sich um die Sicherheit seines Servers sorgt, erreicht mit wirkungsvollen Schutzma\u00dfnahmen statt dem <em>verstecken<\/em> von Diensten mehr. Neben den bereits genannten Beispielen kann man die Sicherheit <a href=\"https:\/\/u-labs.de\/portal\/ssh-absichern-2-faktor-authentifizierung-auf-dem-raspberry-pi-os-debian-einrichten\/\" title=\"SSH absichern: 2-Faktor Authentifizierung auf dem Raspberry Pi (OS)\/Debian einrichten\">etwa durch 2-Faktor Authentifizierung zus\u00e4tzlich verbessern<\/a>. Das nutzt wesentlich mehr, da sich eine Multi-Faktor-Authentifizierung nicht so einfach mit einem Portscan <em>umgehen<\/em> l\u00e4sst.<\/p>\n<h2 class=\"wp-block-heading\">Weitere Schutzma\u00dfnahmen<\/h2>\n<p>An dieser Stelle sei auch noch darauf hingewiesen, dass dies nur Beispiele sind. Es gibt weitere sinnvolle Ma\u00dfnahmen, welche die Sicherheit erh\u00f6hen k\u00f6nnen. Dies betrifft nicht nur den SSH-Server. Das regelm\u00e4\u00dfige einspielen von Aktualisierungen ist beispielsweise eine Grundlage f\u00fcr sichere Systeme. Vor allem Sicherheitsaktualisierungen sollten so schnell wie m\u00f6glich eingespielt werden, <a href=\"https:\/\/u-labs.de\/portal\/sicherheitsaktualisierungen-automatisch-einspielen-lassen-auf-dem-raspberry-pi\/\" title=\"Sicherheitsaktualisierungen automatisch einspielen lassen auf dem Raspberry Pi\">am besten automatisch<\/a>. <\/p>\n<p>&#8222;Sicherheit&#8220; ist ein Prozess &#8211; kein Zustand, den man wie ein Projektziel erreicht und danach abhaken kann. Zumal man bei diesem Begriff nicht nur an Angriffe von au\u00dfen denken sollte. Auch z.B. Hardwaredefekte k\u00f6nnen die Sicherheit der gespeicherten Daten gef\u00e4hrden, weswegen man auch ein Backup-Konzept haben sollte. Diese Themen werden wir noch in einen Beitr\u00e4gen genauer anschauen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SSH ist das Standard-Protokoll schlechthin, um Linux-Systeme zu administrieren. \u00dcber die Standardeinstellungen hinaus sollte man jedoch ein paar Sicherheitsvorkehrungen treffen &#8211; vor allem dann, wenn das System per Internet erreichbar ist. Vorbereitungen Falls noch nicht geschehen, installiere zuerst einen SSH-Server. Dies variiert etwas, je nach Plattform und Betriebssystem. SSH auf dem Raspberry Pi aktivieren Auf &#8230;<\/p>\n","protected":false},"author":5,"featured_media":8884,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[391,671,85],"tags":[56,781],"class_list":["post-8851","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-server","category-raspberry-pi","category-sicherheit","tag-sicherheit","tag-ssh"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=8851"}],"version-history":[{"count":6,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8851\/revisions"}],"predecessor-version":[{"id":9867,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8851\/revisions\/9867"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/8884"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=8851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=8851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=8851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}