Archiv des Autors: Jörg Kastning

Ansible: Playbook nur auf Nodes laufen lassen, die gewissen Kriterien genügen

Manchmal möchte man ein Playbook bzw. Plays nur auf Hosts laufen lassen, welche gewissen Kriterien entsprechen. In diesem Beitrag möchte ich zwei Beispiele geben, wie sich dies umsetzen lässt.

Playbook nur auf Hosts mit Red Hat Betriebssystem ausführen

Das Modul group_by [1] wird genutzt, um während des Laufs eines Playbooks dynamisch Gruppen von Hosts zu erstellen, auf welche man später weitere Plays anwendet.

---
- hosts: all

  tasks:
    - name: Group by OS

      group_by: key=os_{{ ansible_distribution }}
      changed_when: False

- hosts: os_RedHat
  roles:
    - common

Zu Beginn eines Playbook-Laufs wird das Modul setup [2] ausgeführt, um Variablen mit nützlichen Informationen über die Nodes zu belegen. Die Variable ansible_distribution enthält dabei ein Schlüsselwort für eine bestimmte Distribution.

In obigen Beispiel wird dabei die Gruppe os_RedHat erstellt. Im Folgenden werden dann alle Nodes dieser Gruppe der Rolle common zugeordnet.

Dieses Verfahren lässt sich natürlich auch für weitere Variablen anwenden. Möchte man sehen, welche Variablen belegt werden und genutzt werden können, kann sich die Rückgabe von setup in der Standardausgabe ansehen, wenn man das Modul manuell auf einigen Nodes ausführt.

Plays nur auf bestimmten Nodes ausführen

Ein weiteres Beispiel habe ich auf ITrig [4] gefunden:

---
- name: install open-vm-tools
  hosts: vmwareclients
  gather_facts: True
  become: true
  become_user: root
  tasks:
- name: debian install open-vm-tools
  apt: name=open-vm-tools state=present
  when: ansible_os_family == "Debian" and ansible_virtualization_type == "VMware"

- name: centos install open-vm-tools
  yum: name=open-vm-tools state=present
  when: ansible_os_family == "RedHat" or ansible_distribution == 'CentOS' and ansible_virtualization_type == "VMware"

Hier werden Ansible Conditionals [3] verwendet, um zu bestimmen, auf welchen Nodes ein Play ausgeführt wird. Auch hier werden wieder Variablen ausgewertet, welche durch das Modul setup [2] belegt wurden.

In obigen Beispiel wird dies genutzt, um die open-vm-tools mit einem Playbook sowohl auf Debian und RedHat/CentOS Systemen zu installieren.

Quellen

  1. group_by – Create Ansible groups based on facts {en}
  2. setup – Gathers facts about remote hosts {en}
  3. Conditionals {en}
  4. Ansible Playbooks auf Servern mit SSH Key Authentifizierung verwenden {de}

Unit-Typ systemd.path kurz vorgestellt

Mit systemd.path lassen sich Dateien und Verzeichnisse auf bestimmte Ereignisse hin überwachen. Tritt ein spezifiziertes Ereignis ein, wird eine Service-Unit ausgeführt, welche üblicherweise den gleichen Namen, wie die Path-Unit trägt.

Wie dies funktioniert, möchte ich an einem sehr einfachen Beispiel zeigen. Das Ziel ist, die Datei testfile auf Änderungen hin zu überwachen. Immer wenn die Datei nach einem Schreibvorgang geschlossen wird, soll ein bestimmtes Skript gestartet werden.

beispiel.path

Im Verzeichnis /etc/systemd/system/ wird die Datei beispiel.path mit folgendem Inhalt erstellt:

[Unit]
Description=Datei auf Änderungen hin überwachen

[Path]
PathChanged=/home/oglattermann/testfile
Unit=beispiel.service

[Install]
WantedBy=multi-user.target

In der Sektion [Path] wird mit PathChanged= der absolute Pfad zu der zu überwachenden Datei spezifiziert, während Unit= angibt, welche Service-Unit ausgeführt werden soll, wenn sich die Datei ändert. Diese Unit soll gestartet werden, wenn sich das System im Multi-User-Mode befindet.

beispiel.service

Wird die Datei testfile geändert (genau: geschrieben und geschlossen), wird folgende Service-Unit aufgerufen, um das darin spezifizierte Skript auszuführen:

[Unit]
Description=Führt Skript aus, wenn eine Datei sich geändert hat.

[Service]
Type=simple
ExecStart=/home/oglattermann/skript.sh

[Install]
WantedBy=multi-user.target

Das Skript skript.sh enthält dabei in diesem Beispiel lediglich folgenden Code:

