{"id":463,"date":"2017-07-06T14:29:41","date_gmt":"2017-07-06T12:29:41","guid":{"rendered":"https:\/\/www.pingu-mobil.de\/iot\/?p=463"},"modified":"2021-05-14T10:07:48","modified_gmt":"2021-05-14T08:07:48","slug":"sdim-das-image-lernt-prosody-tor-und-nodejs","status":"publish","type":"post","link":"http:\/\/www.iot-embedded.de\/iot-2017\/sdim\/sdim-das-image-lernt-prosody-tor-und-nodejs\/","title":{"rendered":"SDIM: Das Image lernt Prosody, Tor und NodeJS"},"content":{"rendered":"<p>In der Zwischenzeit sind alle einzelnen Artefakte erstellt und f\u00fcr sich selbst lauff\u00e4hig. Wie bereits im Beitrag zu <a href=\"https:\/\/www.pingu-mobil.de\/iot\/2017\/06\/11\/xmpp-server-und-tor\/\">XMPP- und Tor<\/a>\u00a0erkl\u00e4rt, ist der Tor Client in der Lage, eine Verbindung mit dem Netzwerk herzustellen und \u00fcber eine Onion-Adresse erreichbar zu sein. Bei korrekter Konfiguration des VHosts (Onion-Adresse) kann Prosody auch erfolgreich den Server starten und eine Verbindung \u00fcber einen XMPP-Client (z.B. Conversations) hergestellt werden. Auch das Webinterface auf NodeJS-Basis ist soweit lauff\u00e4hig. All diese Teile m\u00fcssen jedoch in das Image integriert werden und daf\u00fcr gesorgt werden, dass diese beim Boot erfolgreich starten. Zu diesem Zweck wurde ein zentrales Start-Script erstellt, welches wiederum alle Bestandteile des SDIM-Projekts startet. Dazu geh\u00f6ren die folgenden Teile:<\/p>\n<ul>\n<li>Konfigurieren und Starten von Tor<\/li>\n<li>Warten auf eine Tor Verbindung<\/li>\n<li>Konfigurieren und Starten von Prosody<\/li>\n<li>Start der Webanwendung (NodeJS)<\/li>\n<\/ul>\n<h2>Tor<\/h2>\n<p>Beim Erstellen des Images wird das Tor-Paket installiert. Dadurch stellt der Client automatisch eine Verbindung mit dem Netzwerk her und speichert sein Schl\u00fcsselpaar ab. Da wir jedoch vermeiden m\u00fcssen, dass jede SDIM-Instanz aus dem gleichen Image auch den gleichen Onion-Hostname erh\u00e4lt, wird dieses Schl\u00fcsselpaar am Ende der Imageerstellung gel\u00f6scht. Beim ersten Start des RaspberryPis pr\u00fcft ein Script deshalb auf die Existenz des Schl\u00fcsselpaars: Ist das Schl\u00fcsselpaar nicht vorhanden, wird ein neuer Schl\u00fcssel (und damit eine neue Onion-Adresse) generiert. Dies tritt prim\u00e4r beim ersten Start des RaspberryPis auf. Zu den nachfolgenden Zeitpunkten hat der RaspberryPi jeweils ein eigenes Schl\u00fcsselpaar und muss deshalb kein neues generieren.<\/p>\n<h2>Prosody<\/h2>\n<p>Auch die Prosody-Pakete werden bei der Imageerstellung direkt im Image integriert. Auch hier generiert der Server direkt ein Schl\u00fcsselpaar, welches f\u00fcr die Transportverschl\u00fcsselung zwischen Client und Server dient. Auch dieses Zertifikat sollte idealerweise bei jeder SDIM-Instanz unterschiedlich sein, damit der Anwender eine m\u00f6gliche Man-In-The-Middle-Attacke erkennen kann.<\/p>\n<p>Da\u00a0Tor aber erst beim Start des RaspberryPis seinen Onion-Namen bezieht; diese Adresse aber f\u00fcr die Zertifikatserstellung und die Konfiguration des VHosts ben\u00f6tigt wird, setzen wir auch hierbei auf ein Bash-Script. Dieses Script bezieht die Onion-Adresse von Tor und pr\u00fcft auf Vorhandensein des Prosody-Schl\u00fcsselpaars. Ist das Schl\u00fcsselpaar nicht vorhanden, wird ein Neues passend f\u00fcr die Onion-Adresse generiert. Anschlie\u00dfend erstellt das Script die VHost-Konfiguration f\u00fcr Prosody, durch die der Server erst die Information erh\u00e4lt, welchen Hostname\/Domainname er f\u00fcr die Jabber-IDs verwenden soll. Abschlie\u00dfend wird der Prosody-Dienst neugestartet, damit alle \u00c4nderungen aktiv werden.<\/p>\n<h2>NodeJS<\/h2>\n<p>Die letzte Herausforderung ist die Integration der Node-Anwendung (Webinterface zur Administration). Das Grundpaket &#8222;nodejs&#8220; wird bei der Imageerstellung aus den offiziellen Paketquellen installiert. Ebenfalls durch das Installationsscript wird die Webanwendung in das Image kopiert und in <strong>\/opt\/sdim\/webinterface<\/strong> abgelegt (vgl. Overlay-Verzeichnis). \u00a0Das zentrale SDIM-Startscript werden abschlie\u00dfend noch alle ben\u00f6tigten Node-Module per <strong>npm install -a<\/strong>\u00a0installiert und die Node-Anwendung gestartet.<\/p>\n<p>&nbsp;<\/p>\n<p>Abschlie\u00dfend sind noch kleine Modifikationen an dem Webinterface selbst n\u00f6tig, die jedoch keine Anpassung am Image-Erstellungs-Prozess erfordern. Zus\u00e4tzlich stehen noch abschlie\u00dfende Teste zur vollst\u00e4ndigen Funktionalit\u00e4t des Images an.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In der Zwischenzeit sind alle einzelnen Artefakte erstellt und f\u00fcr sich selbst lauff\u00e4hig. Wie bereits im Beitrag zu XMPP- und Tor\u00a0erkl\u00e4rt, ist der Tor Client in der Lage, eine Verbindung mit dem Netzwerk herzustellen und \u00fcber eine Onion-Adresse erreichbar zu<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/463"}],"collection":[{"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/comments?post=463"}],"version-history":[{"count":1,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/463\/revisions"}],"predecessor-version":[{"id":558,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/463\/revisions\/558"}],"wp:attachment":[{"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/media?parent=463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/categories?post=463"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/tags?post=463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}