Simon Szustkowski

Ein Blog über alles, was mir gerade so durch den Kopf geht

May 4, 2014

OwnTracks/MosQuiTTo unter Debian installieren

Ich habe mir kürzlich eine Owntracks- bzw. MosQuiTTo-Instanz auf meinem Server installiert, um einfach mal mitzuloggen, wo ich mich so aufhalte. Bei Bedarf könnte ich das ganze noch zu einer Location-Sharing-Instanz, ähnlich wie Google Latitude aufbohren. Da sich die Installation, gerade mit TLS, nicht so einfach gestaltet hat, möchte ich kurz erläutern, wie ich vorgegangen bin.

  1. Zunächst muss ein MQTT-Broker installiert werden. MQTT ist ein Protokoll, über das kurze Nachrichten, bzw. Statusmeldungen asynchron verteilt werden können. In dem Fall ist das ein Set aus Koordinaten, aber es würden auch andere Sachen gehen, z.B. dass ein Thermometer mit Ethernet-Anschluss immer die aktuelle Temperatur announced, oder dass eine Waschmaschine meldet, dass das Waschprogramm durchgelaufen ist. Diese Nachrichten werden von einem Broker angenommen, und können von dort zur weiteren Verarbeitung abgeholt werden.
  2. Ein verbreiteter Broker ist Mosquitto. Dessen Team stellt freundlicherweise ein Debian-Repository zur Verfügung, von dem die aktuellsten Versionen installiert werden können. Die Einbindung dieses Repositorys, und die Installation von Mosquitto erfolgt so:
    curl -O http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key sudo apt-key add mosquitto-repo.gpg.key rm mosquitto-repo.gpg.key cd /etc/apt/sources.list.d/ sudo curl -O http://repo.mosquitto.org/debian/mosquitto-repo.list sudo apt-get update sudo apt-get install mosquitto mosquitto-clients python-mosquitto
  3. Der Broker läuft nun mit den Standardeinstellungen, und muss nun konfiguriert werden. Dafür stoppen wir ihn erstmal: sudo /etc/init.d/mosquitto stop
  4. Es wäre angebracht, wenn die Verbindung des Smartphones mit dem Broker verschlüsselt über TLS erfolgt. Hierfür müssen erst einmal die notwendigen Schlüssel erzeugt werden, und aufs Smartphone importiert werden. Mosquitto empfiehlt hierbei das Initialisieren einer eigenen Certificate Authority (CA), da nur die Clients, die das CA-Zertifikat haben, sich auf den Broker verbinden können. Da Mosquitto sonst noch keine weiteren Auth-Mechanismen mitbringt, ist das die einzige Form der Zugriffskontrolle, die Mosquitto bisher mitbringt. Unter Debian existieren bereits einige Verzeichnisse für die Keys und Zertifikate, die aber noch befüllt werden müssen.
    cd /etc/mosquitto/ca_certificates sudo openssl req -new -x509 -days 3650 -extensions v3_ca -keyout ca.key -out ca.crt cd /etc/mosquitto/certs sudo openssl genrsa -out server.key 2048 sudo openssl req -out server.csr -key server.key -new sudo openssl x509 -req -in server.csr -CA /etc/mosquitto/ca_certificates/ca.crt -CAkey /etc/mosquitto/ca_certificates/ca.key -CAcreateserial -out server.crt -days 3650

Ihr habt nun ein CA-Zertifikat samt Key und ein Server-Zertifikat samt Key, die beide 3650 Tage (10 Jahre) lang gültig sind. Bei Bedarf könnt ihr die Parameter natürlich anpassen. 5. Nun gilt es, Mosquitto ordentlich zu konfigurieren. Er wird danach TLS nutzen, loggen, und einmal auf dem Standardport auf localhost lauschen, und einmal auf dem Port für den Owntracks-Client auf jede IP.