#!/bin/bash
echo "Datei geändert" >/home/oglattermann/Output.txt

Für einen Test müssen die beiden soeben erstellten Units noch aktiviert werden:

sudo systemctl enable beispiel.path beispiel.service
sudo systemctl start beispiel.path

Schreibt man nun die Datei testfile neu bzw. wird eine Schreiboperation auf diese Datei abgeschlossen, wird die entsprechende Service-Unit ausgeführt und man findet die Datei Output.txt vor.

Anwendungsbeispiele

Die folgende, unvollständige und nicht abschließende Liste führt einige Anwendungsbeispiele auf, wo sich systemd.path sinnvoll nutzen lässt.

  • Ereignisgesteuerte Datenverarbeitung starten
  • Dateien unter /etc überwachen und bei Änderungen Benachrichtigung versenden
  • Import-Ordner auf neue Dateien hin überwachen und Verarbeitung starten

Quellen und weiterführende Links

Wie kann man mit tcpdump HTTP-Traffic eines bestimmten Hosts sniffen?

Diese Frage wurde bereits von Scott in seinem englischsprachigen Blog beantwortet. Ich gebe sie an dieser Stelle wieder, um nicht immer wieder danach suchen zu müssen.

Das Kommando lautet:

tcpdump -c 20 -s 0 -i eth1 -A host 192.168.1.1 and tcp port http

Die Parameter bedeuten:

  • -c 20: Beendet den Vorgang, nachdem 20 Pakete aufgezeichnet wurden.
  • -s 0: Die mitgeschnittenen Nutzdaten sollen ungekürzt wiedergegeben werden.
  • -i eth1: Zeichne nur Pakete an der Netzwerkschnittstelle eth1 auf.
  • -A: Gebe alle Pakete in ASCII aus.
  • host 192.168.1.1: Zeichne nur Pakete auf, die von Host 192.168.1.1 kommen.
  • and tcp port http: Zeichne nur HTTP-Pakete auf.

Ergänzt man den Befehl noch um -w DATEINAME wird die Aufzeichnung in eine Datei statt auf die Standardausgabe geschrieben.

sht21andrasppi

Raspi-SHT21 Version 2 BETA veröffentlicht

Zwei Jahre sind seit dem letzten Release vergangen. Letztes Wochenende fand ich nun endlich die Zeit, mich wieder mit dem Projekt Raspi-SHT21 zu befassen. Herausgekommen ist die BETA der Version 2.

Alle Informationen zur neuen Version gibt es in den Versionsinformationen auf GitHub und in der README-Datei des Projekts.

Bei mir daheim läuft die neue Version bisher stabil. Da ausführliche Tests fehlen, habe ich sie als BETA markiert. Falls ihr Fehler findet, Fragen habt oder der Meinung seid, dass noch etwas fehlt (Code, Doku, Spendenbutton), eröffnet bitte einen GitHub-Issue oder hinterlasst mir hier einen Kommentar.

In Zukunft soll das Projekt um Remote-Messstationen erweitert werden. Der Raspberry Pi dient dabei als Zentrale zur Speicherung und Visualisierung der Messdaten. Diese werden zukünftig nicht mehr nur ausschließlich vom direkt angeschlossenen SHT21-Sensor geliefert, sondern auch von weiteren Sensoren, die ihre Daten per WLAN übertragen. Sobald es etwas zu zeigen gibt, werde ich in diesem Blog darüber berichten.

Verwandte Artikel

  1. Überwachung von Temperatur und Luftfeuchtigkeit mit dem SHT21
  2. Visualisierung von Umweltdaten

Synology NAS: Einzelnen Ordner neu indizieren

Synology Diskstations stellen Anwendungen bereit, um Bilder, Musik und Videos verwalten zu können. Dies sind im einzelnen

  • die Photo Station,
  • die Audio Station und
  • die Video Station.

Damit die Medien in den jeweiligen Anwendungen angezeigt werden können, müssen diese zuvor indiziert werden. Die Indizierung erfolgt automatisch, wenn Medien über die entsprechende Anwendung hinzugefügt werden. Fügt man sie jedoch auf anderem Wege hinzu, z.B. durch rsync, startet die Medienindizierung nicht und die Medien können in der jeweiligen Anwendung nicht wiedergegeben werden.

Die Benutzeroberfläche „DSM“ bietet lediglich die Möglichkeit, ganz allgemein eine Medienindizierung zu starten. Dabei werden jedoch sämtliche Medien neu indiziert und nicht nur die neu hinzugefügten. Je nach Umfang dauert die Indizierung mehrere Stunden bis Tage. Es gibt jedoch eine Möglichkeit, die Indizierung manuell zu starten und dabei auf ein einzelnes Verzeichnis zu beschränken.

