Hallo Zusammen, ich würde gerne zuhause einen Raspberry Server laufen lassen. Diesen würde ich auch gerne über eine Remote-Verbindung mittels SSH übers Internet konfigurieren und erweitern können. Da dies einige Sicherheitsrisiken birgt, habe ich mir ein kleines Sicherheitskonzept überlegt und würde gerne eure Meinung zu diesem Konzept erfahren, da ich nicht ausreichend informiert bin, was für Möglichkeiten Hacker besitzen, um in mein System zu gelangen. Ich bin mehr in der Hardwareprogrammierung aktiv, deswegen habt bitte nachsehen mit mir :) Zu dem Server: Der Server soll ein einfacher TCP/IP-Server sein, der es mir ermgöglicht, auf Sensoren und Aktuatoren in meiner Wohnung zuzugreifen. Dieser Dienst soll 24/7 erreichbar sein. Kommuniziert wird dabei mit meinem Handy als Client und dem Raspberry-Server Das Sicherheitskonzept soll in erster Linie Hobby-Hacker davor abhalten, in mein System zu gelangen und mir als Übung bezüglich Systemsicherheit dienen, auch wenn das Konzept in mancher Hinsicht unter Umständen, als zu übertrieben und aufwendig dargestellt ist. Zu dem Konzept: Da eine SSH-Schnittstelle ein "Offenes Tor" in das System darstellt, will ich den Zugriff möglichst sicher gestalten. Deshalb soll die SSH-Schnittstelle mittels TCP/IP-Commands an- bzw. abgeschaltet werden können. Somit kann ich entscheiden, wann überhaupt eine SSH-Verbindung möglich ist. Weiterhin soll das System ermitteln, ob ein Benutzer zwei mal im System angemeldet ist oder ob gerade ein zweiter Loginversuch gestartet wird, was zum direkten Abschalten des SSH-Dienstes führen soll. Da der TCP/IP-Server 24/7 erreichbar sein soll, ist es nun möglich für einen Angreifer sich als Client anzumelden und die SSH-Verbindung selbst zu aktivieren, vorausgesetzt er kennt die entsprechenden Commands. Aus diesem Grund wird ein Login-System eingefügt, mit dem ich mir zuerst die Rechte abholen muss, um Commands an den Server schicken zu können. Weiterhin wird jede Kommunikations mittels AES-Encryption verschlüsselt. Somit dürfte ich von Angriffen von einem "Man In The Middle" weitestgehen geschützt sein. Nun besteht noch Gefahr von Angreifern, die sich z.B. bereits im System meines Handys befinden könnten. Diese können meine Anwendung Decompilieren und den Verschlüselungs-Key nachvollziehen, die Kommunikation entschlüsseln, die Kommands zur SSH-Verbindung schnüffeln und die SSH-LoginDaten Bruteforcen. Aus diesem Grund kann sich der Schlüssel auf externer Hardware befinden, z.B. einem kleinen µC. Diesem schicke ich die Nachricht als Klartext per USB, der verschlüsselt meine Nachricht und gibt diese verschlüsselte Nachricht an mein Handy zurück. Somit ist der Schlüssel schon mal sicher auf einer externen Hardware verwahrt. Wobei dies wahrscheinlich nur Pseudo-Sicherheit bietet, da der Angreifer sieht, welche Nachricht ich an den µC schicke und welche Antwort ich daraufhin zurück bekomme. Somit kann er sich einen Zusammenhang zw. verschlüsselte und unverschlüsselte Nachricht zusammenreimen und die verschlüsselten Nachrichten als Klartext an den Server schicken. Dies sollte es erstmal zu meinem Konzept gewesen sein. Manche Schritte dürfte wahrscheinlich zu übertrieben sein, um einen "Hobby-Hacker" vom System fern zu halten, aber ich sehe dieses Projekt wie bereits erwähnt, als eine kleine Übung. Mich würde nun eure Meinung zum Konzept interessieren und ich würde mich über Feedback und konstruktive Kritik freuen.
:
Verschoben durch User
Forum Projekte: Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen und diskutieren. *Bitte hier keine Fragen posten!*
900ss D. schrieb: > Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen > und diskutieren. > *Bitte hier keine Fragen posten!* Das ist mein Projekt, über das ich gerne Diskutieren würde. Was ist also falsch daran? Soll ich jetzt 10 Wörter in meinem Text ändern, damit es hier rein passt?
Das sieht schon ganz gut aus, ich würde jedenfalls dran verzweifeln :)
Zum Login / SSH-Bruteforce kannst du auch Fail2Ban einsetzen. So wird die IP-Adresse des Angreifers per iptables für einen gewissen Zeitraum gesperrt, wenn korrekt eingestellt. Tutorials sind dazu auch im Netz haufenweise zu finden, außerdem kann nicht nur SSH damit vor Bruteforce besser geschützt werden als ohne dieses Stück Software. Dazu kann auch ein alternativer SSH-Port schon vor einem Großteil von Zugriffsversuchen schützen.
Man sollte jedenfalls die Kontrolle über seine Sachen behalten. Dazu wäre z.B. eine Antwort: "Letztes Login Nr.4713 am 24.12.2019 17:43" schon ein schöner Hinweis. Wenn dann zu viele Logins waren, kannst Du ja die Schnittstelle abklemmen.
RogerGER schrieb: > Da eine SSH-Schnittstelle ein "Offenes Tor" in das System darstellt, > will ich den Zugriff möglichst sicher gestalten. > Deshalb soll die SSH-Schnittstelle mittels TCP/IP-Commands an- bzw. > abgeschaltet werden können. Schau mal nach dem Stichwort "Port Knocking", das hat sich bewährt, gibt es fertige Toolkits für. > Weiterhin soll das System ermitteln, ob ein Benutzer zwei mal im System > angemeldet ist oder ob gerade ein zweiter Loginversuch gestartet wird, > was zum direkten Abschalten des SSH-Dienstes führen soll. Keine gute Idee: Sagen wir Du kommst mit Deinem Handy in ein Funkloch, dabei wird Deine bestehende SSH-Session unterbrochen und nicht sauber beendet. Durch die TCP-Timeouts bleibt die aber noch ne ganze Weile auf dem Server aktiv. Du bist aus dem Funkloch raus, Dein Handy meldet sich wieder am LTE etc. an, bekommt ne neue IP und mit der baust Du jetzt eine neue SSH-Verbindung auf -> Bumm, ausgesperrt. Das Port-Knocking (siehe oben) macht das SSH nur für eine IP auf, nicht für alle. Kaum ein Angreifer wird warten bis Du Dich einloggst, auch das Mobilfunknetz gehackt haben damit er die selbe IP wie Dein Handy bekommt um dann die SSH-Verbindung zu versuchen. > Da der TCP/IP-Server 24/7 erreichbar sein soll, ist es nun möglich für > einen Angreifer sich als Client anzumelden und die SSH-Verbindung selbst > zu aktivieren, vorausgesetzt er kennt die entsprechenden Commands. > Aus diesem Grund wird ein Login-System eingefügt, mit dem ich mir zuerst > die Rechte abholen muss, um Commands an den Server schicken zu können. > Weiterhin wird jede Kommunikations mittels AES-Encryption verschlüsselt. Mach es nicht zu kompliziert. Desto mehr selbstentwickelte, komplexe Software, desto größer die Chance für Fehler im Konzept und Programm. > Nun besteht noch Gefahr von Angreifern, die sich z.B. bereits im System > meines Handys befinden könnten. Ja, das ist viel realistischer als die anderen Varianten. > Aus diesem Grund kann sich der Schlüssel auf externer Hardware befinden, gute Idee. > z.B. einem kleinen µC. Setz lieber auf bekannt gute Lösungen. Entweder Smartcards wie die GnuPG-Card oder Lösungen wie Yubikey oder Gnuk. Kein Bluetooth oder NFC zwischen Handy und Token/Karte. Denn da gibt es noch keine Standards die diese Verbindung verschlüsseln. Daher das Token/Reader immer per USB ans Handy anschließen. Ein Token verwenden, bei dem Du eine Pin eingeben musst oder zumindest eine Taste am Token selber drücken um die Auth freizugeben. Das setzt ein Handy voraus, bei dem Du genug Möglichkeiten zum einbinden passender Treiber etc. hast, iOS kannst Du also vergessen, eher Lineage.
:
Bearbeitet durch User
Wenn man am Ball bleibt und für Updates sorgt, ist schon reines SSH serverseitig eine ziemlich sichere Angelegenheit. Zertifikate oder gute Passwörter vorausgesetzt. Zusätzliche serverseitige Verfahren zur Absicherung sind gut, aber nicht absolut zwingend. RogerGER sieht ein Problem berechtigterweise auch auf der Seite des Clients. Im Abschnüffeln der Zugangsinformation.
:
Bearbeitet durch User
Fail2Ban + sshd reicht eigentlich. Selbstgebastelte Lösungen, die dir den sshd Dienst erst starten, könnten selbst eine Sicherheitslücke darstellen, deswegen würde ich das lassen. Zusätzlich würde ich noch den IP Adressraum einschränken. Du wirst dich bspw. wohl kaum mit deinem Handy mit einer chinesischen IP Adresse in deinen Server einloggen. Also kannst du ganze IP Räume per Firewall blocken. Es gibt im Internet dafür IP Adressraumlisten, die den jeweiligen Ländern zugewiesen sind. Wenn du steuern willst, ob dein sshd Server laufen soll oder nicht, dann würde ich das ganz anders lösen. Gib deinem Server Zugriff auf einen kostenlosen Clouddienst. Dort soll er regelmäßig nach einer Datei suchen. Ist diese Datei vorhanden, dann soll er den sshd Server starten, ist sie nicht vorhanden, dann soll der Server nicht gestartet werden bzw. falls er schon gestartet ist, beendet werden. Du selbst müsstest dich also von deinem Handy zuerst in deiner Cloud einloggen, die Datei uploaden, etwas warten bis dein Server das bemerkt und den sshd Dienst hochfährt und dann könntest du dich per sshd einloggen. Diese Datei kannst du auch öffentlich verfügbar machen, dann braucht dein sshd Server kein PW für den Zugriff zur Cloud. Vorraussetzung dafür wäre allerdings, dass er die Datei immer unter der gleichen URL finden kann. Wenn du noch etwas Sicherheit oben drauf setzten willst, dann könntest du die Datei per OpenPGP Verfahren verschlüsseln und der Server kann sie dann auswerten, in dem er sie mit seinem private Key entschlüsselt. Und je nach dem was da drin steht, kann der Server dann verschiedene Dinge tun. Wie bspw. sshd Server starten, beenden oder irgendwas anderes. Der Vorteil dieser Lösung ist, dass die Clouds in der Regel besser geschützt sind und du so trotzdem deinen sshd Server nur auf Anfrage bei Bedarf einschalten kannst. Sieh auch noch zu, dass dein Raspi Zuhause möglichst in einer DMZ läuft und das private LAN vor diesem sicher ist. Außerdem muss man beim Raspi selbst noch ein paar Änderungen vornehmen, wie bspw. dem root account ein PW vergeben usw.. Alternativ dazu könntest du dem Raspi auch ein GSM Modul geben und dessen SSH Dienst per SMS einschalten. Das wäre ein alternativer Weg zum Internet. Ansonsten würde ich auf dem Raspi noch alles per FW blocken, außer dem Port für den ssh Dienst und was du sonst noch brauchst. Die Anzahl der Dienste, die per UDP oder TCP erreichbar sind, solltest du auf das nötigste einschränken. Für den Fall das dein Raspi trotzdem kompromitiert ist, solltest du zusehen, dass dein Router vor ihm geschützt ist. Den Router also nur zum weiterleiten nutzen und direkte Anfragen vom Raspi an ihn blocken. Das größte Problem dürften hier die Router selbst sein, denn viele Homerouter lassen sich leider nicht so flexibel konfigurieren. Aber wenn du die Möglichkeit dazu haben solltest, dann kannst du damit auch noch die Sicherheit erhöhen. Die Verwendung einer IDS und IPS wäre auch noch eine optionale Möglichkeit. Und immer darauf achten, dass der Raspi regelmäßig seine Updates bekommt. Also mindestens einmal täglich.
Nano schrieb: > Und immer darauf achten, dass der Raspi regelmäßig seine Updates > bekommt. Also mindestens einmal täglich. Nicht jedes Update muß glücklich machen? Es gab auch Fehlschläge.
oszi40 schrieb: > Nano schrieb: >> Und immer darauf achten, dass der Raspi regelmäßig seine Updates >> bekommt. Also mindestens einmal täglich. > > Nicht jedes Update muß glücklich machen? Es gab auch Fehlschläge. Das ist leider richtig. In dem Fall sollte man eine Distribution wählen, in der das Qualitätsmanagement passt. Da der Raspi ohnehin ein Debian stable anbietet, sehe ich da jetzt allerdings nicht so ein großes Problem.
oszi40 schrieb: > Nicht jedes Update muß glücklich machen? Es gab auch Fehlschläge. Automatische Updates sind Fluch und Segen zugleich. Man kann sie über den gleichen Weg auch manuell machen. Ist dann ist mehr routinemässige Arbeit: Man muss dicht am Ball bleiben und mehr oder weniger täglich sichten, welche Probleme grad anstehen, ob man reagieren muss.
Meiner Meinung nach ist das leider ziemlicher Unsinn :/ RogerGER schrieb: > Da eine SSH-Schnittstelle ein "Offenes Tor" in das System darstellt, > will ich den Zugriff möglichst sicher gestalten. Wie kommst du auf diese Idee? Ein OpenSSH-Daemon ist vermutlich so mit die sicherste Remote-Schnittstelle, die du dir ausdenken kannst, wenn du Passwort-Authentifizierung ausschaltest. Auf jeden Fall ist ssh tausendmal sicherer als alles, was du dir selber basteln kannst. > Deshalb soll die SSH-Schnittstelle mittels TCP/IP-Commands an- bzw. > abgeschaltet werden können. Sprich, du vertraust hier deinem eingenen Service mehr als OpenSSH? Das ist nicht sinnvoll. > Aus diesem Grund wird ein Login-System eingefügt, mit dem ich mir zuerst > die Rechte abholen muss, um Commands an den Server schicken zu können. Aka, du hast das ssh-Loginsystem, was seit 30 Jahren von den fähigsten Leuten der Welt auf sicher gebaut wird, durch dein eigenes ersetzt und denkst jetzt das ist sicherer? > Weiterhin wird jede Kommunikations mittels AES-Encryption verschlüsselt. > Somit dürfte ich von Angriffen von einem "Man In The Middle" > weitestgehen geschützt sein. AES authentifiziert das Gegenüber nicht. Gegen MITM-Angriffe hilft das also eher nicht, bzw. man muss sich genau überlegen gegen was es hilft. Wenn solltest du TLS verwenden. > Aus diesem Grund kann sich der Schlüssel auf externer Hardware befinden, > z.B. einem kleinen µC. Diesem schicke ich die Nachricht als Klartext per > USB, der verschlüsselt meine Nachricht und gibt diese verschlüsselte > Nachricht an mein Handy zurück. Somit ist der Schlüssel schon mal sicher > auf einer externen Hardware verwahrt. Das ist ein Hardware-Kryptomodul, das kann schon sinnvoll sein. Gibts aber zu kaufen, z.B. in Form des Yubikey. > Mich würde nun eure Meinung zum Konzept interessieren und ich würde mich > über Feedback und konstruktive Kritik freuen. Ist nicht böse gemeint, aber: vergiss das alles. Installier' einfach OpenSSH und konfiguriere es ordentlich (Passwort-Authentifizierung ausschalten, ECC/RSA-Key mit Passphrase verwenden). Wenn du paranoid bist, ist der nächste Schritt, deinen ssh-Key auf einem Hardware-Kryptomodul abzulegen (was du aber ebenfalls auf keinen Fall selber entwickeln willst). Ein anderer sinnvoller Paranoia-Schritt ist noch, Handy und Server in ein VPN zu tun. Alles andere was du tust macht das System garantiert unsicherer. Kryptographie macht man nie, nie selber, wenn man es irgendwie vermeiden kann. Man macht es immer falsch.
:
Bearbeitet durch User
Ich nutze SSH inzwischen nicht mehr direkt, sondern über (Open-)VPN. Das VPN dient auch dazu, dass man mit diversen Firewalls keine Probleme hat, indem man einen Port nutzt, der meist offen ist (z.B. HTTPS, PO3S oder IMAPS). Von dort aus kann man sich via SSH als ein Nutzer einloggen, der praktisch keine Rechte hat. Und von da aus via su zum eigentlichen Account. Ich halte das für relativ sicher und auch die SSH-Logs sind überschaubar. Wenn allerdings der Client kompromittiert ist, hilft das alles nicht mehr. Jörg
Sven B. schrieb: > Ist nicht böse gemeint, aber: vergiss das alles. Installier' einfach > OpenSSH und konfiguriere es ordentlich (Passwort-Authentifizierung > ausschalten, ECC/RSA-Key mit Passphrase verwenden). Genau das, OpenSSH noch regelmäßig updaten, dann ist gut. Deine Schnittstelle per ssh port forwarding lokal auf deinen rechner tunneln, und dann hast du authentication und authorization ebenfalls gelöst. Dazu fail2ban und glücklich sein. Funktioniert hier seit mehreren Jahren auf vielen Rechnern.
Die Ein und -Ausschaltoption über die Config eines Links auf einer Cloud oder einem HTTP Server hätte zumindest den Vorteil, dass man in Notfällen den ssh Server durch einen 2. Weg ausschalten kann, wenn man keine Updates einspielen kann oder dieses fehlt schlägt oder es noch keine Updates gibt oder der ssh Server mit der eigenen IP nicht erreichbar ist. Als Config Datei wäre bspw. eine XML, JSON oder INI ähnliche Datei mit einfachem Schlüssel Wertepaar sinnvoll. Bsp: sshd=on until="22:00 23.11.2019" Diese Datei könnte man dann unter einem festen Namen dann mit dem Public Key des Servers verschlüsseln und öffentlich auf der Cloud plazieren. Der Server schaut dann per polling regelmäßig nach und lädt sie runter, wenn er sie gefunden hat. Dann entschlüsselt er sie und ein Skript wertet sie aus. Je nach dem welcher Wert ein Key z.b. der sshd Server hat, wird er dann ein oder ausgeschaltet. Mit der Zeitfunktion kann man ihm dann auch sagen, wann er den Dienst wieder ausschalten soll. Natürlich wäre so auch das ein oder ausschalten weiterer Dienste, bspw. vpn usw. möglich. Um die Cloud muss man sich in der Regel nicht selbst kümmern, sollte sie aber kompromittiert werden, dann kann der Angreifer mit der Datei nichts anfangen, da er sie nicht enschlüsseln kann. Sollte der public Key geklaut werden, dann könnte er zwar eine neue uploaden, vorausgesetzt, er weiß, was für Key Werte Paare er da reinschreiben muss, aber dagegen gibt es auch ein Heilmittel. Man könnte die Datei noch mit dem eigenen privaten Key signieren. In dem Fall muss der Server zwei Dateien downloaden, die Datei und die Signatur. Die Datei kann er dann durch die Signatur prüfen. Auf dem Server muss man dazu vorher lediglich noch den public key des Clients deponieren. Prinzipiell kann man so ein Verfahren auch nutzen, wenn man den SSH Dienst nur benötigt um einfache Aufgaben durchzuführen, die sich auch mit einem Key Werte Paar abbilden und vorher testen ließen. Die Sicherheit wäre damit auch höher, weil man nicht gleich eine Shell zur Verfügung stellen muss.
Nano schrieb: > Die Ein und -Ausschaltoption über die Config eines Links auf einer Cloud > oder einem HTTP Server hätte zumindest den Vorteil, dass man in > Notfällen den ssh Server durch einen 2. Weg ausschalten kann, wenn man > keine Updates einspielen kann oder dieses fehlt schlägt oder es noch > keine Updates gibt oder der ssh Server mit der eigenen IP nicht > erreichbar ist. Dafür gibt es die Adminkonsole des Hosters bzw. dessen Telefonhotline.
Sven B. schrieb: > Nano schrieb: >> Die Ein und -Ausschaltoption über die Config eines Links auf einer Cloud >> oder einem HTTP Server hätte zumindest den Vorteil, dass man in >> Notfällen den ssh Server durch einen 2. Weg ausschalten kann, wenn man >> keine Updates einspielen kann oder dieses fehlt schlägt oder es noch >> keine Updates gibt oder der ssh Server mit der eigenen IP nicht >> erreichbar ist. > > Dafür gibt es die Adminkonsole des Hosters bzw. dessen Telefonhotline. In seinem Fall ist es ein Raspberry Pi Zuhause. Da wird kein Hoster und kein Admin verfügbar sein, wenn er eine Weltreise oder ein vorübergehenden Wechsel in die Zweitwohnung aus beruflichen Gründen oder vergleichbares durchführen möchte bzw. muss.
Nano schrieb: > Sven B. schrieb: >> Dafür gibt es die Adminkonsole des Hosters bzw. dessen Telefonhotline. > > In seinem Fall ist es ein Raspberry Pi Zuhause. Naja, ok, stimmt, hatte ich schon wieder vergessen. Trotzdem weiß ich nicht, was das ganze Ein- und Ausgeschalte von ssh soll. Was verspricht man sich davon? Die zusätzliche Komplexität vergrößert nur die Angriffsfläche.
Das kommt darauf an was er vor hat. Bei einer Atlantiküberquerung in der Segelyacht könnte das Satellitentelefon ausfallen. Zur gleichen Zeit könnte eine Sicherheitslücke in sshd bekannt werden. Wie macht er jetzt das update? In dem Fall geht es nicht. Hat er aber sshd vor der Abreise auf den Kanaren abgeschaltet, dann kann er diesen Dienst mit der Methode in Antigua wieder einschalten und updaten, wenn er da ankommt. Die Sicherheit leidet durch so eine Methode in keinster Weise, sie wird sogar erhöht und sshd lässt sich ohnehin per systemd start oder stop Befehl ein und ausschalten. Soviel Komplexität kommt da im Skript, das die config auswertet, nicht hinzu.
Nano schrieb: > Diese Datei könnte man dann unter einem festen Namen dann mit dem Public > Key des Servers verschlüsseln und öffentlich auf der Cloud plazieren. Nur bohrt man genau so schon selbst ein Loch. Indem sich der Server sein potentielles Problem freiwillig reinzieht. Zumindest vom Begriff her ist in deiner Beschreibung beides öffentlich, Schlüssel wie Cloud, kann also jeder machen.
:
Bearbeitet durch User
Jo, aber das hattest du als optional beschrieben. ;-) Das ist ja das Fiese an solchen Szenarien. Jedes Fitzelchen, das man sich zusätzlich zum 08/15-Schema ausdenkt, wird zum potentiellen Risiko.
:
Bearbeitet durch User
Ach noch etwas, niemand zwingt dich einen public key öffentlich zu machen, es genügt in diesem Fall wenn ihn der Client hat und so war das auch beschrieben. Ein public heißt nur so, weil er der Teil des Schlüsselpaares ist, der weitergegeben werden kann, anders als der private key.
A. K. schrieb: > Jo, aber das hattest du als optional beschrieben. ;-) Er wurde aber auch nicht veröffentlicht, da ihn nur der Client hat. Im Prinzip ist es also ausreichend. Wenn es dem Angreifer gelingt, den public key des servers vom client zu stehlen, dann gelingt ihm das auch mit dem private key des clients der zum signieren benutzt wird.
A. K. schrieb: > Das ist ja das Fiese an solchen Szenarien. Jedes Fitzelchen, das man > sich zusätzlich zum 08/15-Schema ausdenkt, wird zum potentiellen Risiko. Da ist kein Risiko.
Nano schrieb: > A. K. schrieb: > Jo, aber das hattest du als optional beschrieben. ;-) > > Er wurde aber auch nicht veröffentlicht, da ihn nur der Client hat. Im > Prinzip ist es also ausreichend. > Wenn es dem Angreifer gelingt, den public key des servers vom client zu > stehlen, dann gelingt ihm das auch mit dem private key des clients der > zum signieren benutzt wird. Ach noch vergessen: Und wenn er im Client drin ist, dann bietet ssh auch keinen Schutz mehr. :)
Nano schrieb: > Da ist kein Risiko. Oh doch: Wie holst Du die Datei von dem fremden Server? Per HTTP oder HTTPS, z.B. mit curl oder wget? Dann kann im curl selbst oder einer davon verwendeten Lib eine Lücke sein, die es einem kompromittiertem Server erlaubt, auch den Client zu übernehmen. Oder wenn Du die Datei einmal hast, wie interpretierst Du sie? Wenn es eine JSON ist z.B. mit jq. Dann kann da auch eine Lücke drin sein, die, wenn sie mit den richtig präparierten Daten in Kontakt kommt, auch wieder erlaubt Code auszuführen. Du verschiebst so nur das Problem von der einen Stelle an eine andere und gewinnst nix dabei, machst dafür aber die normale Administration wesentlich schwieriger.
:
Bearbeitet durch User
Gerd E. schrieb: > Nano schrieb: > Da ist kein Risiko. > > Oh doch: > > Wie holst Du die Datei von dem fremden Server? Per HTTP oder HTTPS, z.B. > mit curl oder wget? Dann kann im curl selbst oder einer davon > verwendeten Lib eine Lücke sein, die es einem kompromittiertem Server > erlaubt, auch den Client zu übernehmen. Der Client uploadet die Datei auf die Cloud, die meinst du wohl mit "fremder Server" Wenn die Cloud durch Downloads mit Downloadclients diese gefährden soll, dann ist da nicht der Clientrechner betroffen. Und wenn du dir um Downloadclients sorgen machst, dann solltest du dir auch über sshd Sorgen machen. > > Oder wenn Du die Datei einmal hast, wie interpretierst Du sie? Wenn es > eine JSON ist z.B. mit jq. Dann kann da auch eine Lücke drin sein, die, > wenn sie mit den richtig präparierten Daten in Kontakt kommt, auch > wieder erlaubt Code auszuführen. Die Datei ist verschlüsselt. Kompromittiere erst einmal die Verschlüsselung, ehe du über präparierte key value Paare nachdenkst. Zumal so eine Auswertung ordentlich programmieren kann. > > Du verschiebst so nur das Problem von der einen Stelle an eine andere Nein ich erweitere die Funktionalität und erhöhe due Sicherheit. Siehe das Beispiel mit der Atlantiküberquerung, ein Fall wo die Funktionalität von ssh nicht genügt. > und gewinnst nix dabei, Stimmt nicht.Ein Beispiel habe ja genannt. >machst dafür aber die normale Administration > wesentlich schwieriger. Ich finde das jetzt nicht schwierig. Analogie: Eine Fräse funktioniert auch ohne not-aus Schalter, aber mit ist sicherer.
Nano schrieb: > Das kommt darauf an was er vor hat. Bei einer Atlantiküberquerung in der > Segelyacht könnte das Satellitentelefon ausfallen. Zur gleichen Zeit > könnte eine Sicherheitslücke in sshd bekannt werden. Wie macht er jetzt > das update? > In dem Fall geht es nicht. Wer solche Sicherheitsansprüche hat darf eben seinen Server nicht 3 Wochen unbeaufsichtigt im Internet hängen lassen. Die Lücke könnte auch im TCP Connection Handling vom Linux-Kernel sein, dann bringt dir dein Skript nichts. Wahrscheinlich ist das Angrifssszenario für den Raspberry Pi-Server ohnehin eher nicht. > Die Sicherheit leidet durch so eine Methode in keinster Weise, sie wird > sogar erhöht und sshd lässt sich ohnehin per systemd start oder stop > Befehl ein und ausschalten. > Soviel Komplexität kommt da im Skript, das die config auswertet, nicht > hinzu. Das ist ein Trugschluss. Alleine wenn das Skript irgendwie ein wget auf eine https-URL macht, ist die nach außen sichtbare (und damit angreifbare) Komplexität vermutlich schon höher als die des kompletten sshd. Vergleiche dazu z.B. mal die CVE-Listen von sshd und wget. > Die Datei ist verschlüsselt. Kompromittiere erst einmal die > Verschlüsselung, ehe du über präparierte key value Paare nachdenkst. Genau, aber von dir verschlüsselt, und es ist eine plausible Annahme dass du dabei eher was falsch gemacht hast als sshd. Ich verstehe die Intention, irgendwie 2 Layer von Zugriffskontrolle zu haben, aber ich denke es gibt genau eine (gängig genutzte und einfache) Möglichkeit für das zweite Layer: ein VPN, in dem sich Server und Computer für den Zugriff befinden. Es ist z.B. instruktiv, sich ein paar Vorträge über Krypto-Zeug vom CCC anzuschauen. Da gibt es wirklich gut gemeinte und scheinbar auch gut gemachte kryptographische Modelle für Zugriffskontrolle oder was auch immer, und die Leute finden irgendein winziges Detail, was vergessen oder übersehen wurde und zack, ist das ganze System kaputt. Anders als bei den allermeisten Dingen auf der Welt genügt "joa, ist im Wesentlichen ganz clever" eben nicht. Deshalb: nicht selber machen.
:
Bearbeitet durch User
Nano schrieb: > Die Datei ist verschlüsselt. Dann verwendest Du entweder irgendeine Crypto-Lib oder -Programm oder hast die gesamte Crypto komplett selbst geschrieben. Sagen wir mal Du nimmst GnuPG zum verschlüsseln. Was ist, wenn jetzt in GnuPG ein Bug ist, der dafür sorgt, daß Du mit passend präparierten Daten Code ausführen kannst? Dann hast Du mit Deinem Konzept mehr Löcher gerissen als gestopft. Leider ist Sicherheit nicht ganz so einfach zu bekommen. Sven B. schrieb: > Deshalb: nicht selber machen. ganz richtig.
Sven B. schrieb: > Das ist ein Trugschluss. Alleine wenn das Skript irgendwie ein wget auf > eine https-URL macht, ist die nach außen sichtbare (und damit > angreifbare) Komplexität vermutlich schon höher als die des kompletten > sshd. Vergleiche dazu z.B. mal die CVE-Listen von sshd und wget. CVE Listen sagen nur aus, dass man sich um gefundene Sicherheitslücken kümmert und diese offiziell nummeriert, was gut ist. Sie sagen nichts darüber aus, ob der Code gut oder schlecht ist. > Da gibt es wirklich gut gemeinte und scheinbar auch gut > gemachte kryptographische Modelle für Zugriffskontrolle oder was auch > immer, und die Leute finden irgendein winziges Detail, was vergessen > oder übersehen wurde und zack, ist das ganze System kaputt. Anders als > bei den allermeisten Dingen auf der Welt genügt "joa, ist im > Wesentlichen ganz clever" eben nicht. Deshalb: nicht selber machen. Der Vergleich hinkt, weil ich gar kein neues Kryptoverfahren einführe, sondern ein bestehendes und allgemein bewährtes verwende. OpenPGP und eine Implementierung in Form von bspw. gnupg gibt es schon seit vielen Jahren und die Kryptoverfahren die es verwendet, sind standardisiert und schon von zig Kryptoexperten untersucht worden. Mit deinem VPN machst du nur einen weiteren Dienst dauerhaft auf, der von außen angegriffen werden kann. Das ist ein deutlich schlechteres Sicherheitskonzept, als für die Antlantiküberquerung einfach sshd zu beenden oder per Firewall den Port zu schließen. Und wenn der Bug tatsächlich im TCP Protokoll liegen sollte, dann hilft dir VPN da auch nicht.
Gerd E. schrieb: > Nano schrieb: >> Die Datei ist verschlüsselt. > > Dann verwendest Du entweder irgendeine Crypto-Lib oder -Programm oder > hast die gesamte Crypto komplett selbst geschrieben. Ich sprach von OpenPGP. Also was bewährtest, 1000 fach geprüft, hundertfach Code Audited usw.. > Sagen wir mal Du nimmst GnuPG zum verschlüsseln. Was ist, wenn jetzt in > GnuPG ein Bug ist, der dafür sorgt, daß Du mit passend präparierten > Daten Code ausführen kannst? Dann kann ich auch sagen, dass sshd einen Bug haben kann. Die beiden Programme sind von ihrer Verbreitung und Verwendung, Code Audits, Checks durch Kryptoexperten usw. gleichwertig anzusehen. Wenn also gnupg einen Bug hat, dann müsste ich auch bei sshd von einem Bug ausgehen, beides ist gleich Wahrscheinlich. > Dann hast Du mit Deinem Konzept mehr Löcher gerissen als gestopft. Überlege noch einmal, hier ein Vergleich: Hürden die ein Angreifer überwinden muss: 1. In die Cloud einbrechen um eine verschlüsselte Datei platzieren zu können. 2. den Bug von gnupg ausnutzen und dabei meinen Schlüssel und den public Key des Servers kennen um eine platzierte Config verschlüsseln und signieren zu können. 3. die Config kennen, wissen welche Werte sie haben darf und dann noch wissen, was man für einen präparieren Bytecode einbauen muss, damit das Script abstürzt und Code eingeschleust werden kann. Was übrigens schon ziemlich unrealistisch ist, wenn die Eingaben gut geprüft und die Möglichkeiten stark begrenzt sind. 4. Das Script zum Abstürzen bringen, wenn das bspw. Python ist, muss noch ein Bug im Python Interpreter dazugehören. 5. Code einschleusen und dabei die Sichereitsvorkehrungen des Kernels umgehen und root Rechte erlangen um Schaden zu verursachen. Bei einem kaputten sshd oder vpn sieht es dagegen so aus: 1. Die Lücke nutzen und eindringen, fertig. Im ersten Fall muss der Angreifer mindestens 5 Stufen überwinden, damit er Schaden verursachen kann. > Sven B. schrieb: >> Deshalb: nicht selber machen. > > ganz richtig. Was hier kein selber machen ist, da gnuPG und ein schlanker Downloadclient beide bewährt sind. Man muss hier auch nicht zwangsläufig kein komplexes Programm wie wget verwenden, das neben dem simplen Downloaden noch dutzend andere Features unterstützt, man kann hier auch was einfaches nehmen. Es ist sogar gut möglich, dass es sogar für Python stark verbreitete Libs oder Erweiterungen gibt, die eine simple Datei downloaden können, also schon alles fix und feritg mitliefern, dann benötigt man nichtmal ein externes Programm. Insofern, Leute, es geht nur um das Downloaden einer Config, deren Entschlüsselung und Signaturtest und ein auswerten dieser. Das ist keine große neue Sache und definitiv kein neues Kryptoverfahren. Würde ich nen eigenen Dienst programmieren würde, der dann auf Eingaben wartet, ja, dann würde das mit dem "nicht selber machen" greifen, aber in dem Fall trifft das überhaupt nicht zu.
Nano schrieb: > Sven B. schrieb: >> Das ist ein Trugschluss. Alleine wenn das Skript irgendwie ein wget auf >> eine https-URL macht, ist die nach außen sichtbare (und damit >> angreifbare) Komplexität vermutlich schon höher als die des kompletten >> sshd. Vergleiche dazu z.B. mal die CVE-Listen von sshd und wget. > > CVE Listen sagen nur aus, dass man sich um gefundene Sicherheitslücken > kümmert und diese offiziell nummeriert, was gut ist. > Sie sagen nichts darüber aus, ob der Code gut oder schlecht ist. Es geht auch nicht drum zu beurteilen ob der Code gut oder schlecht ist, sondern darum dass es auch in scheinbar trivialen Komponenten Fehler gibt. > Der Vergleich hinkt, weil ich gar kein neues Kryptoverfahren einführe, > sondern ein bestehendes und allgemein bewährtes verwende. Das tut keiner der anderen Leute, wenn du deine eigenen Kryptoverfahren erfindest, bist du eh komplett verloren. Die benutzen auch immer nur irgendwas bewährtes wie RSA, AES, etc. Aber auch beim zusammenstecken dieser Verfahren zu irgendeiner Logik, die irgendwas tut, kann man subtile Fehler machen. > Mit deinem VPN machst du nur einen weiteren Dienst dauerhaft auf, der > von außen angegriffen werden kann. Das ist ein deutlich schlechteres > Sicherheitskonzept, als für die Antlantiküberquerung einfach sshd zu > beenden oder per Firewall den Port zu schließen. Jetzt verwendest du dasselbe Argument, was du vorher selbst übergangen hast, falsch gegen mich. Ich erinnere dich an das, was du zu deinem eigenen Extra-Service gesagt hast: > Nein ich erweitere die Funktionalität und erhöhe due Sicherheit. Dazu ist das Argument bei dem VPN gar nicht richtig, weil du ja dann nicht zwei Services mit offenen Ports "VPN" und "sshd" auf deinem Pi laufen hast, sondern das VPN den Port für den sshd kapselt. Im schlimmsten Fall ist das VPN nutzlos, weil der Angreifer leicht reinkommt, dann ist er in derselben Lage wie ganz ohne das VPN.
:
Bearbeitet durch User
Sven B. schrieb: > Dazu ist das Argument bei dem VPN gar nicht richtig, weil du ja dann > nicht zwei Services mit offenen Ports "VPN" und "sshd" auf deinem Pi > laufen hast, sondern das VPN den Port für den sshd kapselt. Im > schlimmsten Fall ist das VPN nutzlos, weil der Angreifer leicht > reinkommt, dann ist er in derselben Lage wie ganz ohne das VPN. Nein, nicht unbedingt. Es kann auch eine Lücke im VPN-Dienst selber sein, mit der man z.B. direkt Code ausführen kann. Dann ist der Angreifer direkt drin und kann das ssh komplett umgehen. Was man aber natürlich machen könnte, wäre den VPN-Dienst und das SSH auf verschiedenen Rechnern laufen lässt. Der eine Rechner macht das VPN, der andere das SSH. Beide sind über ein nicht von außen erreichbares DMZ-Netz miteinander verbunden. Können natürlich auch verschiedene RasPis sein, dann braucht man aber USB-Ethernet-Adapter für die DMZ. Wenn jetzt eine Lücke im VPN-Dienst ist, kann der Angreifer zwar den ersten Rechner übernehmen und kann jetzt in der DMZ frei kommunizieren. Aber um den anderen Rechner zu übernehmen, muss er noch das ssh knacken. Dann habe ich die Sicherheit wirklich erhöht.
Sven B. schrieb: > Das tut keiner der anderen Leute, wenn du deine eigenen Kryptoverfahren > erfindest, bist du eh komplett verloren. Die benutzen auch immer nur > irgendwas bewährtes wie RSA, AES, etc. Aber auch beim zusammenstecken > dieser Verfahren zu irgendeiner Logik, die irgendwas tut, kann man > subtile Fehler machen. Es gibt einen großen Unterschied zwischen dem Selbstimplementieren von einem Verschlüsselungsverfahren wie bpsw. AES und dem verwenden eines bewährten Programms wie gnupg oder dessen Libs das sich für die Verschlüsselung und Entschlüsselung bewährt hat. Du fütterst gnupg mit einer Datei und raus kommt das entschlüsselte Ergebnis, wenn der Schlüssel passt. Das beim Füttern was schief geht ist realistisch betrachtet so gut wie unwahrscheinlich. Ist die Eingabe kaputt, dann schlägt die Entschlüsselung fehl. >> Mit deinem VPN machst du nur einen weiteren Dienst dauerhaft auf, der >> von außen angegriffen werden kann. Das ist ein deutlich schlechteres >> Sicherheitskonzept, als für die Antlantiküberquerung einfach sshd zu >> beenden oder per Firewall den Port zu schließen. > > Jetzt verwendest du dasselbe Argument, was du vorher selbst übergangen > hast, falsch gegen mich. Ich erinnere dich an das, was du zu deinem > eigenen Extra-Service gesagt hast: Bei mir läuft kein weiterer Dienst auf dem Server der an einem offenen Port lauscht. Bei dir steht: Port TCP 22 open Port UDP 1194 open Und zwei Dienste laufen dahiner, einmal sshd und einmal vpn. (EDIT: Okay, weiter unten gehe ich auf deinen Punkt mit nur einem Port ein) Bei mir steht: Port Range 0 - 65536 closed oder unknown Nach außen läuft kein Dienst. Ab und zu macht der Downloadclient einen Port zu einer ganz bestimmten Domain, nämlich dem Clouddienst für einen kurzen Moment auf. Die Firewall macht eine related Beziehung daraus. D.h. ein Angriff auf diesen Port könnte nur von diesem Clouddienst kommen, alle anderen Anfragen von anderen IP Adressen werden abgewiesen als wäre der Port closed. Man sieht also, eine Angriffsfläche ist von Außen praktisch nicht vorhanden. Während bei dir jeder Bot angreifen kann. >> Nein ich erweitere die Funktionalität und erhöhe due Sicherheit. > > Dazu ist das Argument bei dem VPN gar nicht richtig, weil du ja dann > nicht zwei Services mit offenen Ports "VPN" und "sshd" auf deinem Pi > laufen hast, sondern das VPN den Port für den sshd kapselt. Okay, dann ist eben nur der VPN Port offen. Das nützt dir aber nichts, wenn der VPN Dienst eine Sicherheitslücke hat und du durch diese beliebigen Code ausführen kannst. Das Problem ist dein Dienst läuft und ist von außen erreichbar und in den 3 Wochen auf dem Boot hast du keine Möglichkeit die Sicherheitslücke zu stopfen.
Gerd E. schrieb: > Was man aber natürlich machen könnte, wäre den VPN-Dienst und das SSH > auf verschiedenen Rechnern laufen lässt. Der eine Rechner macht das VPN, > der andere das SSH. Beide sind über ein nicht von außen erreichbares > DMZ-Netz miteinander verbunden. Können natürlich auch verschiedene > RasPis sein, dann braucht man aber USB-Ethernet-Adapter für die DMZ. > > Wenn jetzt eine Lücke im VPN-Dienst ist, kann der Angreifer zwar den > ersten Rechner übernehmen und kann jetzt in der DMZ frei kommunizieren. > Aber um den anderen Rechner zu übernehmen, muss er noch das ssh knacken. > > Dann habe ich die Sicherheit wirklich erhöht. Worin unterscheidet sich diese Bastellösung von meiner Lösung? Antwort: Es kann mindestens ein Rechner kompromittiert werden, wenn nur sshd oder vpn verwundbar ist. Bei mir sind es immer noch 6 Stufen die man überwinden muss. Wahrscheinlich scheitert der Angreifer schon beim ersten, nämlich beim Eindringen bei der Cloud. Spätestens bei der verschlüsselten oder signierten Datei gibt er auf.
Nano schrieb: > Spätestens bei der verschlüsselten oder signierten Datei gibt er auf. Korrektur, ich meine natürlich "und".
Nano schrieb: > Worin unterscheidet sich diese Bastellösung von meiner Lösung? "Bastellösung"? Das Aufteilen von Funktionen auf verschiedene Rechner und das Unterteilen von Netzen in kleinere DMZ-Segmente ist Stand der Technik. Sicherheitsrelevante Konfigurationsdateien von irgendwelchen Cloudservern herunterzuladen dagegen eher nicht. > Es kann mindestens ein Rechner kompromittiert werden, wenn nur sshd oder > vpn verwundbar ist. Und wenn bei Dir der eine Steuerdienst z.B. durch bestimmte Protokollfehler angreifbar ist, ist gleich der gesamte Rechner mit all seinen zu schützenden Daten offen. Wenn Du die Dienste auf verschiedene Rechner aufteilst, wird im Zweifelsfall nur die erste Stufe geknackt, dort sind aber keine so wichtigen Daten drauf. > Bei mir sind es immer noch 6 Stufen die man überwinden muss. Du lässt Dich von der hohen Zahl "6 Stufen" blenden. Schon an Deiner 2. Stufe reicht ein Fehler im HTTP-Handling etc. und es ist aus.
:
Bearbeitet durch User
Gerd E. schrieb: > Sven B. schrieb: >> Dazu ist das Argument bei dem VPN gar nicht richtig, weil du ja dann >> nicht zwei Services mit offenen Ports "VPN" und "sshd" auf deinem Pi >> laufen hast, sondern das VPN den Port für den sshd kapselt. Im >> schlimmsten Fall ist das VPN nutzlos, weil der Angreifer leicht >> reinkommt, dann ist er in derselben Lage wie ganz ohne das VPN. > > Nein, nicht unbedingt. Es kann auch eine Lücke im VPN-Dienst selber > sein, mit der man z.B. direkt Code ausführen kann. Dann ist der > Angreifer direkt drin und kann das ssh komplett umgehen. Ja, du hast Recht, es ist ein bisschen so-so. Je nach Fehler. Schon richtig dass das Argument nur in Gänze gilt wenn du das VPN auf eine andere Maschine tust.
Nano schrieb: > Du fütterst gnupg mit einer Datei und raus kommt das entschlüsselte > Ergebnis, wenn der Schlüssel passt. > Das beim Füttern was schief geht ist realistisch betrachtet so gut wie > unwahrscheinlich. > Ist die Eingabe kaputt, dann schlägt die Entschlüsselung fehl. Man bewundere dazu einfach die in den letzten 2 Jahren angefallenen kritischen Fehler in E-Mail-Programmen, die PGP verwenden: Microsoft hat direkt bei allen Nicht-HTML-Mails den unverschlüsselten Klartext mitgeschickt, wohl weil der Entwickler das Wort "Plaintext" missverstanden hat; und Thunderbird & Co konnte man dazu bringen, den Klartext nach dem Entschlüsseln in's Internet zu schicken indem man in einer Multipart-Komponente ein HTML-Tag nicht zugemacht hat. Beides hat mit der Kryptographie überhaupt nichts zu tun! In beiden Fällen war das Krypto richtig und es wird nur ein fertiges, fehlerfreies Tool aufgerufen. Im Gegenteil: Fehler im eigentlichen Kryptocode sind vergleichsweise selten. Die Fehler sind meist "dumm" und in irgendwas "einfachem". Aber klar, "das waren alles Noobs, uns würde sowas nie passieren!" ;) Denkt man sich. Stimmt aber nicht. > Bei mir läuft kein weiterer Dienst auf dem Server der an einem offenen > Port lauscht. Aber einer der Dateien aus dem Internet herunterlädt. Was entweder TLS verwendet oder gegen MITM-Angriffe verwundbar ist. > Okay, dann ist eben nur der VPN Port offen. > Das nützt dir aber nichts, wenn der VPN Dienst eine Sicherheitslücke hat > und du durch diese beliebigen Code ausführen kannst. > Das Problem ist dein Dienst läuft und ist von außen erreichbar und in > den 3 Wochen auf dem Boot hast du keine Möglichkeit die Sicherheitslücke > zu stopfen. Das ist richtig, wie gesagt wäre es sinnvoller den VPN-Client auf einen anderen Rechner zu tun.
:
Bearbeitet durch User
Gerd E. schrieb: > "Bastellösung"? > > Das Aufteilen von Funktionen auf verschiedene Rechner und das > Unterteilen von Netzen in kleinere DMZ-Segmente ist Stand der Technik. Dann hast du so eben auch meine Lösung damit als Nicht Bastellösung akzeptiert. Gerd E. schrieb: > Und wenn bei Dir der eine Steuerdienst z.B. durch bestimmte > Protokollfehler angreifbar ist, ist gleich der gesamte Rechner mit all > seinen zu schützenden Daten offen. Wie kommst du darauf? Entweder das Skript kann einen Dienst wie sshd einschalten oder nicht. Du schreibst in die Config ja nicht rein: zu_startender_dienst=sshd und übernimmst dann die Eingabe ungefragt mit einem start sshd sondern du prüfst ob sshd ein erlaubter Eintrag ist und startest dann bei true das, was fest als Startbefehl im Code steht. Also bspw. so (Pseudocode) switch(dienst) dienst == "sshd" dann "start sshd"; break; dienst == "vpn" dann "start vpn"; break; /* Man könnte auch blablub als Kennzeichnung schreiben, wenn auf blablub sshd gestartet werden soll * / dienst = "blablub" dann "start sshd"; break ... default mach nix. Gibt es also keinen Eintrag für dienstxy, dann kann dienstxy auch niemals gestartet werden. Es werden auch nicht irgendwelche beliebigen Scripte ausgeführt, weil das Script aus der Config keine Scripte übernimmt und ausführt. Den Aufwand mit Key Werte Paare und Abfrage ist ja schließlich nicht umsonst da. Es geht also nur das was erlaubt ist. Baust du in deine Switchanweisung deines Skripts folgendes ein: dienst == "unsichererDienst" dann "start meinselbstprogrammierterdienst" dann bist du selbst schuld. Wie etwas gestartet wird, das ist auf den diversen Distributionen in der Regel standardisiert. Im Prinzip ist so gut wie alles, was das Skript machen muss standardisiert. Würden wir zum Downloaden der Datei bspw. wget benutzen, dann würde ein Timer im Script laufen und dann einen Download triggern. Der Befehl der dann ausgeführt würde, wäre dann so etwas wie bspw. wget $url und wget $url2 wobei $url dann eine feste Adresse ist auf der man die Datei mit Namen bspw. config.ini.gpg und für $url2 config.ini.sig erwartet. Anschließend kommt die Signaturprüfung mit gnugpg zustande. Habe momentan gnupg nicht im Kopf, aber so etwas in der Art: gpg --verify config.ini.sig dürfte das sein. Liefert das Ding true zurück, dann wird entschlüsselt: gpg -d config.ini.gpg Jetzt muss das Script nur die Config Laden auswerten und nach obiger Switchanweisung die jeweiligen Dienste starten. Anschließend geht es zurück in die Timerloop. Sollte noch dabei stehen, das irgend ein Dienst zur Zeit x wieder beendet wird, dann wird das in der Timerloop erledigt. So in etwa. Das Script ist trivial, die Angriffsfläche praktisch nicht vorhanden. Steht in der config irgendwas wie: dienst=fab012149s....02431; Dann wird der Vergleich eher fehl schlagen, als dieser String dazu führen wird, dass die Bedingte Abfrage von bspw. Python kompromitiert wird und beliebiger Code ausgeführt werden kann. Man beachte hierbei auch, auch der Python Interpreter ist ein vielfach genutztes Stück Software. > Wenn Du die Dienste auf verschiedene Rechner aufteilst, wird im > Zweifelsfall nur die erste Stufe geknackt, dort sind aber keine so > wichtigen Daten drauf. Dann nutzt er deinen übernommenen Rechner eben für > 3 Wochen als Bot oder Bitcoinminer und du zahlst die Stromrechnung oder für den Schaden der daraus noch entstehen könnte. >> Bei mir sind es immer noch 6 Stufen die man überwinden muss. > > Du lässt Dich von der hohen Zahl "6 Stufen" blenden. Schon an Deiner 2. > Stufe reicht ein Fehler im HTTP-Handling etc. und es ist aus. Du übersiehst hier, so ein Angriff müsste in dem Fall von der Cloud erfolgen, denn die Verbindung ist per FW related. Andere IPs können nix machen. Der müsste also nicht bloß in deinen Account auf der Cloud eindringen, sondern die Cloud übernehmen, damit er dort Code ausführen kann um ein HTTP-Handling mit dem Downloadclient des Raspi zu stören. Wie wahrscheinlich ist das, das jemand root Zugang zur Google oder Microsoft Cloud erlangt und dann diesen dazu nutzt, den Raspi anzugreifen? Botnetze die erreichbare Dienste angreifen und bekannte oder gar unbekannte Sicherheitslücken ausnutzen sind dagegen ganz normal.
Nano schrieb: > Der Befehl der dann ausgeführt würde, wäre dann so etwas wie bspw. > wget $url > und > wget $url2 > > wobei $url dann eine feste Adresse ist auf der man die Datei mit Namen > bspw. config.ini.gpg und für $url2 config.ini.sig erwartet. Ich weise hier nochmal auf die deutlich krassere CVE-Liste für wget hin als für sshd. Ich denke, allein dieses wget hat schon ein größeres Potential angegriffen zu werden als ein richtig konfigurierter sshd. Als welcher Benutzer läuft das wget? Root? Hast du daran gedacht, dass ein Angreifer dir eine 500 GB große Datei in deine URL legen könnte? Das ist ein super DoS-Angriff, weil dein Skript, was deinen sshd startet, dann hängt. > Anschließend kommt die Signaturprüfung mit gnugpg zustande. > Habe momentan gnupg nicht im Kopf, aber so etwas in der Art: > gpg --verify config.ini.sig > dürfte das sein. Wobei man direkt mal die manpage zitieren kann: " Note: If the option --batch is not used, gpg may assume that a single argument is a file with a detached signature, and it will try to find a matching data file by stripping certain suffixes. Using this historical feature to verify a detached signature is strongly discouraged; you should always specify the data file explicitly." Hast du daran gedacht, dass gpg jetzt hier jeden Key akzeptiert, der irgendwann mal importiert wurde, also z.B. dass jeder deiner E-Mail-Kontakte auch so eine Signatur erzeugen kann? Ehrlich dran gedacht, ja? Du hattest im Kopf "jetzt muss ich hier noch meine Key-ID angeben, sonst verifiziert es zwar die Signatur aber nicht wer es eigentlich signiert hat", hast es aber aus Gründen der Einfachheit nicht hingeschrieben? Hast du daran gedacht, dass GPG zum Überprüfen einer großen Signatur (auch wenn sie falsch ist) unendlich lange rechnen könnte? Auch das ist ein super DoS-Angriff, der dich selbst aussperrt. > Das Script ist trivial, die Angriffsfläche praktisch nicht vorhanden. Klar. Trivial.
Sven B. schrieb: > Man bewundere dazu einfach die in den letzten 2 Jahren angefallenen > kritischen Fehler in E-Mail-Programmen, die PGP verwenden: Microsoft hat > direkt bei allen Nicht-HTML-Mails den unverschlüsselten Klartext > mitgeschickt, wohl weil der Entwickler das Wort "Plaintext" > missverstanden hat; und Thunderbird & Co konnte man dazu bringen, den > Klartext nach dem Entschlüsseln in's Internet zu schicken indem man in > einer Multipart-Komponente ein HTML-Tag nicht zugemacht hat. Der upload der verschlüsselten Datei auf die Cloud ist man selbst. Sollte man eine unverschlüsselte Datei auf die Cloud laden, dann hat man zwar den Aufbau der Config verraten, aber das bringt dem Angreifer nichts, da das Script von einer signierten und verschlüsselten Datei ausgeht und auch nur nach dieser sucht und diese dann entsprechend darauf testet. Thunderbird hat eine eigene HTML Engine bzw. die des Firefox. Das ist ein sehr komplexes Stück Software und nicht mit einem trivialen Skript vergleichbar. >> Bei mir läuft kein weiterer Dienst auf dem Server der an einem offenen >> Port lauscht. > > Aber einer der Dateien aus dem Internet herunterlädt. Was entweder TLS > verwendet oder gegen MITM-Angriffe verwundbar ist. Ja, die TLS Verbindung, aber die Verbindung ist durch die FW related und, das habe ich vergessen established iptables FW Regel nur von der Verbindung mit dem Clouddienst möglich. Oder kurz und einfach, die Firewall ist so eingestellt, das neue Verbindungen von außen gar nicht zugelassen werden.
Nano schrieb: > Oder kurz und einfach, die Firewall ist so eingestellt, das neue > Verbindungen von außen gar nicht zugelassen werden. Ja aber wie gesagt, du machst halt (als root, vermutlich!) TLS mit irgendeinem random Host. Das ist schon ok (außer der root-Teil), ich sage nur, die Angriffsfläche davon ist bereits vergleichbar mit der von ssh. Zu der Komplexität siehe meine Funde in deinem Trivialskript ...
:
Bearbeitet durch User
Nano schrieb: > Im Prinzip ist so gut wie alles, was das Skript machen muss standardisiert. Im Prinzip ist dein pc jetzt sicher. Und MITM solltest du bei FE related nochmal überdenken...
Schreib doch einfach mal so ein Skript, dann schauen wir uns das mal an und überlegen mal, was man damit alles anstellen kann.
Sven B. schrieb: > Ich weise hier nochmal auf die deutlich krassere CVE-Liste für wget hin > als für sshd. Ich denke, allein dieses wget hat schon ein größeres > Potential angegriffen zu werden als ein richtig konfigurierter sshd. Wie schon gesagt, das war nur ein Beispiel um zu zeigen, wie so ein Script aussehen kann. Du kannst auch einen anderen Client nehmen. > Als welcher Benutzer läuft das wget? Root? Nein, als extra User ohne besondere Rechte. Man muss natürlich dafür sorgen können, dass der zu startende Serverdienst mit seinen dafür vorgesehenen gestartet werden kann. Das Script ist auch nicht voll ausgewickelt, sondern erstmal nur grob veranschaulicht. So etwas, mit welchen Rechten was wie ausgeführt wird, muss natürlich entsprechend beachtet und auf das nötigste eingeschränkt werden. > Hast du daran gedacht, dass ein Angreifer dir eine 500 GB große Datei in > deine URL legen könnte? Das ist ein super DoS-Angriff, weil dein Skript, > was deinen sshd startet, dann hängt. Warum sollte das Script hängen? Gedacht habe ich zwar nicht daran, weil wie schon gesagt, das obige ist nur ein grober Entwurf wie das ungefähr aussehen könnte, und keine konkrete Umsetzung. Ich werde die auch nicht benötigen, sondern der TS. Im trivialsten Fall wird das Script die Datei wohl downloaden bis der Download fertig ist. Dass der sshd sofort verfügbar sein soll, davon bin ich sowieso nicht ausgegangen, weil ja die Config auf der Cloud plaziert wird und der Server sich das irgendwann in den nächsten 24 h runterladen wird. An eine konkrete Zeitplanung wie, um UTF 15:03 guckt der Server nach, dann wird um ca. UTF 15:04 der ssh Server erreichbar sein, also lad ich die Config erst um UTF 15:01 hoch, war nicht vorgesehen. Sondern eher, ich lade die Config hoch (es könnte bspw. UTF 1:00 sein). In der config habe ich eingestellt, dass der sshd Server um UTF 16:00 Uhr gestartet werden soll. Also guck ich um UTF 15:59 nochmal nach. Im übrigen ist das auch nicht relevant, denn wenn ich die Config uploaden muss, dann werde ich ja merken, dass jemand in die Cloud eingedrungen ist. Mit einer 2 Faktor Authentifizierung hol ich mir den Account zurück und ändere das Passwort, danach ist wieder gut. Und in der Zeit, in dem der Angreifer meinen Server mit einer platzierten Datei beschäftigt, wird das mich nicht betreffen. Im schlimmsten Fall führt der Server den Download bis zur Vollendung aus, prüft die Sig und schmeißt die Datei weg. Das skript würde dadurch nicht abstürzen und am nächsten Tag den Download wohl von neuem beginnen bis, ich das eben merke. Schlimmstenfalls wird vielleicht die Partition vollgeschrieben, falls keine Quote eingerichtet ist, spätestens dann wird das Skript nen Fehler merken dass die Platte voll ist, die Prüfung der Sig wird fehl schlagen, ansonsten passiert nicht viel. Aber ehrlich gesagt ist der Platz auf der Cloud begrenzt, insofern wird nicht einmal das passieren. Da du mich aber darauf hingewiesen hast, würde ich jetzt die Größe beim Download überprüfen lassen und eventuell noch ne Quota einrichten. Das ist jetzt also kein störendes Problem das den Server und das Skript irgendwie durcheinander bringen könnte. Allerschimmsten dringt er in die Cloud ein, nach dem ich meine Config upgeloaden habe und überschreibt sie mit seiner 500 GB Datei ehe der Server meine Config downgeladen hat. Am nächsten Tag werde ich das dann merken und korrigieren. >> Anschließend kommt die Signaturprüfung mit gnugpg zustande. >> Habe momentan gnupg nicht im Kopf, aber so etwas in der Art: >> gpg --verify config.ini.sig >> dürfte das sein. > > ... > Hast du daran gedacht, dass gpg jetzt hier jeden Key akzeptiert, der > irgendwann mal importiert wurde, also z.B. dass jeder deiner > E-Mail-Kontakte auch so eine Signatur erzeugen kann? Wie schon gesagt, ich müsste mir die gpg man Page genauer durchlesen, dann würde ich das auch beachten. Das man bei gpg nen Keyring hat ist mir durchaus klar. > Hast du daran gedacht, dass GPG zum Überprüfen einer großen Signatur > (auch wenn sie falsch ist) unendlich lange rechnen könnte? Auch das ist > ein super DoS-Angriff, der dich selbst aussperrt. Ich habe mal ne 600 MB ISO auf nem 1 GHz Athlon verschlüsselt, das hielt sich von der Dauer in Grenzen. Auf die Cloud passen bei der MS Cloud nur 5 GB, mehr kann er nicht platzieren. Und wie ich oben schon geschrieben habe, gehe ich nicht von einer sofortigen Verfügbarkeit des sshd servers aus. Aber ich gebe zu, es macht Sinn eine Abbruchbedingung schon beim Download einzubauen um die Größe auf das, was für eine Configdatei plausibel ist zu begrenzen. >> Das Script ist trivial, die Angriffsfläche praktisch nicht vorhanden. > > Klar. Trivial. Du hast mir noch keinen Angriff genannt der meinen Server kompromittiert. Und der DOS ist kaum relevant.
Sven B. schrieb: > Nano schrieb: >> Oder kurz und einfach, die Firewall ist so eingestellt, das neue >> Verbindungen von außen gar nicht zugelassen werden. > > Ja aber wie gesagt, du machst halt (als root, vermutlich!) TLS mit > irgendeinem random Host. Das ist schon ok (außer der root-Teil), Nein, wie schon gesagt kein root. Daran habe ich schon gedacht. > > Zu der Komplexität siehe meine Funde in deinem Trivialskript ... Viel gefunden hast du leider nicht, außer dem DOS, der in dem Fall kaum eine Rolle spielt und durch den Platz auf der Cloud begrenzt ist.
J. S. schrieb: > Nano schrieb: >> Im Prinzip ist so gut wie alles, was das Skript machen muss standardisiert. > > Im Prinzip ist dein pc jetzt sicher. > Und MITM solltest du bei FE related nochmal überdenken... Ja, established kommt eventuell noch dazu, eventuell auch new, es ist schon länger her, dass ich mir eine iptables FW eingerichtet habe. Fest steht aber, dass ich genau gesagt, was ich bezüglich der FW meine. Nämlich nur die Cloud, durch die von meinem Server geöffnete Verbindung und sonst nix. Die Details der iptables FW Regel kann man sich dann genauer ansehen, wenn es um eine konkrete Umsetzung geht.
Sven B. schrieb: > Schreib doch einfach mal so ein Skript, dann schauen wir uns das mal an > und überlegen mal, was man damit alles anstellen kann. Der obige grobe "Ungefähr So"-Entwurf muss reichen, für ein konkretes Skript fehlt mir die Zeit. Ich muss noch ein paar andere Sachen machen. Z.B. wartet ne Bugmeldung für ne Distri, die ich unbedingt schreiben wollte, schon seit 6 Wochen und ich bin zu der auch noch nicht gekommen. Dazu noch eine Reihe weiterer Projekte in meiner Freizeit. Zumal ich ein konkretes Skript jetzt auch nicht brauche. Aber der TS könnte eines schreiben, dann helfe ich gerne mit das bei Bedarf auszubessern. :) Der grobe Entwurf ist ja schon mal ein Anfang wo man ansetzen könnte.
Noch eine kleine Erängzung zum Skript. Bezüglich dem Zeitpunkt wann ein Dienst gestartet und wieder beendet werden soll, legt man mit dem Skript am besten einfach einen Cron Job an.
Noch eine Ergänzung; Genaugenommen könnte man auch das Skript per cron Job starten und notfalls zuwangsbeenden, wenn es zu lange dauert.
Nano schrieb: > Noch eine Ergänzung; > Genaugenommen könnte man auch das Skript per cron Job starten und > notfalls zuwangsbeenden, wenn es zu lange dauert. Und natürlich beim nächsten Start oder beim zwnagsbeenden sicherstellen, dass auch eine unfertige 500 GB config Datei wieder gelöscht wird.
Ja aber kuck mal, jetzt hast du schon 3 Seiten Kram geschrieben was du alles machen musst damit X nicht passiert und woran man denken muss. Ich sage ja nicht, dass es nicht geht, die Aufgabe ist nicht wahnsinnig komplex. Ich sage aber, schreib es mal praktisch auf; es wird durchaus ein bisschen komplizierter als du so denkst, und der erste Versuch wird vermutlich nicht so sein, dass man nicht mit 15 Minuten Suchen irgendwas findet, was sich unter irgendeinem Umstand komisch verhält. Diese Eigenschaft hat der sshd nicht: und deshalb ist es besser, das komische Skript einfach wegzulassen und nur den sshd laufen zu haben.
Das mit dem wackligen Stecker kann man ein wenig umgehen. Es gibt einige Shops (rate mal welcher auch dabei ist ;-) ),welche USB Kabel mit SCHALTER anbieten. Dadurch muss der USB Stecker nciht gefühlte 100 mal an- und abgeseckt werden.
Mein Pi ist auch per ssh von "überall" aus erreichbar. Folgende Maßnahmen sollten reichen: 1) login per username/passwort sperren und nur Key authentication erlauben 2) fail2ban 3) evtl. noch bestimmte Regionen black- oder whitelisten 4) Updates installieren Wichtig ist: Keine selbstgestrickten Lösungen wie ein TCP/IP-basiertes Kommandointerface. Jede zusätzliche Schnittstelle ist ein offenes Scheunentor, vor allem wenn es sich um eine eigene Bastellösung handelt. Kein Security by Obscurity (z.B. ssh-Port ändern). Das gibt keine zusätzliche Sicherheit, gaukelt aber falsche Sicherheit vor. Edit: sehe grad in meinen Notizen: Raspbian hat kein root-Passwort. Zumindest war das 2015 so. Also, gib dem root noch ein Passwort, falls noch nicht geschehen.
:
Bearbeitet durch User
Alles ein Wenig auf der aufwendigen Seite. Ne extra App zusammenkloppen, anstelle ueber einen Webserver zu gehen. Webserver mit SSL sind auch schon lange Standard. Dann muss ich mich nur darum kuemmern einen aktuellen Browser zu haben. Ich kann mich drauf verlassen, dass das Protokoll auch geroutet wird, was mit irgendwelchen Ports nicht der Fall sein muss.
Le X. schrieb: > Kein Security by Obscurity (z.B. ssh-Port ändern). > Das gibt keine zusätzliche Sicherheit, gaukelt aber falsche Sicherheit > vor. Einen Vorteil hat dan Ändern: Es fallen 99,9 % der Meldungen über Verbindungsversuche von Bots im Log weg.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.