vim /etc/mosquitto/conf.d/default.conf
# Hier folgendes reinpasten
autosave_interval 1800
connection_messages true
log_dest stderr
log_dest topic
log_type error
log_type warning
log_type notice
log_type information
log_type all
log_type debug
log_timestamp true
listener 1883 127.0.0.1
listener 8883
tls_version tlsv1
cafile /etc/mosquitto/ca_certificates/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
require_certificate false```
 Nun kann der Broker wieder gestartet werden.  
`/etc/init.d/mosquitto start`  
 Wie gesagt, er hat keine unfassbar tollen Auth-Mechanismen, d.h. theoretisch könnte jetzt Jedermann Nachrichten an den Broker schicken. Solang die aber nicht weiter verwertet werden, verwirft der Broker die dann irgendwann wieder.
6. Nun geht’s ans konfigurieren der Clients. Wie das im Genauen funktioniert, ist von Client zu Client unterschiedlich. Ihr braucht in jedem Fall das ca.crt, was in /etc/mosquitto/ca_certificates gespeichert ist. Dies muss in euer Smartphone importiert werden. Der anzugebende Hostname ist die IP oder FQDN eures Servers, der Port ist die 8883. Als Kanal nehmt ihr /owntracks/username/devicename oder so etwas. Die Wurzel muss “owntracks” heißen, da das Script zur Weiterverarbeitung nachher davon ausgeht. Der Client sollte, zumindest auf iOS unten rechts ein grünes Icon anzeigen. Um zu prüfen, ob der Broker Nachrichten bekommt, könnt ihr folgenden Befehl ausführen: `mosquitto_sub -h localhost -p 1883 -v -t 'owntracks/#'`. Ihr habt nun alle Nachrichten abonniert, die über den Owntracks-Kanal reinkommen. Sollte euer Smartphone die Location erfolgreich an den Broker senden, seht ihr das jetzt.
7. Kommen wir nun zum letzten Punkt der Installation. Ein Backend, was sich die Daten aus dem Broker abholt, und persistent in einer MySQL-Datenbank speichert. Hierfür benötigt ihr Python, was Debian aber in der Regel schon mitbringt, sowie git, um den Code des Backends auf euren Server zu klonen.  

git clone https://github.com/owntracks/backend cd backend/m2s rm peewee.py pip install peewee sudo apt-get install python-mysqldb```

In eurer MySQL-Datenbank solltet ihr nun einen User für Owntracks anlegen, am besten direkt mit zugehöriger Datenbank, und die Werte dann in settings.py eintragen (unter #Storage). Die Werte unter #Broker müsst ihr nicht anpassen, falls ihr dieser Anleitung gefolgt seit, aber man könnte hier theoretisch einen anderen Kanal, sowie einen anderen Hostnamen und Port eintragen.
Die beiden anderen Plugins, weather und revgeo bevölkern die Datenbank überdies mit dem aktuellen Wetter, sowie der regulären Postadresse für jede Location. Die Struktur der Datenbank wird mit python dbschema.py angelegt, und dann kann man das Backend mit python m2s.py & starten und in den Hintergrund schicken. Eure Datenbank wird sich nun füllen. 8. Zum Abschluss noch ein Hinweis: Nicht Location und Waypoints verwechseln. Locations werden kontinuierlich aufgenommen (je nach Clienteinstellung), Waypoints sind quasi Locations mit Anmerkungen, die ihr z.B. sharen wollt oder so. Nach meiner Logik müssten beide Typen genau andersherum heißen, aber nun wisst ihr’s ja.

Was ihr nun mit dem funktionierenden MQTT-Location-Node macht, ist euch überlassen. Ihr könntet ihn mit anderen Nodes bridgen, und den Leuten auf dem anderen Node folgen. Oder einfach weitere Freunde in euren Node einladen. Oder schicke Sachen mit den Daten im Backend machen (guckt euch z.B. mal gpxexporter.py an). So oder so: Viel Spaß. ;)