Dazu meldet man sich per SSH an der Diskstation an und führt folgendes Kommando aus:
/usr/syno/bin/synoindex -R /Pfad/zum/Verzeichnis/

Damit lässt sich eine Menge (Rechen-)Zeit sparen.

Kommentar: VMware vSphere Web Client – Welch ein Fluch

Es war einmal vor langer Zeit, als einzig und allein der vSphere Client für Windows existierte, um einen ESX-Host bzw. einen vSphere Cluster zu verwalten. Und die vSphere-Admins waren glücklich und froh.

In dieser guten und glücklichen Zeit war der einzige Wermutstropfen, dass der vSphere Client nur für Microsoft Windows existierte und man als Linux-Liebhaber darauf angewiesen war, für die Administration der vSphere-Umgebung ein anderes Betriebssystem zu booten. Doch konnte dies die Freude nicht mindern. Und alle freuten sich und waren froh.

Doch in dieser Welt des Frohsinns und der Glückseligkeit gab es einen Dämon, dem dies alles gar nicht gefiel. Und dieser Dämon beeinflusste die guten Software-Engineers bei VMware und veranlasste sie dazu, den vSphere Web Client auf Basis von Flash zu entwickeln. Dies war der Beginn von dunklen Zeiten, welche bis in die Gegenwart anhalten.

Wer den vSphere Client kennt und sich den Web-Client ansieht, fragt sich vermutlich: „Warum? Warum investiert man Zeit, um so einen Mist zu entwickeln?“

Der vSphere Web Client ist langsam, kann nichts besser als der Fat-Client, bietet keine neuen Funktionen und basiert auf Flash. Letzteres sorgt dafür, dass es für Linux weiterhin keinen nutzbaren Client gibt. Doch den Göttern sei Dank, wir konnten weiterhin den althergebrachten Fat-Client nutzen und das Flash-Gespenst links liegen lassen. Und nachdem wir uns alle von dem Schreck erholten hatten, waren wir wieder glücklich und froh.

Dies gefiel dem Dämon nicht und so lies er verkünden, dass die Entwicklung des guten etablierten vSphere Client eingestellt wird, da man sich in Zukunft auf den Web-Client konzentrieren will. Dachte man anfangs noch an einen Aprilscherz, so wurden die Zeiten nun richtig finster. Denn der vSphere Web Client war immer noch mies und unbenutzbar. Der Unmut vieler Nutzer entlädt sich seit April 2014 in diesem Thread, welcher bis in die aktuelle Zeit Updates erfährt. Denn das Grundproblem ist immer noch nicht gelöst. Der vSphere Web Client ist immer noch nicht zu gebrauchen.

Um es noch einmal zusammenzufassen, der vSphere Web Client:

  • Ist so langsam, dass ich meinen Bart wachsen höre
  • Zwingt mich Flash auf meiner Admin-Workstation zu installieren, um ihn überhaupt nutzen zu können
  • Funktioniert nicht in allen Browsern
  • Funktioniert mal in dem einen, mal in dem anderen Browser (scheint mit der Mondphase zu wechseln)
  • Benötigt für volle Funktionalität das Client Integration Plugin (CIP), welches noch bescheidener funktioniert, als der Rest des Clients

Dieser Drecks-Web-Client raubt mir den letzten Nerv. Warum beschäftige ich mich überhaupt damit? Weil Client-Probleme im Web-Client reproduziert werden müssen, damit der VMware-Support helfen kann. Dies zieht einen Service Request nicht selten in die Länge, da man mit dem Support erstmal den Web-Client zum Laufen bringen muss, bevor man das eigentliche Problem analysieren kann. Eine echte Lösung gab es für den Client nie. Ein Workaround folgte dem Nächsten.

Unter uns, die Arbeit im VMware-Support kann doch auch keinen Spaß machen, wenn man so ein Drecks-Werkzeug supporten muss. Die Aussage eines Supporters dazu: „Ich gehe groß feiern, wenn der HTML5-Client endlich fertig ist.“

Der neue vSphere Client (HTML5) verspricht Licht am Ende des Tunnels. Die Kritik am verhassten vSphere Web Client scheint VMware erreicht zu haben. Doch offensichtlich muss es erst noch einmal schlechter werden, bevor es besser werden kann. Denn mit vSphere 6.5 hat uns VMware eine Version spendiert, in der sich der ausgereifte vSphere Client nicht mehr verwenden lässt, der vSphere Web Client immer noch totaler Mist ist und der vSphere Client (HTML5) noch nicht voll funktionsfähig ist. Super. Ganz toll. Statt eines gut funktionierenden Clients gibt es jetzt einen gammeligen und einen erst teilweise fertiggestellten.

