Apache NiFi automatisierte SSL-Zertifikatsgenerierung

Sichere Apache NiFi-Umgebung mit SSL-Zertifikaten: Eine Anleitung zur automatisierten Einrichtung

In der heutigen digitalen Landschaft ist Sicherheit von höchster Bedeutung, insbesondere wenn es um Datenverarbeitungsplattformen wie Apache NiFi geht. Seit Version 1.14.0 kann NiFi nur noch über HTTPS gestartet werden, was die Notwendigkeit einer sicheren Konfiguration unterstreicht. In diesem Blogbeitrag möchten wir Ihnen eine einfache, aber effektive Methode zur Einrichtung einer SSL-gesicherten NiFi-Umgebung vorstellen.

Warum SSL-Zertifikate?

Während für den grundlegenden Zugriff auf NiFi die üblichen Login-Credentials ausreichen, wird die Situation komplexer, sobald Sie zusätzliche Dienste wie verteilte NiFi-Knoten, NiFi Registry, Apache Solr oder Elasticsearch einbinden möchten. In solchen Szenarien reicht ein Single-User-Login nicht mehr aus. Die Verwendung von SSL-Zertifikaten bietet hier eine robuste und flexible Lösung.

Unser Ansatz: Automatisierte Zertifikatserstellung

Um den Prozess der Zertifikatserstellung zu vereinfachen, haben wir Skripte entwickelt, die sowohl Client- als auch Server-Zertifikate automatisch generieren. Diese Skripte nutzen OpenSSL und vorkonfigurierte .cnf-Dateien, um den gesamten Vorgang zu automatisieren.

Konfigurationsdateien

Zunächst benötigen wir zwei Konfigurationsdateien: eine für den Server und eine für den Client. Hier sind die Inhalte dieser Dateien:

1. Server-Konfiguration (server.cnf):

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
CN={SERVICE_NAME}
O=SHI GmbH
OU=NiFi
L=A
ST=BY
C=DE
[v3_req]
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1

2. Client-Konfiguration (client.cnf):

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C=DE
ST=BY
L=A
OU=Consulting
O=SHI GmbH
CN={CLIENT_NAME}
[v3_req]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth

Skripte zur Zertifikatserstellung

Nun kommen wir zu den Skripten, die die eigentliche Arbeit erledigen. Wir haben zwei separate Skripte: eines für die Erstellung des Client-Zertifikats und eines für das Server-Zertifikat.

1. Skript zur Erstellung des Client-Zertifikats:

bash
#!/bin/bash
local password_file=raphael_hoffmann_client_password.enc
local key_file=raphael_hoffmann_client_password_key.bin
password=$(openssl rand -base64 55 | tr -dc 'a-zA-Z0-9!@#^()[]{};:,+?_&' | head -c 32)
sed "s/{CLIENT_NAME}/raphael_hoffmann_client/" client.cnf > raphael_hoffmann_client.cnf
openssl req -x509 -newkey rsa:2048 -keyout raphael_hoffmann_client.key -out raphael_hoffmann_client.crt -days 365 -nodes -config raphael_hoffmann_client.cnf -batch
openssl pkcs12 -export -in raphael_hoffmann_client.crt -inkey raphael_hoffmann_client.key -out raphael_hoffmann_client.pfx -passout "pass:${password}"
openssl pkcs12 -in raphael_hoffmann_client.pfx -clcerts -nokeys -out raphael_hoffmann_client.pem -passin "pass:${password}"
openssl x509 -in raphael_hoffmann_client.pem -out raphael_hoffmann_client.cer -inform PEM -outform DER
encryption_key=$(openssl rand -hex 32)
echo -n "$password" | openssl enc -aes-256-cbc -salt -pbkdf2 -out "$password_file" -pass "pass:$encryption_key"
echo "$encryption_key" > "$key_file"
find . -maxdepth 1 -type f -name "raphael_hoffmann_client*" -exec mv {} raphael_hoffmann_client \;
echo "Client certificate created for raphael_hoffmann_client"
echo "Certificates copied to raphael_hoffmann_client"

2. Skript zur Erstellung des Server-Zertifikats:

bash
#!/bin/bash
password_file=nifi_service_password.enc
key_file=nifi_service_key.bin
service_password=$(openssl rand -base64 55 | tr -dc 'a-zA-Z0-9!@#^()[]{};:,+?_&' | head -c 32)
sed "s/{SERVICE_NAME}/nifi_service/" server.cnf > nifi_service.cnf"

Generate the key and CSR

openssl req -newkey rsa:2048 -passout "pass:$service_password" -keyout nifi_service-key.pem -out nifi_service.csr -config nifi_service.cnf -batch

