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:
- Generierung eines sicheren Passworts
- Anpassung der Konfigurationsdatei
- Erstellung des Zertifikats und des privaten Schlüssels
- Konvertierung in verschiedene Formate (PFX, PEM, CER)
- Verschlüsselung und sichere Speicherung des Passworts
- 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.