Was bleibt ist die Hoffnung, dass der HTML5-Client in der nächsten vSphere-Version voll funktionsfähig ist und ein würdiger Nachfolger des guten alten Clients wird, welchen VMware so lieblos sterben lies. Und vielleicht kommt das VMware-Marketing auf der Suche nach Innovationen dann ja auf die Idee, einen schnellen, stabilen Fat-Client zu entwickeln. Und damit sind wir Admins wieder glücklich und zufrieden, bis ans Ende unserer (Arbeits-)Tage.

TLDR;

VMware vSphere ist ein gutes Produkt. Auch im Fall von Störungen in der IT-Infrastruktur lässt einen diese Lösung nur selten im Stich. Virtuelle Maschinen werden bis zuletzt korrekt ausgeführt, während der sie umgebene Rest schon am Boden liegt.

Warum das Unternehmen die Admins über die letzten Jahre mit einem vSphere Web Client straft, der einem jeglichen Spaß an der Arbeit nimmt, wird vielleicht für immer ein Rätsel bleiben.

Hoffentlich bekommt das Unternehmen mit dem neuen vSphere Client (HTML5) endlich die Kurve. Denn die Mitbewerber haben bereits aufgeschlossen und sind einen Blick wert, wenn einem bei Nutzung der Client-Anwendung übel wird.

Nun, wo der Frust einmal raus ist, geht es mir schon besser und ich wünsche euch ein schönes und erholsames Wochenende.

Ordnung in die Fotosammlung bringen

In diesem Beitrag möchte ich festhalten, wie ich mit dem ExifTool von Phil Harvey [1] ein wenig Ordnung in meine Fotosammlung brachte.

Meine Frau und ich verwenden verschiedene Geräte wie z.B. Smartphones, Tablets und Digitalkameras, um Fotos aufzunehmen. Dabei speichern diese Geräte die aufgenommenen Bilder nach folgenden Namensmustern:

  • IMG_1234.JPG
  • IMG_<YYYYMMDD>_<hhmmss>.jpg

Die so benannten Bilder landen nach Themen sortiert in Verzeichnissen auf einem NAS. Um sie in eine chronologische Reihenfolge zu bringen, möchte ich sie einheitlich nach folgendem Muster benennen:

  • <YYYY-MM-DD>T<hhmmss>_img.jpg

Dazu lese ich das Aufnahmedatum mit dem ExifTool aus den EXIF-Daten [2] der Fotos aus und verwende dies, um die Dateien nach dem gewünschten Muster umzubenennen. Der dazu genutzt Befehl sieht wie folgt aus:

exiftool '-filename<DateTimeOriginal' -d "/Pfad/zum/Zielverzeichnis/%Y-%m-%dT%H%M%S_img%%-c.jpg" Quellverzeichnis/

Mit dem obigen Kommando werden die Dateien aus dem Quellverzeichnis wie gewünscht umbenannt und in das Zielverzeichnis verschoben. Sollte dort bereits eine Datei mit gleichem Namen existieren, wird durch die Option „%%-c“ ein Index angehängt und hochgezählt.

Falls es sich bei dem Zielverzeichnis zufällig um ein Photoalbum einer Synology Diskstation handelt, interessiert euch evtl. auch, wie man einzelne Ordner neu indizieren kann.

[1] ExifTool by Phil Harvey {en}
[2] Exchangeable Image File Format {de}
[3] EXIF metadata privacy: A picture is worth a thousand data points {en}

Zertifikatsanfrage (CSR) mit OpenSSL erstellen

Dieses Tutorial beschreibt, wie eine Zertifikatsanfrage (engl. Certificate Signing Request, kurz CSR) erstellt werden kann. Dabei wird die Erstellung von Anfragen für Zertifikate mit einem und mehreren enthaltenen Hostnamen behandelt. Die nach diesem Tutorial erstellten Zertifikatsanfragen können dann genutzt werden, um sie an eine Zertifizierungsstelle (engl. Certificate Authority, kurz CA) zu übermitteln.

Voraussetzung, um diesem Tutorial zu folgen, ist eine funktionsfähige Installation von OpenSSL. Die Installation von OpenSSL ist nicht Gegenstand dieses Tutorials.

Die folgende Tabelle gibt Auskunft über die Konfigurationen, mit denen dieses Tutorial getestet wurde.

BetriebssystemOpenSSL Version
Ubuntu 16.04 LTSOpenSSL 1.0.2g
CentOS/RHEL 7OpenSSL 1.0.2k-fips
Fedora 26OpenSSL 1.1.0f-fips

