Webhooks eignen sich wunderbar dazu, Aktionen bei bestimmten Server-Ereignissen anzustoßen, nur sind sie von Haus aus nicht sonderlich sicher. Ein API Key soll den Zugriff auf unsere in diesem Tutorial erstellte Azure Function künftig absichern.

Unsere Azure-Function horcht auf jede Nutzlast, die vom konfigurierten Endpunkt gesendet wird, sobald sie zum Empfang von Nutzlasten konfiguriert ist. Oft möchte man aber aus Sicherheitsgründen nur Anforderungen von beispielsweise GitHub akzeptieren und von nirgendwo anders her. Für ein solches Unterfangen sind verschiedene Möglichkeiten denkbar. Man könnte Anforderungen z. B. nur von GitHub-IP-Adressen erlauben. Professioneller und trotzdem einfacher einzurichten ist es, ein geheimes Token zu konfigurieren und Anforderung nur bei validem Token zuzulassen.

Mit dem Einrichten eines Webhook-Secrets kann man sicherstellen, dass an die Nutzlast-URL gesendete POST-Anforderungen von GitHub sind. Dazu steht beim Konfigurieren eines Webhooks das bisher nicht besprochene Feld „Secret“ zur Verfügung. Wenn man so ein Geheimnis festlegt, erhält die Webhook-POST-Anforderung den x-hub-signature-Header.

 

Für die Konfiguration eines Webhooks steht unter GitHub das Feld „Secret“ zur Verfügung (Bild: Drilling / GitHub)
Für die Konfiguration eines Webhooks steht unter GitHub das Feld „Secret“ zur Verfügung (Bild: Drilling / GitHub).

Zur Vorbereitung der Secret-Verwendung in unsere Azure-Function navigieren wir im Azure-Portal erneut zu unserer Funktion und bearbeiten wieder unsere JavaScript-Datei index.js und ergänzen am Anfang der Datei einen Verweis auf die crypto-js-Bibliothek mit Hilfe der module.exports-Anweisung:

const Crypto = require(‚crypto‘);

Dann wechseln wir im Menü „Entwickler“ links zum Abschnitt „Funktionsschlüssel“ und zeigen den Wert des Standardschlüssels „default“. Dazu klickt man auf „Werte anzeigen“.

Im Bereich „Funktionsschlüssel“ unter Azure können wir den bestehenden Default-Schlüsselwert in die Zwischenablage kopieren.
Im Bereich „Funktionsschlüssel“ unter Azure können wir den bestehenden Default-Schlüsselwert in die Zwischenablage kopieren. (Bild: Drilling / Microsoft).

Nun können wir den bestehenden Default-Schlüsselwert in die Zwischenablage kopieren, wechseln dann zurück zum Funktions-Editor und ergänzen …

 

const hmac = Crypto.createHmac(„sha1“, „<default key>“);
const signature = hmac.update(JSON.stringify(req.body)).digest(‚hex‘);

…, wobei der „<default key>“ entsprechend zu ersetzen ist.

Damit der Schlüssel allerdings dem Format von x-hub-signature im Anforderungs-Header entspricht, müssen wir noch ein „sha1=“ zu Beginn des Schlüssels einfügen:

const shaSignature = ’sha1=${signature}‘;

Dann müssen wir noch den Code zum Abrufen der GitHub-Signatur aus dem Anforderungs-Header ergänzen:

const gitHubSignature = req.headers[‚x-hub-signature‘];

Das Verarbeiten der Anforderung sieht dann wie folgt aus:

Der aktualisierte http-Trigger mit API-Keys.
Der aktualisierte http-Trigger mit API-Keys. (Bild: Drilling / Microsoft).

(!shaSignature.localeCompare(gitHubSignature)) {

   // Existing code
   if (req.body.pages[0].title) {

      …   }
}
else {

   context.res = {

      status: 401,
      body: „Signatures don’t match“
   };
}

Hier weiterlesen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.