Nils Schneider

Automatische Updates für OpenWRT

Mithilfe des autoupdaters sind automatische Firmwareupdates möglich. Der autoupdater benötigt die ecdsautils, welche auch zum Signieren der Updates notwendig sind.

Firmwareupdates können (und sollten!) mit mehreren Schlüsseln signiert werden. Dies ermöglicht es ein Update erst dann auszuführen nachdem z.B. 3 von 5 Maintainern das Update signiert haben.

Die Verteilung der Updates erfolgt über HTTP, also einem normalen Webserver. Es wird empfohlen eine statische IP im gleichen Netzsegment wie die Knoten zu verwenden um sicher zu stellen, dass der Updateserver in jedem Fall erreicht werden kann. Auf dem Server werden lediglich Dateien abgelegt, sodass keine spezielle Konfiguration erforderlich ist.

Einschränkungen

Bisher funktioniert der autoupdater nur auf TP-Link Modellen. Eine Anpassung an andere Plattformen ist jedoch leicht möglich.

Erzeugen der Schlüsselpaare

Jeder Maintainer erzeugt zunächst ein ecdsa-Schlüsselpaar. Als erstes wird der private Schlüssel erzeugt und in einer Datei, hier ~/update-secret, gespeichert:

ecdsakeygen -s > ~/update-secret

Das generieren des Schlüssels kann einige Zeit in Anspruch nehmen, falls nicht genügend Entropie verfügbar ist. Abhilfe schafft ein Entropiedaemon wie haveged.

Aus dem privaten Schlüssel wird nun mittels

ecdsakeygen -p < ~/update-secret

der öffentliche Schlüssel berechnet und ausgegeben. Diese öffentlichen Schlüssel sollten von allen Maintainern gesammelt werden.

Konfiguration des autoupdaters auf den Knoten

Die Konfiguration erfolgt in der Datei /etc/config/autoupdater:

config autoupdater
        option url 'http://[fdef:ffc0:3dd7::1]/firmware/latest'
        option probability 0.02
        option good_signatures 2

        list pubkey 'beea7da92ed0c19563b6c259162b4cb471aa2fdf9d3939d05fea2cf498ea7642'
        list pubkey 'c75c9390cf5d7cc49a388d35f831ca379060cf7bca8c6e3d2d1ea31604597c42'
        list pubkey '03e9514f137f0467c0f0ac108892c0da2b71f1039b30f863331cbd5701abd042'

Konfiguration des Updateservers

Auf dem Updateserver werden die Firmwareimages zusammen mit einer manifest-Datei abgelegt:

# ls /var/www/firmware/
lff-0.3.2-ar71xx-generic-tl-wdr3600-v1-squashfs-factory.bin
lff-0.3.2-ar71xx-generic-tl-wr1043nd-v1-squashfs-factory.bin
...
manifest

Die Firmwareimages sind dabei die üblichen …-factory.bin- bzw. …-sysupgrade.bin-Dateien.

Der Aufbau der manifest-Datei ist wie folgt:

# Hardware-ID  Version Dateiname                                                    Signaturen
tplink10430001 0.3.2-1 lff-0.3.2-ar71xx-generic-tl-wr1043nd-v1-squashfs-factory.bin 07e8d6d4abade3a7ed6a91f9ef9124e0c88ef78253ec9093dd5f8d8d54eb5805390e64e688d64423b6fc531abbe257855a298150626f608c84dfa44005521d0f d8e8b1f8834ae7f3564b24ddd63382734c45a22bcda07765860fd7d09aa97c0b8fc3123d54a1039964d8b39d82260b7b0b5837be47dcafef60b1ce432b6db204
tplink07410001 0.3.2-1 ...
...

Es können beliebig viele Signaturen, durch Leerzeichen getrennt, an eine Zeile angefügt werden. Pro Zeile kann ein Update pro Hardware-ID angegeben werden. Bekannte Hardware-IDs sind:

tplink07410001
tplink07410004
tplink08410007
tplink08410008
tplink08420001
tplink10430001
tplink36000001

Das Script autoupdate -f gibt die Hardware-ID aus, falls kein gültiges Update gefunden wurde.

Signieren von Updates

Mit dem Tool ecdsasign werden Updates signiert:

ecdsasign firmware-factory.bin < ~/update-secret

Die Signatur wird ausgegeben. Auch dieser Vorgang benötigt viel Entropie.

manuelles starten des Autoupdaters

Mittels autoupdate -f kann ein manuelles Update ausgelöst werden.