Keyfile und CSR in einem Schritt erstellen

Die Dateien für den privaten Schlüssel und den CSR können auf der Kommandozeile mit dem folgenden Befehl erstellt werden. Dabei werden die benötigten Informationen interaktiv abgefragt.

/tmp$ openssl req -newkey rsa:2048 -sha256 -keyout test.key -out test.csr
Generating a 2048 bit RSA private key
..............................................................................................+++
........................................................................................................................+++
writing new private key to 'test.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:.        
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:test.example.com
Email Address []:.

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

Die einzelnen Argumente des Befehls sind wie folgt zu erklären:

openssl req ruft das Kommando zur Generierung eines PKCS#10 CSR auf [1]. Das Argument -newkey rsa:2048 gibt an, dass ein neuer RSA-Key mit einer Schlüssellänge von 2048 Bit generiert werden soll. Dieser Schlüssel wird anschließend verwendet, um den CSR zu erzeugen. Mit dem Argument -sha256 wird angegeben, dass das beantragte Zertifikat mit dem SHA256-Algorhytmus signiert werden soll. Man beachte, dass dies von der Zertifizierungsstelle überschrieben werden kann. Mit -keyout test.key wird der Dateiname angegeben, unter dem die Private-Key-Datei (test.key) im aktuellen Verzeichnis gespeichert werden soll. Dementsprechend gibt -out test.csr an, wo die CSR-Datei (test.csr) gespeichert werden soll. Im oben dargestellten Beispiel geschieht dies ebenfalls im aktuellen Verzeichnis.

Das Kommando erzeugt den privaten Schlüssel und fragt interaktiv nach einer Passphrase, mit welcher die Private-Key-Datei verschlüsselt wird. Anschließend werden die Informationen abgefragt, welche in den CSR aufgenommen werden sollen. Mit einem „.“ gibt man an, dass der Standardwert aus den eckigen Klammern in den CSR übernommen werden soll. Auf die Angabe einer E-Mail-Adresse und eines Challenge-Passworts kann guten Gewissens verzichtet werden, da diese Angaben von den meisten Zertifizierungsstellen ignoriert werden.

CSR für mehrere Hostnamen erstellen

Um einen CSR für mehrere Hostnamen zu erstellen, bedient man sich am einfachsten einer Konfigurationsdatei. Die im Folgenden verwendete Konfigurationsdatei kann unter [2] heruntergeladen und unter einem beliebigen Namen (z.B. csr_config.cnf) gespeichert werden. Ausführliche Informationen zum Aufbau der Konfigurationsdatei finden sich in Kapitel 3.3 des unter [2] verlinkten TLS-Kochbuchs. Beachten Sie, dass hinter dem Parameter subjectAltName neben den weiteren Host-/Domain-Namen auch der commonName mit aufgeführt werden muss.

[ req ]
default_bits = 2048
default_keyfile = test_privatekey.pem
distinguished_name = req_distinguished_name
encrypt_key = no
prompt = no
string_mask = nombstr
req_extensions = v3_req

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = DNS:test.example.com, DNS:*.test.example.com

[ req_distinguished_name ]
countryName = DE
stateOrProvinceName = Nordrhein-Westfalen
localityName = MeinOrt
0.organizationName = MeineFirma
organizationalUnitName = MeineAbteilung
commonName = test.example.com

Die obige Konfigurationsdatei kann nun genutzt werden, um einen CSR für den Hostnamen test.example.com und alle möglichen Hostnamen unterhalb der Domain .test.example.com zu erstellen:

/tmp$ openssl req -batch -sha256 -new -config csr_config.cnf -out test2.csr

Mit der Option -batch wird der interaktive Modus deaktiviert. Die Option -new gibt an, dass ein neuer CSR generiert werden soll. Dabei wird ein Private-Key nach den Vorgaben in der Konfigurationsdatei, welche mit -config csr_config.cnf angegeben wird, erzeugt.

Abschließende Bemerkungen

Die beiden gezeigten Methoden zur Erzeugung einer Zertifikatsanfrage stellen nur einen kleinen Ausschnitt aus dem großen Werkzeugkasten namens OpenSSL dar. Doch sind sie dazu geeignet, in einfacher Weise einen CSR zu erstellen, den man zur Signatur an eine CA seines Vertrauens senden kann.

  1. PKCS #10: Certification Request Syntax Specification
  2. TLS/SSL-Kochbuch – Rezepte für die Verwendung von OpenSSL

Über Pinning (HPKP), CAA und Certificate Transparency