Generate the self-signed certificate

openssl x509 -req -in nifi_service.csr -passin "pass:$service_password" -signkey nifi_service-key.pem -out nifi_service-cert.pem -days 365 -sha512 -extfile nifi_service.cnf -extensions v3_req

Create the PKCS12 keystore

openssl pkcs12 -export -out nifi_service_keystore.p12 -inkey nifi_service-key.pem -in nifi_service-cert.pem -name nifi_service-key -passout "pass:$service_password" -passin "pass:$service_password"
openssl x509 -in nifi_service-cert.pem -out nifi_service.cer -inform PEM -outform DER
service_encryption_key=$(openssl rand -hex 32)
echo -n "$service_password" | openssl enc -aes-256-cbc -salt -pbkdf2 -out "$password_file" -pass "pass:$service_encryption_key"
echo "$service_encryption_key" > "$key_file"
find . -maxdepth 1 -type f -name nifi_service* -exec mv {} nifi_service \;
cp -p nifi_service/* nifi_service
echo "Server certificate created for nifi_service"
echo "Certificates copied to nifi_service"

Funktionsweise der Skripte

Beide Skripte folgen einem ähnlichen Ablauf:

  1. Generierung eines sicheren Passworts
  2. Anpassung der Konfigurationsdatei
  3. Erstellung des Zertifikats und des privaten Schlüssels
  4. Konvertierung in verschiedene Formate (PFX, PEM, CER)
  5. Verschlüsselung und sichere Speicherung des Passworts
  6. Organisieren der erstellten Dateien in einem separaten Ordner

Vorteile unseres Ansatzes:

  • Effizienz: Der gesamte Prozess läuft automatisiert ab, was Zeit spart und menschliche Fehler minimiert.
  • Sicherheit: Durch die Verwendung starker Verschlüsselung und sicherer Passwörter wird ein hohes Sicherheitsniveau gewährleistet.
  • Flexibilität: Die Skripte können leicht angepasst werden, um mehrere Benutzer oder Services zu unterstützen.

Praktische Anwendung

Nach der Ausführung der Skripte finden Sie alle notwendigen Dateien in den entsprechenden Ordnern:

  • Die .cer-Datei kann direkt in einen Truststore importiert werden.
  • Die .pfx-Datei kann auf Windows-Systemen per Doppelklick dem System hinzugefügt werden, was die Nutzung des Zertifikats im Browser ermöglicht.

Beachten Sie, dass das Passwort für die Zertifikate verschlüsselt gespeichert wird. Um es zu entschlüsseln, verwenden Sie den folgenden Befehl:

bash
openssl enc -d -aes-256-cbc -pbkdf2 -in [Passwortdatei].enc

Anpassung und Erweiterung

Diese Skripte sind zu etwa 90% direkt als Shell-Skripte verwendbar. Mit ein wenig Anpassung und Variabilisierung können sie leicht für mehrere Nutzer oder Services im Bulk genutzt werden. Die resultierenden Dateien in den Zielordnern können direkt verwendet werden, um beispielsweise die .cer-Datei in einen Truststore zu importieren oder die .pfx-Datei auf einem Windows-System zu installieren.

Fazit

Mit diesem automatisierten Ansatz zur Erstellung von SSL-Zertifikaten wird die Einrichtung einer sicheren NiFi-Umgebung erheblich vereinfacht. Es ermöglicht Ihnen, schnell und effizient eine robuste Sicherheitsinfrastruktur aufzubauen, die den Anforderungen moderner, verteilter Systeme gerecht wird.

Wir hoffen, dass diese detaillierte Anleitung Ihnen bei der Implementierung einer sicheren NiFi-Umgebung hilft. Die bereitgestellten Skripte und Konfigurationsdateien bieten eine solide Grundlage, die Sie nach Bedarf anpassen und erweitern können. Bei Fragen oder Anmerkungen stehen wir Ihnen gerne zur Verfügung.

Sie haben Fragen zu Apache NiFi? Nehmen Sie Kontakt mit uns auf!
Raphael Hoffmann

Raphael Hoffmann

…kann Ihnen alle Fragen zu Mensch-Computer-Systemen beantworten – Denn diesem Themenschwerpunkt widmete er sich während seines Informatikstudiums in Würzburg. 2014 begann er seine Karriere als Softwareentwickler bei iTiZZiMO GmbH. Seit 2018 arbeitet er als Consultant bei SHI GmbH im Bereich Search & Analytics an den innovativen Use Cases unserer Kunden. Erkenntnisse aus seiner täglichen Arbeit, teilt er hier mit den SHI-Blog-Lesern. Lieblings-Dateiformat: mp3, txt