In der Vergangenheit habe ich mich auf diesem Blog bereits in verschiedenen Artikeln mit dem Thema Certificate Pinning befasst [vgl. 1-3]. Im vorliegenden Artikel möchte ich noch einmal kurz in Erinnerung rufen, worum es beim Pinning geht. Darüber hinaus finden Sie hier eine kurze Einführung in DNS Certification Authority Authorization (CAA) Resource Records (RFC 6844) [4] und Certificate Transparency (RFC 6962) [5].

Anschließend werden die vorgestellten Verfahren gegenübergestellt und hinsichtlich ihres Nutzens für einen „Subscriber“ und eine „Relying Party“ beurteilt.

Terminologie

Für das Verständnis des Artikels wichtige Begriffe werden in diesem Abschnitt definiert.

Subscriber stellt eine Entität dar, welche einen gesicherten Service anbieten möchte und hierfür ein Zertifikat benötigt.

Die Relying Party bezeichnet z.B. Webbrowser oder andere Programme, welche Zertifikate nutzen und versuchen, deren Echtheit zu validieren. Dies geschieht mit Hilfe von sogenannten trust anchors, also Zertifikaten, denen ultimativ vertraut wird und die in den Webbrowsern gespeichert sind.

Certificate Pinning (HPKP)

Update Februar 2020: HPKP existiert praktisch nicht mehr! Wie im Blog von Scott Helme vom 20.01.2020 nachzulesen ist, wurde die Unterstützung für HPKP [7] aus Firefox 72 entfernt. Damit wird HPKP von keinem aktuellen Browser mehr unterstützt und ist praktisch tot.

Ich lasse diesen Abschnitt zum Gedenken an diesen Mechanismus stehen. Die ebenfalls in diesem Artikel beschriebenen Verfahren CAA und Certificate Transparency gewinnen hingegen durch den Wegfall von HPKP weiter an Bedeutung.

Certificate Pinning wurde im RFC 7469 [7] spezifiziert. Es handelt sich dabei um einen Mechanismus, bestimmte Eigenschaften eines Zertifikats festzunageln. Der Browser erhält dabei mit dem Zertifikat zusätzliche Informationen, mit denen er die Authentizität des Zertifikats überprüfen kann.

In der Praxis wird dem Browser ein Hash-Wert übermittelt, welcher über den öffentlichen Schlüssel des Zertifikats gebildet wurde. Dieser Hash-Wert wird in einem HTTP-Header-Feld an den Browser übertragen und von diesem gespeichert. Wie dieses Verfahren genau funktioniert, beschreibt der RFC 7469 ab Abschnitt 2.1.1. Da nur der Dienstbetreiber über den dazugehörigen privaten Schlüssel verfügt, ist ein Missbrauch durch Dritte ausgeschlossen. Übermittelt nun nämlich ein Angreifer bei einem MITM-Angriff den zu seinem Zertifikat gehörenden öffentlichen Schlüssel, kann der Browser mit Hilfe des PINs erkennen, dass dieser Schlüssel nicht dem Dienstbetreiber gehört und den Angriff damit auffliegen lassen.

Dem Subscriber steht mit dem Certificate Pinning ein wirksamer Mechanismus zur Verfügung, mit dem sich das Risiko, Opfer eines MITM-Angriffs zu werden, deutlich reduzieren lässt. Gleichzeitig ist die Implementierung von Pinning in eigene Projekte nicht trivial und das Risiko, den eigenen Internetauftritt durch Fehlkonfiguration für Besucher unerreichbar zu machen, entsprechend hoch (vgl. [1], [2], [6] und [7]).

Certification Authority Authorization (CAA)

CAA wurde Anfang 2013 im RFC 6844 spezifiziert. Es handelt sich dabei um einen DNS Ressource Record, mit dem ein Domain-Inhaber festlegen kann, welche Zertifizierungsstellen (CA) für seine Domain Zertifikate ausstellen dürfen [4].

Eine gute Einführung in deutscher Sprache findet sich im DFN-PKI Blog in den Artikeln unter [8] und [9].

Die Zertifizierungsstellen wurden vom CA/Browser-Forum im Ballot 187 [10] verpflichtet, spätestens ab September 2017 die CAA Resource Records auszuwerten und zu beachten.

Certificate Transparency (CT)

Laut Abstract des RFC 6962 [5] handelt es sich bei Certificate Transparency um ein experimentelles Protokoll zur Buchführung über ausgestellte TLS-Zertifikate.

Die Idee besteht im Wesentlichen darin, dass Zertifizierungsstellen (CA) ausgestellte Zertifikate in ein öffentliches (mutmaßlich revisionssicheres) Log eintragen. Das Ziel ist, Transparenz bei der Ausstellung von TLS-Zertifikaten herzustellen. So soll jeder Klient einsehen können, für welche Domains Zertifikate ausgestellt wurden und welche Zertifizierungsstellen diese ausgestellt haben.

Durch Überwachung dieser Certificate Transparency Logs können Domain-Inhaber (Subscriber) feststellen, ob TLS-Zertifikate für ihre Domains ausgestellt wurden, ohne dass die Ausstellung von ihnen autorisiert wurde. In diesem Fall können sie Schritte einleiten, um diese Zertifikate widerrufen zu lassen. Für den Widerruf muss auf bestehende Verfahren zurückgegriffen werden, da der Zertifikatswiderruf explizit kein Bestandteil des aktuellen Entwurfs ist.

Wie stehen diese Verfahren zueinander?

Im Kern haben alle drei Verfahren zum Ziel, die größte Schwachstelle der Internet-PKI abzudichten. Nämlich das Problem, dass jede CA Zertifikate für jede beliebige Domain ausstellen darf und eine Relying Party bisher nur schwer erkennen konnte, ob ein vertrauenswürdiges Zertifikat tatsächlich mit Autorisierung des Domain-Inhabers ausgestellt wurde. Dabei verfolgen die drei Verfahren unterschiedliche Ansätze.

Das Certificate Pinning kann vom Subscriber selbst implementiert werden. Er stellt der Relying Party damit Informationen zur Verfügung, mit denen diese überprüfen kann, ob das gültige Zertifikat tatsächlich vom Subscriber bzw. einer von ihm autorisierten CA stammt. Liefert die Validierung eines PINs ein negatives Ergebnis, wird ein Zugriff auf die entsprechende Webseite durch den Webbrowser verweigert. Pinning stellt für den Subscriber ein wirksames Mittel dar, um das Risiko von Zertifikatsmissbrauch zu reduzieren.

Doch wo Licht ist, ist auch Schatten. Die Implementierung von Certificate Pinning ist komplex [1] und führt bei kleinsten Fehlern bereits zur Nichterreichbarkeit der eigenen Domain. Die Komplexität und das Risiko, die eigene Domain unerreichbar zu machen, sind Gründe, warum das Pinning bisher nur eine sehr geringe Verbreitung erfahren hat. Und damit nicht genug. Kaum in der Welt, wird bereits über den Abschied vom HTTP Public Key Pinning diskutiert (vgl. [12] und [13]) und von einem großen Browserhersteller sogar das Ende der Unterstützung eingeläutet (siehe [14] und [15]).

CAA bietet dem Subscriber bzw. Domain-Inhaber über DNS-Einträge die Möglichkeit, CAs zur Ausstellung von Zertifikaten zu autorisieren. Dieser Schutz wirkt passiv, da er darauf basiert, dass sich die CAs an die Verpflichtung aus [10] halten. Schert sich eine CA nicht um diese Verpflichtung, wird durch staatliche Stellen zur Ausstellung von Zertifikaten gezwungen oder durch Einbruch kompromittiert [6, Abschnitt 2.5], können weiterhin Zertifikate ausgestellt werden, denen die Relying Party vertraut. Da eine Nutzung von CAA durch die Relying Party zum Zweck der Zertifikatsvalidierung explizit ausgeschlossen ist [8]. Auch der Subscriber muss sich auf die Selbstverpflichtung der CAs verlassen; kann er doch nicht prüfen, ob eine CA ein Zertifikat ohne seine Autorisierung ausgestellt hat.

Wer sich nun fragt, warum sich eine CA an CAA gebunden fühlen sollte, dem sei gesagt, dass bei einem Verstoß gegen CAA die Entfernung der eigenen Root CA aus dem trust anchor der Relying Party droht. So sollte es im eigenen Interesse einer CA liegen, CAA Records gewissenhaft auszuwerten und sich möglichst keine Fehler zu erlauben.

Certificate Transparency bietet einem Subscriber die Möglichkeit, durch Überwachung der CT Logs zu erkennen, ob TLS-Zertifikate ohne Autorisierung des Subscribers ausgestellt wurden. Dies setzt natürlich voraus, dass die ausstellende CA diese Zertifikate auch in einem CT Log einträgt. Doch welche Motivation hat eine CA, dies zu tun? Wenn die Browser (Relying Party) mit der größten Verbreitung zukünftig nur noch Zertifikate als vertrauenswürdig einstufen, welche in einem CT Log aufzufinden sind, wäre dies sicherlich eine Motivation. So könnten die großen Browserhersteller dieser Welt mit ihrer Marktmacht doch eine Transparenz erzwingen.

Mein persönliches Fazit

Als das Public Key Pinning das Licht der Welt erblickte, war ich von dessen Möglichkeiten begeistert und habe es auch selbst in verschiedenen Umgebungen eingesetzt (siehe [1] und [6]). Dabei habe ich erkannt, dass der Einsatz mit hohen Risiken verbunden ist und man sich sehr viele Gedanken über mögliche Auswirkungen in der Zukunft machen muss. Aktuell setze ich in meinen Projekten auf Grund der Risiken kein Pinning mehr ein. Googles Ankündigung, die Unterstützung aus dem Chrome Browser zu entfernen, klingt wie ein Todesstoß für dieses Verfahren. Es bleibt abzuwarten, ob Mozilla mit dem Firefox nachzieht oder das Pinning als Abgrenzungsmerkmal weiter unterstützt.

Insgesamt würde ich mich freuen, wenn man HPKP doch noch retten kann. Denn im Gegensatz zu CAA und CT stellt es für mich die effizienteste und wirksamste Technik dar, um mich selbst und meine Nutzer vor Zertifikatsbetrug schützen zu können. Dies sage ich, ohne CAA und CT damit abwerten zu wollen. Auch diese beiden Verfahren tragen dazu bei, die Schwachstelle im Design der Internet-PKI zu verkleinern und sie können gerade in Kombination dazu beitragen, das Potenzial für Zertifikatsmissbrauch deutlich zu reduzieren.

Quellen und weiterführende Links

  1. Certificate Pinning mit NGINX
  2. Pinning-Test im Firefox bei lokaler Root-CA erzwingen
  3. Mein TLS/SSL-Kochbuch
  4. DNS Certification Authority Authorization (CAA) Resource Record – RFC 6844 {en}
  5. Certificate Transparency – RFC 6962 {en}
  6. TLS-Kochbuch – Rezepte für die Verwendung von OpenSSL, HTTP Strict Transport Security (HSTS) und HTTP Public Key Pinning (HPKP)
  7. Public Key Pinning Extension for HTTP – RFC 7469 {en}
  8. RFC 6844 Certification Authority Authound Folgenrization (CAA)
  9. CAA RRs – Reihenfolge im DNS
  10. Ballot 187 – Make CAA Checking Mandatory {en}
  11. http://www.certificate-transparency.org/ {en}
  12. Ivan Ristic Is HTTP Public Key Pinning Dead? {en}
  13. Scott Helme: I’m giving up on HPKP {en}
  14. Scott Helme: The death knell for HPKP? {en}
  15. heise Security: HTTPS-Verschlüsselung: Google verabschiedet sich vom Pinning

Vorträge 2017 auf der OpenRheinRuhr und dem LinuxDay in Vorarlberg

Nicht ganz uneigennützig möchte ich mit diesem Beitrag auf zwei Veranstaltungen zu den Themen Open Source, Freie Software und Linux in diesem Jahr hinweisen. Beide Veranstaltungen haben gemeinsam, dass ich auf ihnen mit verschiedenen Vorträgen vor Ort bin.

OpenRheinRuhr 2017

Bereits kommende Woche findet vom 4.-5. November die OpenRheinRuhr im Rheinischen Industriemuseum in Oberhausen statt.

Ich selbst bin dieses Jahr zum ersten Mal auf der OpenRheinRuhr zu Gast und freue mich bereits auf spannende Themen und darauf, das ein oder andere vertraute Gesicht wiederzusehen. Von mir gibt es als Beitrag zur diesjährigen Veranstaltung am 4. November um 17 Uhr eine Einführung und kritische Betrachtung von Ansible.

LinuxDay in Vorarlberg

Am 2. Dezember diesen Jahres bin ich dann beim LinuxDay in Vorarlberg (Österreich) zu Gast. Die Veranstaltung legt den inhaltlichen Schwerpunkt dieses Jahr auf die Themen Privatsphäre und Sicherheit. Dazu gibt es um 15 Uhr mit meinem Vortrag „Webseiten mit HTTPS bereitstellen und mit HSTS und HPKP sichern“ einen Einblick in die Welt der Internet-PKI, ihrer Schwachstellen und zwei ausgewählte Methoden, um die Angriffsfläche zu verkleinern.

Der Vortrag ist ein Auszug aus meinem TLS-Kochbuch, welches unter dem angegebenen Link kostenlos zum Download zur Verfügung steht.

Ich freue mich bereits darauf, unsere Nachbarn im Süden zu besuchen, sowie altbekannte und neue Mitglieder der Gemeinschaft kennenzulernen.
LinuxDay 2017 am 2. Dez in Dornbirn